hdu 3577Fast Arrangement
View Code
1 #include<stdio.h> 2 #define Maxn 1000010 3 int a[Maxn],b[Maxn]; 4 struct Node 5 { 6 int l,r; 7 int sum;//子树最大覆盖 8 int ant;//本身被覆盖 9 }node[4*Maxn]; 10 int max(int a,int b) 11 { 12 13 14 15 return a=a>b?a:b; 16 17 } 18 void create_tree(int ll,int rr,int u) 19 { 20 21 node[u].l=ll; 22 node[u].r=rr; 23 node[u].sum=0; 24 node[u].ant=0; 25 if(ll==rr) return; 26 int mid=(ll+rr)/2; 27 create_tree(ll,mid,2*u); 28 create_tree(mid+1,rr,u*2+1); 29 } 30 31 void update(int s,int e,int u) 32 { 33 34 if(s<=node[u].l&&e>=node[u].r) 35 { 36 node[u].sum++; 37 node[u].ant++; 38 return; 39 40 } 41 int mid=(node[u].l+node[u].r)/2; 42 if(e<=mid) 43 { 44 update(s,e,u*2); 45 node[u].sum=max(node[u*2].sum,node[u*2+1].sum)+node[u].ant; 46 47 48 } 49 else if(s>mid) 50 { 51 update(s,e,u*2+1); 52 node[u].sum=max(node[u*2].sum,node[u*2+1].sum)+node[u].ant; 53 } 54 else 55 { 56 update(s,e,u*2); 57 update(s,e,u*2+1); 58 node[u].sum=max(node[u*2].sum,node[u*2+1].sum)+node[u].ant; 59 } 60 61 62 } 63 64 int query(int s,int e,int u) 65 { 66 67 if(s<=node[u].l&&e>=node[u].r) 68 return node[u].sum; 69 70 int mid=(node[u].l+node[u].r)/2; 71 if(e<=mid) 72 { 73 return node[u].ant+query(s,e,u*2); 74 75 } 76 else if(s>mid) 77 { 78 return node[u].ant+query(s,e,u*2+1); 79 } 80 else return node[u].ant+max(query(s,e,u*2),query(s,e,u*2+1)); 81 } 82 83 int main() 84 { 85 int t; 86 int k,n; 87 88 scanf("%d",&t); 89 for(int i=1;i<=t;i++) 90 { 91 92 93 scanf("%d%d",&k,&n); 94 create_tree(1,Maxn,1); 95 for(int j=1;j<=n;j++) 96 { 97 scanf("%d%d",&a[j],&b[j]); 98 b[j]--; 99 } 100 printf("Case %d:\n",i); 101 for(int j=1;j<=n;j++) 102 { 103 if(query(a[j],b[j],1)<k) 104 { 105 printf("%d ",j); 106 update(a[j],b[j],1); 107 } 108 109 } 110 printf("\n\n"); 111 112 } 113 }