中南林业科技大学第十一届程序设计大赛(H、J)
H | 渴望力量吗 |
二分
#include <bits/stdc++.h> using namespace std; const int N=300000+10; vector<int>edge[N]; bool vis[N]; int main() { int n,x; while(~scanf("%d",&n)) { for(int i=0;i<N;i++) edge[i].clear(); for(int i=1;i<=n;i++) { vis[i]=false; scanf("%d",&x); edge[x].push_back(i); } int q; scanf("%d",&q); while(q--) { int l,r,k; scanf("%d%d%d",&l,&r,&k); if(edge[k].size()==0) { printf("0\n"); continue; } if(!vis[k]) { edge[k].push_back(n+1); edge[k].push_back(0); vis[k]=true; } int L=lower_bound(edge[k].begin(),edge[k].end(),l)-edge[k].begin(); int R=upper_bound(edge[k].begin(),edge[k].end(),r)-edge[k].begin()-1; printf("%d\n",max(0,R-L+1)); } } return 0; }
J | are you ok? |
题解: 线段树;但因为每次更新都是加一,也可以维护区间最值,二分
代码如下:
线段树:
#include <bits/stdc++.h> using namespace std; const int N=1e6+10; int maxx[N<<2],a[N]; void push_up(int rt) { maxx[rt]=max(maxx[rt<<1],maxx[rt<<1|1]); } int n; void build(int l,int r,int rt) { if(l==r) { scanf("%d",&a[l]); maxx[rt] = a[l]; return; } int mid = (l+r)>>1; build(l,mid,rt<<1); build(mid+1,r,rt<<1|1); push_up(rt); } void update(int l,int r,int rt,int p,int y) { if(l==r) { a[l]+=y; maxx[rt] = max(maxx[rt],a[l]); return ; } int mid = (l+r)>>1; if(p <= mid) update(l,mid,rt<<1,p,y); else update(mid+1,r,rt<<1|1,p,y); push_up(rt); } int query(int l,int r,int rt,int p) { if(l==r) return l; int mid = (l+r)>>1; if(maxx[rt<<1]>=p) return query(l,mid,rt<<1,p); return query(mid+1,r,rt<<1|1,p); } int main() { int q; while(~scanf("%d%d",&n,&q)) { build(1,n,1); while(q--) { int k; scanf("%d",&k); if(k>maxx[1]) puts("are you ok"); else { int ind = query(1,n,1,k); printf("%d\n",ind-1); if(ind>1) update(1,n,1,ind-1,1); } } } return 0; }
二分:
#include<bits/stdc++.h> using namespace std; const int N=1e6+7; int maxx[N],a[N]; int main() { int n,q; while(~scanf("%d%d",&n,&q)) { for(int i=0;i<n;i++) scanf("%d",a+i); maxx[0]=a[0]; for(int i=1;i<n;i++) maxx[i]=max(maxx[i-1],a[i]); while(q--) { int k; scanf("%d",&k); int ind=lower_bound(maxx,maxx+n,k)-maxx; if(ind>0&&ind<n) { a[ind-1]++; maxx[ind-1]=max(maxx[ind-1],a[ind-1]); } if(ind<n) printf("%d\n",ind); else puts("are you ok"); } } return 0; }