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 }

 

转载于:https://www.cnblogs.com/1114250779boke/archive/2012/08/29/2662588.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值