zoukankan      html  css  js  c++  java
  • 简单单点更新线段树

     简单线段树

    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:
    ",++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
    ",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
    ",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
    ");
    58             else
    59             {
    60                 printf("%d
    ",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("
    ");
    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.
    ",++ff,sum[1]);
    65     }
    66 }
    View Code
  • 相关阅读:
    Win32汇编之其他指令
    Win32汇编过程与宏调用
    Win32汇编常用算数指令
    SQLi-LABS Page-1(Basic Challenges) Less1-Less4
    8 Best DDoS Attack Tools (Free DDoS Tool Of The Year 2019)
    4. 移动安全渗透测试-(Android逆向基础)
    3. 移动安全渗透测试-(Android基础漏洞)
    2. 移动安全渗透测试-(Android安全基础)
    1. 移动安全渗透测试-(环境搭建)
    Hacking/Penetrating tester bookmark collection
  • 原文地址:https://www.cnblogs.com/sweat123/p/4642700.html
Copyright © 2011-2022 走看看