牛客 糖糖别胡说,我真的不是签到题目(思维+差分)
首先如果一个糖糖被消灭,那么一定是后面的不同组的糖糖的最大值比他要大
因此我们只需要倒着求最大值就行了
问题是发功的解法,发功其实就是给1-ci的数加上1,因此只要先把发功的影响算出来,加到原数组上就可以
因为比如在3处发功,1-3都会+1,所以对相对关系没有影响。只有在3前面的发功才会对3和1的关系产生影响,所以只需要求出最终答案后比大小即可。
#include<bits/stdc++.h> using namespace std; const int N=1e5+10; int a[N],b[N]; int s[N]; int main(){ int t; ios::sync_with_stdio(false); cin>>t; while(t--){ memset(s,0,sizeof s); int n,m; cin>>n>>m; int i; for(i=1;i<=n;i++){ cin>>a[i]>>b[i]; } for(i=1;i<=m;i++){ int x; cin>>x; s[1]+=1; s[x+1]-=1; } for(i=1;i<=n;i++) s[i]+=s[i-1]; for(i=1;i<=n;i++) b[i]+=s[i]; int max1=0,max2=0; if(a[n]==1) max1=b[n]; else max2=b[n]; int res=0; for(i=n-1;i>=1;i--){ if(a[i]==1){ if(b[i]<max2) res++; max1=max(max1,b[i]); } else{ if(b[i]<max1) res++; max2=max(max2,b[i]); } } cout<<n-res<<endl; } }
没有人不辛苦,只有人不喊疼