思路:

用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. .net 中的DllImport

    只有做成COM的C++ dll才能直接引用.没有做成COM的就只能用P/Invoke(DllImport)或者C++/CLI那种.不过P/Invoke容易类型对不上,所以要是函数多,最好用C++/CL ...

  2. 转:PHP的(Thread Safe与Non Thread Safe)

    在安装xdebug到时候你会有有TS和NTS版本的选择,在以前还有VC6和VC9的版本.如果你没有根据你目前的服务器的状况选择对应的版本的话,那么xdebug是安装不成功的. 一.如何选择 php5. ...

  3. WIN8共享文件 详细设置

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

  4. impala编译

    impala编译 编译系统centos 5.10 说明:版本1.3.x----2.1.x都能编译 一.预装库 1.gcc安装 yum install gcc44 yum install gcc44-c ...

  5. Eat Candy(暴力,水)

    Eat Candy Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 8  Solved: 6[Submit][Status][Web Board] Des ...

  6. C++第15周(春)项目3 - OOP版电子词典(一)

    课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759.内有完整教学方案及资源链接 [项目3-OOP版电子词典](本程序中须要的相 ...

  7. Ajax发送Post请求

    Ajax发送post请求与发送get请求大致类似.以下看详细实例.首先看JSP显示页面: <form action="servlet/LoginServlet" method ...

  8. zXing使用小结

    在android上二维码.条形码扫描,google官方为我们提供了zXing,几乎android涉及到扫描的都是用这个开源项目实现的,也有在android上使用zBar的,和其他用过的交流得知zBar ...

  9. The account is locked

    SQL> select * from v$version where rownum=1; BANNER --------------------------------------------- ...

  10. javascript 阻止多次点击造成的轮播混乱

    function nextSlider(){ //使用b作为开关,只有动画完成后才能进行下一次运动 if(b){ //如果b为真,则马上设置b为false,如果startmove的回调没有重新设置b的 ...