你就是个水题~
这个题如果理清思路其实特别好做,我们仔细想想,是不是如果一个人后面没有比他更大的另一个队伍的人那么他一定就活下来了吧
那么其实我们要做的就是从后往前维护2个最大值(两个队伍的最大值),那要做的就是如何把这些ci给他优美的加上
首先考虑暴力,每次把前面ci个数加上一。时间复杂度是n2。不够优秀,我们可以想到的使用一个差分数组,每次先记录下来区间的更新情况,最后扫一遍线性就出来了。
#include<bits/stdc++.h> using namespace std; int a[50010],b[50010],d[50010]; int n,m; int main() { int t; cin>>t; while(t--) { memset(d,0,sizeof(d)); int cnt=0; vector<int> c; cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]>>b[i]; while(m--){ int x; cin>>x; d[1]++; d[x+1]--; } for(int i=1;i<=n;i++ ) d[i]=d[i-1]+d[i],b[i]+=d[i]; int ma0=-1,ma1=-1; for(int i=n;i>=1;i--) { if(a[i]==0){ ma0=max(ma0,b[i]); } else{ ma1=max(ma1,b[i]); } if(a[i]==0&&b[i]>=ma1) cnt++; if(a[i]==1&&b[i]>=ma0) cnt++; } cout<<cnt<<endl; } return 0; }