hdu 3577Fast Arrangement
生活随笔
收集整理的這篇文章主要介紹了
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
總結
以上是生活随笔為你收集整理的hdu 3577Fast Arrangement的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dx postprocess
- 下一篇: 使用笛卡尔积 cross join解决傻