码迷,mamicode.com
首页 > 其他好文 > 详细

线段树

时间:2015-07-13 15:30:13      阅读:91      评论:0      收藏:0      [点我收藏+]

标签:

 简单线段树

hdu1166

技术分享
 1 #include<stdio.h>
 2 #define lson l,m,rt<<1
 3 #define rson m+1,r,rt<<1|1
 4 #define maxn 50505
 5 int sum[maxn<<2];
 6 void PushUP(int rt)
 7 {
 8     sum[rt] = sum[rt<<1] + sum[rt<<1|1];
 9 }
10 void build(int l,int r,int rt)
11 {
12     if(l == r)
13     {
14         scanf("%d",&sum[rt]);
15         return;
16     }
17     int m = (l + r)/2;
18     build(lson);
19     build(rson);
20     PushUP(rt);
21 }
22 void Updata(int p,int add,int l,int r,int rt)
23 {
24     if(l == r)
25     {
26         sum[rt] += add;
27         return ;
28     }
29     int m = (l + r)/2;
30     if(p <= m)
31         Updata(p,add,lson);
32     else 
33         Updata(p,add,rson);
34     PushUP(rt);
35 }
36 int Query(int L,int R,int l,int r,int rt)
37 {
38     if(L <= l&&r <= R)
39         return sum[rt];
40     int ret = 0;
41     int m = (l + r)/2;
42     if(L > m)
43         ret += Query(L,R,rson);
44     else if(m >= R)
45         ret += Query(L,R,lson);
46     else
47     {
48         ret += Query(L,R,lson);
49         ret += Query(L,R,rson);
50     }
51     return ret;
52 }
53 int main()
54 {
55     int T , ff = 0 , n;
56     scanf("%d",&T);
57     while(T--)
58     {
59         printf("Case %d:\n",++ff);
60         scanf("%d",&n);
61         build(1,n,1);
62         char s[10];
63         while(scanf("%s",s)!=EOF)
64         {
65             if(s[0]==E)
66                 break;
67             int a,b;
68             scanf("%d%d",&a,&b);
69             if(s[0]==A)
70                 Updata(a,b,1,n,1);
71             else if(s[0]==S)
72                 Updata(a,-b,1,n,1);
73             else if(s[0]==Q)
74                 printf("%d\n",Query(a,b,1,n,1));
75         }
76     }
77 }
View Code

hdu1394

技术分享
 1 #include<stdio.h>
 2 #define lson l,m,rt<<1
 3 #define rson m+1,r,rt<<1|1
 4 #define maxn 5500
 5 int sum[maxn<<2];
 6 int a[maxn];
 7 void PushUp(int rt)
 8 {
 9     sum[rt]=sum[rt<<1]+sum[rt<<1|1];
10 }
11 void build(int l,int r,int rt)
12 {
13     sum[rt]=0;
14     if(l==r)
15         return;
16     int m=(l+r)/2;
17     build(lson);
18     build(rson);
19 }
20 int Query(int L,int R,int l,int r,int rt)
21 {
22     if(L<=l&&R>=r)
23         return sum[rt];
24     int m=(l+r)/2;
25     int ret=0;
26     if(m >= L)
27         ret+=Query(L,R,lson);
28     if(m < R)
29         ret+=Query(L,R,rson);
30     return ret;
31 }
32 void Updata(int p,int l,int r,int rt)
33 {
34     if(l==r)
35     {
36         sum[rt]++;
37         return;
38     }
39     int m=(r+l)/2;
40     if(m>=p)
41         Updata(p,lson);
42     else
43         Updata(p,rson);
44     PushUp(rt);
45 }
46 int main()
47 {
48     int i,n;
49     while(scanf("%d",&n)!=EOF)
50     {
51         build(1,n,1);
52         int ss=0;
53         for(i=0;i<n;i++)
54         {
55             scanf("%d",&a[i]);
56             ss+=Query(a[i],n-1,0,n-1,1);
57             Updata(a[i],0,n-1,1);
58         }
59         int ans=ss;
60         for(i=0;i<n;i++)
61         {
62             ans=ans+n-1-2*a[i];
63             if(ans<ss)
64                 ss=ans;
65         }
66         printf("%d\n",ss);
67     }
68 }
View Code

hdu2795

