zoukankan      html  css  js  c++  java
  • NOI十连测 第六测 T1

     思路:

    用treap动态维护,记一个sum1,sum2,注意!,写treap如果有删除操作,千万不能把权值相同的分开来。。,这在删除的时候会进入死循环,这是一个惨痛的教训。。。

      1 #include<cstdio>
      2 #include<cmath>
      3 #include<cstring>
      4 #include<iostream>
      5 #include<algorithm>
      6 #include<time.h>
      7 #define ll long long
      8 struct edge{
      9     int u,v;
     10     ll w;
     11 }e[2000005];
     12 struct node{
     13     int l,r,rnd,size,w;
     14     ll v,sum1,sum2;
     15 }t[2000005];
     16 ll val[2000005];
     17 int tot,n,q,sz,vis[2000005],root;
     18 int read(){
     19     int t=0,f=1;char ch=getchar();
     20     while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}
     21     while ('0'<=ch&&ch<='9') {t=t*10+ch-'0';ch=getchar();}
     22     return t*f;
     23 }
     24 ll Read(){
     25     ll t=0,f=1;char ch=getchar();
     26     while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}
     27     while ('0'<=ch&&ch<='9') {t=t*10+ch-'0';ch=getchar();}
     28     return t*f;
     29 }
     30 void updata(int k){
     31     int l=t[k].l,r=t[k].r;
     32     t[k].size=t[l].size+t[r].size+t[k].w;
     33     int num1,num2;
     34     if (t[k].w%2==0) num1=num2=t[k].w/2;
     35     else num2=t[k].w/2,num1=num2+1;
     36     int Num=0;
     37     if (l==0&&r==0){
     38         t[k].sum1=num1*t[k].v;
     39         t[k].sum2=num2*t[k].v;
     40         return;
     41     }else
     42     if (r==0&&l!=0){
     43         t[k].sum1=t[l].sum1;
     44         t[k].sum2=t[l].sum2;
     45         if (t[l].size%2) t[k].sum2+=t[k].v*num1,t[k].sum1+=t[k].v*num2;
     46         else t[k].sum1+=t[k].v*num1,t[k].sum2+=t[k].v*num2;
     47         return;
     48     }else
     49     if (l==0&&r!=0){
     50         t[k].sum1=t[k].v*num1;
     51         t[k].sum2=t[k].v*num2;
     52         if (t[k].w%2) t[k].sum2+=t[r].sum1,t[k].sum1+=t[r].sum2;
     53         else t[k].sum1+=t[r].sum1,t[k].sum2+=t[r].sum2;
     54         return;
     55     }
     56     t[k].sum1=t[l].sum1;Num=t[l].size;
     57     t[k].sum2=t[l].sum2;
     58     if (Num%2){
     59         t[k].sum2+=t[k].v*num1;
     60         t[k].sum1+=t[k].v*num2;
     61     }else{
     62         t[k].sum2+=t[k].v*num2;
     63         t[k].sum1+=t[k].v*num1;
     64     }
     65     Num+=t[k].w;
     66     if (Num%2){
     67         t[k].sum2+=t[r].sum1;
     68         t[k].sum1+=t[r].sum2;
     69     }else{
     70         t[k].sum1+=t[r].sum1;
     71         t[k].sum2+=t[r].sum2;
     72     }
     73 }
     74 void lturn(int &k){int T=t[k].r;t[k].r=t[T].l;t[T].l=k;t[T].size=t[k].size;updata(k);updata(T);k=T;}
     75 void rturn(int &k){int T=t[k].l;t[k].l=t[T].r;t[T].r=k;t[T].size=t[k].size;updata(k);updata(T);k=T;}
     76 void insert(int &k,int v){
     77     if (!k){
     78         k=++sz;
     79         t[k].l=t[k].r=0;
     80         t[k].rnd=rand();
     81         t[k].size=1;
     82         t[k].w=1;
     83         t[k].v=v;
     84         t[k].sum1=v;
     85         t[k].sum2=0;
     86         return;
     87     }
     88     t[k].size++;
     89     if (t[k].v==v){
     90         t[k].w++;
     91         updata(k);
     92         return;
     93     }
     94     else
     95     if (t[k].v>v){
     96         insert(t[k].r,v);
     97         if (t[t[k].r].rnd<t[k].rnd) lturn(k);
     98     }else{
     99         insert(t[k].l,v);
    100         if (t[t[k].l].rnd<t[k].rnd) rturn(k);
    101     }
    102     updata(k);
    103 }
    104 void del(int &k,int v){
    105     if (!k) return;
    106     if (t[k].v==v){
    107         if (t[k].w>1){
    108             t[k].w--;
    109             updata(k);
    110             return;
    111         }
    112         if (t[k].l==0||t[k].r==0){
    113             k=t[k].l+t[k].r;
    114             return;
    115         }
    116         if (t[t[k].l].rnd<t[t[k].r].rnd){
    117             rturn(k);
    118             del(k,v);
    119         }else{
    120             lturn(k);
    121             del(k,v);
    122         }
    123         updata(k);
    124         return;
    125     }
    126     t[k].size--;
    127     if (t[k].v>v){
    128         del(t[k].r,v);
    129     }else{
    130         del(t[k].l,v);
    131     }
    132     updata(k);
    133 }
    134 int main(){
    135     n=read();q=read();int o=read();ll ans=0;
    136     while (q--){
    137         int opt=read();
    138         if (opt==1){
    139             e[++tot].u=read();e[tot].v=read();e[tot].w=Read();
    140             e[tot].u^=(o*ans);e[tot].v^=(o*ans);
    141             if (val[e[tot].u]) del(root,val[e[tot].u]);vis[e[tot].u]=1;
    142             if (val[e[tot].v]&&e[tot].u!=e[tot].v) del(root,val[e[tot].v]);vis[e[tot].v]=1;
    143             val[e[tot].u]+=e[tot].w;
    144             val[e[tot].v]+=e[tot].w;
    145             insert(root,val[e[tot].u]);
    146             if (e[tot].u!=e[tot].v)
    147             insert(root,val[e[tot].v]);    
    148             ans=(t[root].sum1-t[root].sum2)/2;
    149             printf("%lld
    ",ans);    
    150         }else{
    151             int k=read();
    152             k=k^(o*ans);
    153             if (val[e[k].u])
    154             del(root,val[e[k].u]);
    155             if (val[e[k].v]&&e[k].u!=e[k].v)
    156             del(root,val[e[k].v]);
    157             val[e[k].u]-=e[k].w;
    158             val[e[k].v]-=e[k].w;
    159             if (val[e[k].u]!=0)
    160             insert(root,val[e[k].u]);
    161             if (val[e[k].v]!=0&&e[k].u!=e[k].v)
    162             insert(root,val[e[k].v]);
    163             ans=(t[root].sum1-t[root].sum2)/2;
    164             printf("%lld
    ",ans);
    165         }
    166     }
    167     return 0;
    168 }
  • 相关阅读:
    将博客搬至CSDN
    Java开发基础知识之学习篇——双亲委派机制
    Java开发基础知识之学习篇——理解NIO
    Java开发基础知识之学习篇——类加载机制
    Java开发基础知识之学习篇——Object类
    Java开发基础知识之学习篇——核心类库
    Java开发基础知识之学习篇——JVM组成
    Java笔试准备篇之基础篇——抽象类与接口
    Java开发进阶知识之学习篇——hashCode和equals
    JWT类型的Token介绍
  • 原文地址:https://www.cnblogs.com/qzqzgfy/p/5608005.html
Copyright © 2011-2022 走看看