NOI十连测 第六测 T1
思路:
用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的更多相关文章
- NOI十连测 第六测 T3
思路:考试的时候我非常地**,写了圆并,然后还TM写了半平面交和三角剖分,虽然只有30分..但是看在我写了500行的份上还是挂着吧.. #include<cstdio> #include& ...
- <转>二十问全链路压测干货汇总(上)
本文转载自:微信公众号-数列科技<二十问全链路压测干货汇总(上)> 最近几年全链路压测无疑成为了一个热门话题,在各个技术峰会上都可以看到它的身影. 一些大型的互联网公司,比如阿里巴巴.京东 ...
- # NOI.AC省选赛 第五场T1 子集,与&最大值
NOI.AC省选赛 第五场T1 A. Mas的童年 题目链接 http://noi.ac/problem/309 思路 0x00 \(n^2\)的暴力挺简单的. ans=max(ans,xor[j-1 ...
- 「NOI十联测」深邃
「NOI十联测」深邃 要使得最大的连通块最小,显然先二分答案. 先固定1结点为根. 对于一个果实,显然是先处理子树中未分配的点,再向外延伸. 每个结点记录一个\(si[]\),表示子树中未分配的点数, ...
- 「NOI十联测」奥义商店
「NOI十联测」奥义商店 若lzz想花费最少的钱,那么显然要选择数目较少的颜色. 先考虑暴力的写法. 每次向两边统计,每个物品要求被买的概率可以由上一个物品推出. now=1;//now 被买概率 M ...
- 「NOI十联测」黑暗
「NOI十联测」黑暗 \(n\) 个点的无向图,每条边都可能存在,一个图的权值是连通块个数的 \(m\) 次方,求所有可能的图的权值和.(n≤30000,m≤15) 令\(ans[n][m]\)为n个 ...
- NOI十连测 第五测 T1
#include<cstdio> #include<cstring> #include<cmath> #include<iostream> #inclu ...
- NOI十连测 第四测 T1
思路:首先每个蚂蚁移速相同,而且碰到就转头,这其实等价于擦肩而过! 看到2n个数互不相同就觉得方便多了:枚举每个数字往左或者往右作为最慢,然后考虑其他蚂蚁有多少种走路方向. (1),走的距离大于m/2 ...
- NOI十连测 第三测 T1
这么二逼的题考试的时候我想了好久,我真是太弱了... 首先,由于ans都乘上了i*(i-1)/2,实际上要求的就是每个数的所有可能出现次数*这个数的权值. 我们发现,每个数的本质是一样的,我们记一个s ...
随机推荐
- cf B. Vasily the Bear and Fly
http://codeforces.com/contest/336/problem/B #include <cstdio> #include <cstring> #includ ...
- UltraChart画柱状图上面显示数值
http://www.cnblogs.com/kevin-h-wang/archive/2013/06/05/UltraChart.html 1.柱状图上显示数值 ? //第一种方法 this.Ult ...
- Java异常的使用
1.exception的分类 java将异常分为两种,checked exception和unchecked exception(一般指runtimeException). checked excep ...
- Palindrome Subarrays
给定输入字符串,要求判断任意子字符串是否对称. 基本思路就是DP 写出DP表达式为 dp[i][j] = dp[i + 1][j - 1] && (s[i] == s[j]) dp[i ...
- Linux Shell脚本编程--nc命令使用详解
linux nc命令使用详解 功能说明:功能强大的网络工具 语 法:nc [-hlnruz][-g<网关...>][-G<指向器数目>][-i<延迟秒数>] ...
- mysql补充(1)校对集utf8_unicode_ci与utf8_general_ci
创建数据库并设置编码utf-8 多语言(补充1 2) create database mydb default character set utf8 collate utf8_general_ci; ...
- add BOM to fix UTF-8 in Excel
fputs($fp, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) ));
- Chosen 基本使用
点击下载Chosen 引入文件 chosen.css jquery-1.7.1.min.js chosen.jquery.js 绑定数据: for (var i = 0; i < data.le ...
- iOS开发-Runtime详解(简书)
简介 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的.比如: [receiver message]; // ...
- 使用Open Flash Chart(OFC)制作图表(Struts2处理)
Java开源项目中制作图表比较出色的就是JFreeChart了,相信大家都听说过,它不仅可以做出非常漂亮的柱状图,饼状图,折线图基本图形之外,还能制作甘特图,仪表盘等图表.在Web应用中可以为项目增色 ...