技术分享
 1 #include<stdio.h>
 2 #define lson l,m,rt<<1
 3 #define rson m+1,r,rt<<1|1
 4 #define maxn 202002
 5 int sum[maxn<<2];
 6 int max(int x,int y)
 7 {
 8     return x>y?x:y;
 9 }
10 void PushUp(int rt)
11 {
12     sum[rt]=max(sum[rt<<1],sum[rt<<1|1]);
13 }
14 void build(int l,int r,int rt,int v)
15 {    
16     sum[rt]=v;
17     if(l==r)
18     {
19         return;
20     }
21     int m=(l+r)/2;
22     build(lson,v);
23     build(rson,v);
24 //    PushUp(rt);
25 }
26 int Query(int len,int l,int r,int rt)
27 {
28     if(len>sum[rt])
29         return -1;
30     if(l==r)
31     {
32         sum[rt]-=len;
33         return l;
34     }
35     int ret;
36     int m=(l+r)/2;
37     if(len<=sum[rt<<1])
38         ret =  Query(len,lson);
39     else if(len<=sum[rt<<1|1])
40         ret =  Query(len,rson);
41     PushUp(rt);
42     return ret;
43 }
44 int main()
45 {
46     int h,w,n,i;
47     while(scanf("%d%d%d",&h,&w,&n)!=EOF)
48     {
49         if(h>n)
50             h=n;
51         build(1,h,1,w);
52         int x;
53         for(i=0;i<n;i++)
54         {
55             scanf("%d",&x);
56             if(x>sum[1])
57                 printf("-1\n");
58             else
59             {
60                 printf("%d\n",Query(x,1,h,1));
61             }
62         }
63     }
64 }
View Code

 poj2828

技术分享
 1 #include<stdio.h>
 2 #define lson l,m,rt<<1
 3 #define rson m+1,r,rt<<1|1
 4 #define maxn 200200
 5 int sum[maxn<<2];
 6 struct node
 7 {
 8     int id;
 9     int v;
10 }a[maxn];
11 int place,map[maxn];
12 void PushUp(int rt)
13 {
14     sum[rt]=sum[rt<<1]+sum[rt<<1|1];
15 }
16 void build(int l,int r,int rt)
17 {
18     if(l==r)
19     {
20         sum[rt]=1;
21         return ;
22     }
23     int m=(l+r)/2;
24     build(lson);
25     build(rson);
26     PushUp(rt);
27 }
28 void Updata(int p,int l,int r,int rt)
29 {
30     if(l==r)
31     {
32         place=l;
33         sum[rt]--;
34         return;
35     }
36     int m=(l+r)/2;
37     if(sum[rt<<1]>=p)
38         Updata(p,lson);
39     else 
40     {
41         p=p-sum[rt<<1];
42         Updata(p,rson);
43     }
44     PushUp(rt);
45 }
46 int main()
47 {
48     int i,n;
49     while(scanf("%d",&n)!=EOF)
50     {
51         build(1,n,1);
52         for(i=0;i<n;i++)
53         {
54             scanf("%d%d",&a[i].v,&a[i].id);
55         }
56         for(i=n-1;i>=0;i--)
57         {
58             Updata(a[i].v+1,1,n,1);
59             map[place]=a[i].id;
60         }
61         for(i=1;i<=n;i++)
62         {
63             if(i==1)
64                 printf("%d",map[i]);
65             else printf(" %d",map[i]);
66         }
67         printf("\n");
68     }
69 }
View Code

hdu1698

技术分享
 1 #include<stdio.h>
 2 #define lson l,m,rt<<1
 3 #define rson m+1,r,rt<<1|1
 4 #define maxn 101000
 5 int sum[maxn<<2],mark[maxn<<2];
 6 void pushup(int rt)
 7 {
 8     sum[rt]=sum[rt<<1]+sum[rt<<1|1];
 9 }
