思路:

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

 #include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<time.h>
#define ll long long
struct edge{
int u,v;
ll w;
}e[];
struct node{
int l,r,rnd,size,w;
ll v,sum1,sum2;
}t[];
ll val[];
int tot,n,q,sz,vis[],root;
int read(){
int t=,f=;char ch=getchar();
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (''<=ch&&ch<='') {t=t*+ch-'';ch=getchar();}
return t*f;
}
ll Read(){
ll t=,f=;char ch=getchar();
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (''<=ch&&ch<='') {t=t*+ch-'';ch=getchar();}
return t*f;
}
void updata(int k){
int l=t[k].l,r=t[k].r;
t[k].size=t[l].size+t[r].size+t[k].w;
int num1,num2;
if (t[k].w%==) num1=num2=t[k].w/;
else num2=t[k].w/,num1=num2+;
int Num=;
if (l==&&r==){
t[k].sum1=num1*t[k].v;
t[k].sum2=num2*t[k].v;
return;
}else
if (r==&&l!=){
t[k].sum1=t[l].sum1;
t[k].sum2=t[l].sum2;
if (t[l].size%) t[k].sum2+=t[k].v*num1,t[k].sum1+=t[k].v*num2;
else t[k].sum1+=t[k].v*num1,t[k].sum2+=t[k].v*num2;
return;
}else
if (l==&&r!=){
t[k].sum1=t[k].v*num1;
t[k].sum2=t[k].v*num2;
if (t[k].w%) t[k].sum2+=t[r].sum1,t[k].sum1+=t[r].sum2;
else t[k].sum1+=t[r].sum1,t[k].sum2+=t[r].sum2;
return;
}
t[k].sum1=t[l].sum1;Num=t[l].size;
t[k].sum2=t[l].sum2;
if (Num%){
t[k].sum2+=t[k].v*num1;
t[k].sum1+=t[k].v*num2;
}else{
t[k].sum2+=t[k].v*num2;
t[k].sum1+=t[k].v*num1;
}
Num+=t[k].w;
if (Num%){
t[k].sum2+=t[r].sum1;
t[k].sum1+=t[r].sum2;
}else{
t[k].sum1+=t[r].sum1;
t[k].sum2+=t[r].sum2;
}
}
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;}
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;}
void insert(int &k,int v){
if (!k){
k=++sz;
t[k].l=t[k].r=;
t[k].rnd=rand();
t[k].size=;
t[k].w=;
t[k].v=v;
t[k].sum1=v;
t[k].sum2=;
return;
}
t[k].size++;
if (t[k].v==v){
t[k].w++;
updata(k);
return;
}
else
if (t[k].v>v){
insert(t[k].r,v);
if (t[t[k].r].rnd<t[k].rnd) lturn(k);
}else{
insert(t[k].l,v);
if (t[t[k].l].rnd<t[k].rnd) rturn(k);
}
updata(k);
}
void del(int &k,int v){
if (!k) return;
if (t[k].v==v){
if (t[k].w>){
t[k].w--;
updata(k);
return;
}
if (t[k].l==||t[k].r==){
k=t[k].l+t[k].r;
return;
}
if (t[t[k].l].rnd<t[t[k].r].rnd){
rturn(k);
del(k,v);
}else{
lturn(k);
del(k,v);
}
updata(k);
return;
}
t[k].size--;
if (t[k].v>v){
del(t[k].r,v);
}else{
del(t[k].l,v);
}
updata(k);
}
int main(){
n=read();q=read();int o=read();ll ans=;
while (q--){
int opt=read();
if (opt==){
e[++tot].u=read();e[tot].v=read();e[tot].w=Read();
e[tot].u^=(o*ans);e[tot].v^=(o*ans);
if (val[e[tot].u]) del(root,val[e[tot].u]);vis[e[tot].u]=;
if (val[e[tot].v]&&e[tot].u!=e[tot].v) del(root,val[e[tot].v]);vis[e[tot].v]=;
val[e[tot].u]+=e[tot].w;
val[e[tot].v]+=e[tot].w;
insert(root,val[e[tot].u]);
if (e[tot].u!=e[tot].v)
insert(root,val[e[tot].v]);
ans=(t[root].sum1-t[root].sum2)/;
printf("%lld\n",ans);
}else{
int k=read();
k=k^(o*ans);
if (val[e[k].u])
del(root,val[e[k].u]);
if (val[e[k].v]&&e[k].u!=e[k].v)
del(root,val[e[k].v]);
val[e[k].u]-=e[k].w;
val[e[k].v]-=e[k].w;
if (val[e[k].u]!=)
insert(root,val[e[k].u]);
if (val[e[k].v]!=&&e[k].u!=e[k].v)
insert(root,val[e[k].v]);
ans=(t[root].sum1-t[root].sum2)/;
printf("%lld\n",ans);
}
}
return ;
}

