zoukankan      html  css  js  c++  java
  • 线段树*5

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 
     5 using namespace std;
     6 const int N=10001;
     7 
     8 struct node{
     9     int l,r,w,f;
    10 }T[N];
    11 
    12 int ans,ans1,n,m,z,x,y,yj;
    13 
    14 inline void Heart(int jd)
    15 {
    16     T[jd].w=T[jd<<1].w+T[jd<<1|1].w;
    17 }
    18 
    19 inline void down(int jd)
    20 {
    21     T[jd<<1].w+=T[jd].f*(T[jd<<1].r-T[jd<<1].l+1);
    22     T[jd<<1|1].w+=T[jd].f*(T[jd<<1|1].r-T[jd<<1|1].l+1);
    23     T[jd<<1].f+=T[jd].f;
    24     T[jd<<1|1].f+=T[jd].f;
    25     T[jd].f=0;
    26 }
    27 
    28 inline void build(int l,int r,int jd)
    29 {
    30     T[jd].l=l;
    31     T[jd].r=r;
    32     if(T[jd].l==T[jd].r) {scanf("%d",&T[jd].w); return ;}    
    33     int mid=(l+r)>>1;
    34     build(l,mid,jd<<1);
    35     build(mid+1,r,jd<<1|1);
    36     Heart(jd);
    37 } 
    38 
    39 inline void po_ask(int jd)
    40 {
    41     if(T[jd].l==T[jd].r){ ans=T[jd].w; return ;}
    42     if(T[jd].f)down(jd);
    43     int mid=(T[jd].l+T[jd].r)>>1;
    44     if(x<=mid)po_ask(jd<<1);
    45     else po_ask(jd<<1|1);
    46 }
    47 
    48 inline void po_mod(int jd)
    49 {
    50     if(T[jd].l==T[jd].r){T[jd].w=y;return ;}
    51     int mid=(T[jd].l+T[jd].r)>>1;
    52     if(T[jd].l<=mid)po_mod(jd<<1);
    53     else po_mod(jd<<1|1);
    54     Heart(jd);
    55 }
    56 
    57 inline void qj_ask(int jd)
    58 {
    59     if(x<=T[jd].l&&T[jd].r<=y){ans1+=T[jd].w;return ;}
    60     if(T[jd].f)down(jd);
    61     int mid=(T[jd].l+T[jd].r)>>1;
    62     if(x<=mid)qj_ask(jd<<1);
    63     if(y>mid)qj_ask(jd<<1|1);
    64 }
    65 
    66 inline void qj_mod(int jd)
    67 {
    68     if(x<=T[jd].l&&T[jd].r<=y){T[jd].w+=(T[jd].l-T[jd].r+1)*yj;T[jd].f+=yj;return ;}
    69     if(T[jd].f)down(jd);
    70     int mid=(T[jd].l+T[jd].r)>>1;
    71     if(x<=mid)qj_mod(jd<<1);
    72     if(y>mid)qj_mod(jd<<1|1);
    73     Heart(jd);
    74 }
    75 
    76 int main()
    77 {
    78     scanf("%d",&n);
    79     build(1,n,1);
    80     scanf("%d",&m);
    81     for(int i=1;i<=m;i++)
    82     {
    83         scanf("%d",&z);
    84         ans=0;ans1=0;
    85         if(z==1) {scanf("%d",&x); po_ask(1); printf("%d
    ",ans);}
    86         if(z==2) {scanf("%d%d",&x,&y); po_mod(1);}
    87         if(z==3) {scanf("%d%d",&x,&y); qj_ask(1); printf("%d
    ",ans);}
    88         if(z==4) {scanf("%d%d%d",&x,&y,&yj); qj_mod(1);}
    89     }
    90     return 0;
    91 }

     读入优化

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 
     5 using namespace std;
     6 const int N=10001;
     7 
     8 struct node{
     9     int l,r,w,f;
    10 }T[N];
    11 
    12 int ans,ans1,n,m,z,x,y,yj;
    13 
    14 inline void read(int &x)
    15 {
    16     char c=getchar();x=0;
    17     while(c<'0'||c>'9')c=getchar();
    18     while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
    19 }
    20 
    21 inline void Heart(int jd)
    22 {
    23     T[jd].w=T[jd<<1].w+T[jd<<1|1].w;
    24 }
    25 
    26 inline void down(int jd)
    27 {
    28     T[jd<<1].w+=T[jd].f*(T[jd<<1].r-T[jd<<1].l+1);
    29     T[jd<<1|1].w+=T[jd].f*(T[jd<<1|1].r-T[jd<<1|1].l+1);
    30     T[jd<<1].f+=T[jd].f;
    31     T[jd<<1|1].f+=T[jd].f;
    32     T[jd].f=0;
    33 }
    34 
    35 inline void build(int l,int r,int jd)
    36 {
    37     T[jd].l=l;
    38     T[jd].r=r;
    39     if(T[jd].l==T[jd].r) {read(T[jd].w); return ;}    
    40     int mid=(l+r)>>1;
    41     build(l,mid,jd<<1);
    42     build(mid+1,r,jd<<1|1);
    43     Heart(jd);
    44 } 
    45 
    46 inline void po_ask(int jd)
    47 {
    48     if(T[jd].l==T[jd].r){ ans=T[jd].w; return ;}
    49     if(T[jd].f)down(jd);
    50     int mid=(T[jd].l+T[jd].r)>>1;
    51     if(x<=mid)po_ask(jd<<1);
    52     else po_ask(jd<<1|1);
    53 }
    54 
    55 inline void po_mod(int jd)
    56 {
    57     if(T[jd].l==T[jd].r){T[jd].w=y;return ;}
    58     int mid=(T[jd].l+T[jd].r)>>1;
    59     if(T[jd].l<=mid)po_mod(jd<<1);
    60     else po_mod(jd<<1|1);
    61     Heart(jd);
    62 }
    63 
    64 inline void qj_ask(int jd)
    65 {
    66     if(x<=T[jd].l&&T[jd].r<=y){ans1+=T[jd].w;return ;}
    67     if(T[jd].f)down(jd);
    68     int mid=(T[jd].l+T[jd].r)>>1;
    69     if(x<=mid)qj_ask(jd<<1);
    70     if(y>mid)qj_ask(jd<<1|1);
    71 }
    72 
    73 inline void qj_mod(int jd)
    74 {
    75     if(x<=T[jd].l&&T[jd].r<=y){T[jd].w+=(T[jd].l-T[jd].r+1)*yj;T[jd].f+=yj;return ;}
    76     if(T[jd].f)down(jd);
    77     int mid=(T[jd].l+T[jd].r)>>1;
    78     if(x<=mid)qj_mod(jd<<1);
    79     if(y>mid)qj_mod(jd<<1|1);
    80     Heart(jd);
    81 }
    82 
    83 int main()
    84 {
    85     read(n);
    86     build(1,n,1);
    87     read(m);
    88     for(int i=1;i<=m;i++)
    89     {
    90         read(z);
    91         ans=0;ans1=0;
    92         if(z==1) {read(x); po_ask(1); printf("%d
    ",ans);}
    93         if(z==2) {read(x);read(y); po_mod(1);}
    94         if(z==3) {read(x);read(y); qj_ask(1); printf("%d
    ",ans);}
    95         if(z==4) {read(x);read(y);read(yj); qj_mod(1);}
    96     }
    97     return 0;
    98 }
  • 相关阅读:
    Python实现DES加密算法
    空循环,g++ O2优化
    java 高并发下超购问题解决
    原型模式
    Lambda速学
    观察者模式
    略读策略模式
    .net 字典的速学
    执行计划准备篇
    关于“策略模式”与“桥接模式”的问题
  • 原文地址:https://www.cnblogs.com/lyqlyq/p/6841157.html
Copyright © 2011-2022 走看看