变化的区间树状数组,单点查询
hdu 1556 Color the ball
要想区间改动的话,那么节点就必须往上更新,查询时往上累加。(区间改动。单点查询)
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int maxn=100000+5; int C[maxn]; int n; int lowbit(int x) { return (-x)&x; } void update(int x,int y) { for(int i=x; i>0;i-=lowbit(i)) C[i]+=y; } int query(int x) { int s=0; for(int k=x; k<=n; k+=lowbit(k)) s+=C[k]; return s; } int main() { int a,b; while(cin>>n) { for(int i=1; i<=n; i++) C[i]=0; for(int h=0;h<n;h++) { scanf("%d%d",&a,&b); update(b,1); update(a-1,-1); } for(int j=1;j<=n;j++) if(j==n) printf("%d\n",query(j)); else printf("%d ",query(j)); //printf("%d%c",query(i),i==n?'\n':' '); } return 0; }
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; const int N = 1e5+10; int c[N],m,n,k,a[N]; int x[N],y[N]; int lowbit(int k) { return k&(-k); } void add(int k,int he) { while(k>0) { c[k]+=he; k-=lowbit(k); } } int Q(int k) { int query=0; while(k<=n) { query+=c[k]; k+=lowbit(k); } return query; } int main() { #ifndef ONLINE_JUDGE freopen("in.cpp","r",stdin); #endif // ONLINE_JUDGE int t,from,to,he,kkk=1; while(~scanf("%d%d%d",&n,&m,&k)) { memset(c,0,sizeof(c)); for(int i=0;i<n;i++) scanf("%d",&a[i]); sort(a,a+n); int cur=1; int s,t; for(int i=1;i<=m;i++) { scanf("%d %d",&s,&t); int from=upper_bound(a,a+n,cur)-a; int to=upper_bound(a,a+n,s)-a; add(from,-1); add(to,+1); cur=t; } int ans =0 ; for(int i=1;i<=n;i++) { int kk =Q(i); if(kk>=k) ans = ans+1; } printf("Case %d: %d\n",kkk++,ans); } return 0; }
相关题: hdu A Simple Problem with Integers
版权声明:本文博主原创文章。博客,未经同意不得转载。