2019.8.5 NOIP 16 simulation tests reflect summary

As always, first put the code, I have not started to change ...

#include<iostream>
#include<cstdio>
using namespace std;
int m,q,kk,vv;
struct node{
    int k,v;
}a[200010];
struct tree{
    int l,r,sum,pi,vi;
}b[800010];
int work(int p,int v){
    if(b[p*2+1].pi<v){
        return work(p*2,v-b[p*2+1].pi+b[p*2+1].vi);
    }
    else if(b[p*2+1].pi==v){
        return b[p].sum-b[p*2+1].sum;
    }
    else{
        return b[p].sum-b[p*2+1].sum+work(p*2+1,v);
    }
}
void update(int p){
    if(!b[p*2+1].vi){
        b[p].sum=b[p*2].sum+b[p*2+1] .sum; 
        b [p] .vi = b [p * 2 + 1 ] .vi + b [p * 2 ] .vi. 
        b [p] .pi = b [p * 2 ] + .pi b [p * 2 + 1 ] .pi. 
    } 
    Else  if (b [p * 2 + 1 ] .vi> = b [p * 2 ] .pi) { 
        b [p] .sum = b [p * 2 + 1 ] .sum; 
        b [p] .pi = b [p * 2 + 1 ] .pi. 
        b [p] .vi = b [p * 2 + 1 ] .vi-b [p * 2 ] + .pi b [p * 2] .vi; 
    } 
    Else { 
        b [p] .sum = b [p * 2 + 1 ] + .sum work (p * 2 , b [p * 2 + 1 ] .vi) 
        b [p] .pi = b [p * 2 + 1 ] .pi + b [p * 2 ] .pi b [p * 2 + 1 ] .vi; 
        b [p] .vi = b [p * 2 ] .vi; 
    } 
} 
Void build ( you p, you're the, you r) { 
    b [p] .The = l, b [p] .r = r;
    ow (l == r) {
        if(!a[l].k){
            b[p].sum=a[l].v;
            b[p].pi=1,b[p].vi=0;
        }
        else{
            b[p].sum=0;
            b[p].pi=0;
            b[p].vi=a[l].v;
        }
        return;
    }
    int mid=(l+r)/2;
    build(p*2,l,mid);
    build(p*2+1,mid+1,r);
    update(p);
}
void change(int p,int l,int r){
    if(l<=b[p].l&&b[p].r<=r){
        if(!kk){
            b[p].sum=vv;
            b[p].pi=1,b[p].vi=0;
        }
        else{
            b[p].sum=0;
            b[p].pi=0;
            b[p].vi=vv;
        }
        return;
    }
    int mid=(b[p].l+b[p].r)/2;
    if(l<=mid)change(p*2,l,r);
    if(r>mid)change(p*2+1,l,r);
    update(p);
}
int main()
{
//    freopen("3.in","r",stdin);
//    freopen("3.out","w",stdout);
    scanf("%d%d",&m,&q);
    for(int i=1,k,v;i<=m;i++){
        scanf("%d%d",&a[i].k,&a[i].v);
    }
    build(1,1,m);
    while(q--){
        int c;
        scanf("%d%d%d",&c,&kk,&vv);
        change(1,c,c);
        printf("%d\n",b[1].sum);
    }
    return 0;
}
T2

 

Guess you like

Origin www.cnblogs.com/chloris/p/11330881.html