10 void build(int l,int r,int rt)
11 {
12     mark[rt]=0;
13     if(l==r)
14     {
15         sum[rt]=1;
16         return;
17     }
18     int m=(l+r)/2;
19     build(lson);
20     build(rson);
21     pushup(rt);
22 }
23 void pushdown(int rt,int len)
24 {
25     if(mark[rt])
26     {
27         mark[rt<<1|1]=mark[rt<<1]=mark[rt];
28         sum[rt<<1]=mark[rt]*(len-len/2);
29         sum[rt<<1|1]=mark[rt]*(len/2);
30         mark[rt]=0;
31     }
32 }
33 void updata(int L,int R,int c,int l,int r,int rt)
34 {
35     if(l>=L&&R>=r)
36     {
37         mark[rt]=c;
38         sum[rt]=c*(r-l+1);
39         return;
40     }
41     pushdown(rt,r-l+1);
42     int m=(l+r)/2;
43     if(m>=L)
44         updata(L,R,c,lson);
45     if(R>m)
46         updata(L,R,c,rson);
47     pushup(rt);
48 }
49 int main()
50 {
51     int n,m,t,ff=0;
52     scanf("%d",&t);
53     while(t--)
54     {
55         scanf("%d",&n);
56         build(1,n,1);
57         scanf("%d",&m);
58         while(m--)
59         {
60             int x,y,z;
61             scanf("%d%d%d",&x,&y,&z);
62             updata(x,y,z,1,n,1);
63         }
64         printf("Case %d: The total value of the hook is %d.\n",++ff,sum[1]);
65     }
66 }
View Code

poj2528

技术分享
  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<algorithm>
  4 using namespace std;
  5 #define lson l,m,rt<<1
  6 #define rson m+1,r,rt<<1|1
  7 #define maxn 200100
  8 int sum[maxn<<2];
  9 int x[maxn],y[maxn];
 10 int a[maxn*2],vis[maxn*2];
 11 int ans;
 12 void pushup(int rt)
 13 {
 14     if(sum[rt<<1]&&sum[rt<<1|1])
 15         sum[rt]=1;
 16     else sum[rt]=0;
 17 }
 18 void build(int l,int r,int rt)
 19 {
 20     sum[rt]=0;
 21     if(l==r)
 22         return;
 23     int m=(l+r)/2;
 24     build(lson);
 25     build(rson);
 26 }
 27 int find(int v,int ln,int rn)
 28 {
 29     int l,r,mid;
 30     l=ln;r=rn;
 31     while(l<=r)
 32     {
 33         mid=(l+r)>>1;
 34         if(a[mid]==v)
 35             return mid;
 36         else if(a[mid]>v)
 37             r=mid-1;
 38         else l=mid+1;
 39     }
 40 }
 41 void updata(int L,int R,int l,int r,int rt,int c)
 42 {
 43     if(sum[rt])
 44         return;
 45     if(L<=l&&R>=r)
 46     {
 47         sum[rt]=1;
 48         if(!vis[c])
 49         {
 50             vis[c]=1;
 51             ans++;
 52         }
 53         return;
 54     }
 55     int m=(l+r)/2;
 56     if(m>=L)
 57         updata(L,R,lson,c);
 58     if(R>m)
 59         updata(L,R,rson,c);
 60     pushup(rt);
 61 }
 62 int main()
 63 {
 64     int t,i,m;
 65     scanf("%d",&t);
 66     while(t--)
 67     {
 68         ans=0;
 69         scanf("%d",&m);
 70         int count=0;
 71         for(i=0;i<m;i++)
 72         {
 73             scanf("%d%d",&x[i],&y[i]);
 74             a[++count]=x[i];
 75             a[++count]=y[i];
 76         }
 77         sort(a+1,a+count+1);
 78         int k=1;
 79         for(i=2;i<=count;i++)
 80         {
 81             if(a[i]!=a[i-1])
 82                 a[++k]=a[i];
 83         }
 84         for(i=k;i>=1;i--)
 85         {
 86             if(a[i]!=a[i-1]+1)
 87             {
 88                 a[++k]=a[i-1]+1;
 89             }
 90         }
 91         sort(a+1,a+k+1);
 92         build(1,k,1);
 93 
 94         //for(i=1;i<=k;i++)
 95         //    printf("%d ",a[i]);
 96         //printf("\n");
 97 
 98         memset(vis,0,sizeof(vis));
 99         for(i=m-1;i>=0;i--)
100         {
101             int fx=find(x[i],1,k);
102             int fy=find(y[i],1,k);
103             updata(fx,fy,1,k,1,i);
104         }
105         printf("%d\n",ans);
106     }
107 }
108 //离散化的重要性
View Code

 

线段树

标签:

原文地址:http://www.cnblogs.com/sweat123/p/4642700.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!