洛谷 P1047 校门外的树
#include<iostream> #include<cstring> #include<cstdio> #define N 40000 struct node{int le,ri,s;}t[N]; bool vis[N]; void build(int le,int ri,int k) { int mid=(le+ri)>>1; t[k].le=le,t[k].ri=ri,t[k].s=0; if(le==ri){t[k].s=1;return ;} build(le,mid,k*2);build(mid+1,ri,k*2+1); t[k].s=t[2*k].s+t[2*k+1].s; } void update(int le,int ri,int k) { int mid=(t[k].le+t[k].ri)>>1; if(t[k].le==t[k].ri){t[k].s--;vis[k]=1;return;} if(ri<=mid&&!vis[2*k])update(le,ri,2*k); else if(le>mid&&!vis[2*k+1])update(le,ri,2*k+1); else { if(!vis[2*k]&&le<=mid)update(le,mid,2*k); if(!vis[2*k+1]&&ri>mid)update(mid+1,ri,2*k+1); } t[k].s=t[2*k].s+t[2*k+1].s; if(t[k].s==0)vis[k]=1; } int n,m,le,ri; int main() { memset(vis,0,sizeof(vis)); scanf("%d%d",&n,&m); build(0,n,1);//是从0开始的 for(int i=1;i<=m;i++) { scanf("%d%d",&le,&ri); update(le,ri,1); } printf("%d ",t[1].s); return 0; }
codevs 1191 数轴染色
#include<cstdio> #include<cstring> #define N 800000 struct node{int le,ri,s;}t[N]; bool vis[N]; void build(int le,int ri,int k) { int mid=(le+ri)>>1; t[k].le=le,t[k].ri=ri,t[k].s=0; if(le==ri){t[k].s=1;return;} build(le,mid,k*2);build(mid+1,ri,k*2+1); t[k].s=t[2*k].s+t[2*k+1].s; } void update(int le,int ri,int k) { int mid=(t[k].le+t[k].ri)>>1; if(t[k].le==t[k].ri){t[k].s--;vis[k]=1;return;} if(ri<=mid&&!vis[2*k])update(le,ri,2*k); else if(le>mid&&!vis[2*k+1])update(le,ri,2*k+1); else { if(!vis[2*k]&&le<=mid)update(le,mid,2*k); if(!vis[2*k+1]&&ri>mid)update(mid+1,ri,2*k+1); } t[k].s=t[2*k].s+t[2*k+1].s; if(t[k].s==0)vis[k]=1; } int n,m,le,ri; int main() { memset(vis,0,sizeof(vis)); scanf("%d%d",&n,&m); build(1,n,1); for(int i=1;i<=m;i++) { scanf("%d%d",&le,&ri); update(le,ri,1); printf("%d ",t[1].s); } return 0; }