• 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 }
  • 相关阅读:
    单例模式创建
    盛最多水的容器
    魔术索引
    钢条切割
    比较版本号
    矩阵中的路径
    机器人的运动范围
    计网基础问题
    Linux 下android环境的配置
    Fedora15下安装Android开发环境
  • 原文地址:https://www.cnblogs.com/1114250779boke/p/2662588.html
Copyright © 2020-2023  润新知