NOI十连测 第六测 T1的更多相关文章

  1. NOI十连测 第六测 T3

    思路:考试的时候我非常地**,写了圆并,然后还TM写了半平面交和三角剖分,虽然只有30分..但是看在我写了500行的份上还是挂着吧.. #include<cstdio> #include& ...

  2. <转>二十问全链路压测干货汇总(上)

    本文转载自:微信公众号-数列科技<二十问全链路压测干货汇总(上)> 最近几年全链路压测无疑成为了一个热门话题,在各个技术峰会上都可以看到它的身影. 一些大型的互联网公司,比如阿里巴巴.京东 ...

  3. # NOI.AC省选赛 第五场T1 子集,与&最大值

    NOI.AC省选赛 第五场T1 A. Mas的童年 题目链接 http://noi.ac/problem/309 思路 0x00 \(n^2\)的暴力挺简单的. ans=max(ans,xor[j-1 ...

  4. 「NOI十联测」深邃

    「NOI十联测」深邃 要使得最大的连通块最小,显然先二分答案. 先固定1结点为根. 对于一个果实,显然是先处理子树中未分配的点,再向外延伸. 每个结点记录一个\(si[]\),表示子树中未分配的点数, ...

  5. 「NOI十联测」奥义商店

    「NOI十联测」奥义商店 若lzz想花费最少的钱,那么显然要选择数目较少的颜色. 先考虑暴力的写法. 每次向两边统计,每个物品要求被买的概率可以由上一个物品推出. now=1;//now 被买概率 M ...

  6. 「NOI十联测」黑暗

    「NOI十联测」黑暗 \(n\) 个点的无向图,每条边都可能存在,一个图的权值是连通块个数的 \(m\) 次方,求所有可能的图的权值和.(n≤30000,m≤15) 令\(ans[n][m]\)为n个 ...

  7. NOI十连测 第五测 T1

    #include<cstdio> #include<cstring> #include<cmath> #include<iostream> #inclu ...

  8. NOI十连测 第四测 T1

    思路:首先每个蚂蚁移速相同,而且碰到就转头,这其实等价于擦肩而过! 看到2n个数互不相同就觉得方便多了:枚举每个数字往左或者往右作为最慢,然后考虑其他蚂蚁有多少种走路方向. (1),走的距离大于m/2 ...

  9. NOI十连测 第三测 T1

    这么二逼的题考试的时候我想了好久,我真是太弱了... 首先,由于ans都乘上了i*(i-1)/2,实际上要求的就是每个数的所有可能出现次数*这个数的权值. 我们发现,每个数的本质是一样的,我们记一个s ...

随机推荐

  1. 设置ActioinBar 的背景色以及Title的字体颜色

    //设置ActionBar背景 Drawable draw=this.getResources().getDrawable(R.drawable.actionbar_bg); getActionBar ...

  2. WIN8共享文件 详细设置

    原文地址:http://jingyan.baidu.com/article/75ab0bcbff4274d6864db2f5.html win8共享文件设置 详细教程 | 浏览:6987 | 更新:2 ...

  3. 给Select赋值 innerHTML 不兼容IE6\IE7\IE8\IE9

    <select class="b-select" id="location-province" name="Province" def ...

  4. 使用skin++进行MFC界面美化范例

    1.下载skin++皮肤库和皮肤库,skin++皮肤库主要包括:SkinPPWTL.dll,SkinPPWTL.lib,SkinPPWTL.h这三个文件.把这三个文件 拷贝到工程目录下. 2.在工程中 ...

  5. Android面试题07

    62. 说说mvc模式的原理,它在android中的运用. MVC英文即Model-View-Controller,即把一个应用的输入.处理.输出流程按照Model.View.Controller的方 ...

  6. SQLServer 循环1百万插入测试数据

    1,首先创建student表 create table student ( sno int primary key , sname VARCHAR(200) ) 2,--向数据库中插入100万条随机姓 ...

  7. [Javascript] How to write a Javascript libarary

    Create package.json file //npm settings npm set init-author-name 'username' npm set init-author-emai ...

  8. SEO 外链 内链 的定义

    外链 外链就是指从别的网站导入到自己网站的链接.导入链接对于网站优化来说是非常重要的一个过程.导入链接的质量(即导入链接所在页面的权重)直接决定了我们的网站在搜索引擎中的权重. 外链是互联网的血液,是 ...

  9. ORACLE序列的使用总结

    1.创建序列ORACLE序列的语法格式为: CREATE SEQUENCE 序列名[INCREMENT BY n][START WITH n][{MAXVALUE/ MINVALUE n|NOMAXV ...

  10. Windows - 远程桌面无证书

    可以从命令行启动远程桌面,输入:mstsc /v:地址:端口 /admin