BZOJ 2001 线段树+LCT (TLE)
同是O(nlog^2n)怎么常数差距就这么大呢,,,
同是LCT 怎么我的和Po姐姐的常数差距就这么大呢
我绝对是脑子被驴踢了才写这个垃圾算法
//By SiriusRen
#include <bits/stdc++.h>
using namespace std;
const int N=;
int n,m,q,xx,yy,zz,tim[N],cnt;
int first[N],next[N],v[N],tot;
int fa[N],maxx[N],ch[N][],rev[N],Q[N],top,opersize;
const int LIMIT=;
char in[LIMIT],*p=in;
inline int getInt(){
register int res=;
while (*p<''||*p>'')*p++;
while (*p>=''&&*p<='')res=res*+*p++-'';
return res;
}
struct Road{
int from,to,wei;Road(){}
Road(int z,int t,int e){from=z,to=t,wei=e;};
}road[N],node[N];
void add(int x,int y){v[++tot]=y,next[tot]=first[x],first[x]=tot;}
bool isroot(int q){return ch[fa[q]][]!=q&&ch[fa[q]][]!=q;}
void push_up(int p){
maxx[p]=p;
if(node[maxx[ch[p][]]].wei>node[maxx[p]].wei)maxx[p]=maxx[ch[p][]];
if(node[maxx[ch[p][]]].wei>node[maxx[p]].wei)maxx[p]=maxx[ch[p][]];
}
void push_down(int p){rev[ch[p][]]^=,rev[ch[p][]]^=,rev[p]=,swap(ch[p][],ch[p][]);}
void rotate(int p){
int q=fa[p],y=fa[q],x=(ch[q][]==p);
ch[q][x]=ch[p][!x],fa[ch[q][x]]=q;
ch[p][!x]=q,fa[p]=y;
if(!isroot(q)){
if(ch[y][]==q)ch[y][]=p;
if(ch[y][]==q)ch[y][]=p;
}fa[q]=p;push_up(q);
}
void splay(int x){
Q[++top]=x;
for(int i=x;!isroot(i);i=fa[i])Q[++top]=fa[i];
while(top){if(rev[Q[top]])push_down(Q[top]);top--;}
for(int y=fa[x];!isroot(x);rotate(x),y=fa[x])if(!isroot(y)){
if((ch[y][]==x)^(ch[fa[y]][]==y))rotate(x);
else rotate(y);
}push_up(x);
}
void access(int x){for(int t=;x;t=x,x=fa[x])splay(x),ch[x][]=t,push_up(x);}
void makeroot(int x){access(x),splay(x),rev[x]^=;}
bool connected(int x,int y){while(fa[x])x=fa[x];while(fa[y])y=fa[y];return x==y;}
void link(int x,int y){makeroot(x),fa[x]=y;}
void split(int x,int y){makeroot(x),access(y),splay(y);}
void cut(int x,int y){split(x,y),ch[y][]=fa[x]=;push_up(y);}
void insert(int l,int r,int pos,int L,int R,int wei){
if(l>=L&&r<=R){add(pos,wei);return;}
int mid=(l+r)>>,lson=pos<<,rson=lson|;
if(mid<L)insert(mid+,r,rson,L,R,wei);
else if(mid>=R)insert(l,mid,lson,L,R,wei);
else insert(l,mid,lson,L,R,wei),insert(mid+,r,rson,L,R,wei);
}
pair<bool,int>oper[N];
void dfs(int l,int r,int pos,long long ans){
int bottom=opersize;
for(int i=first[pos];i;i=next[i]){
Road temp=node[v[i]];
if(temp.from==temp.to)continue;
if(connected(temp.from,temp.to)){
split(temp.from,temp.to);
int tmp=maxx[temp.to];
if(node[tmp].wei<=temp.wei)continue;
ans-=node[tmp].wei;
cut(tmp,node[tmp].from),cut(tmp,node[tmp].to);
oper[++opersize]=make_pair(,tmp);
}
ans+=temp.wei;
link(v[i],temp.from),link(v[i],temp.to);
oper[++opersize]=make_pair(,v[i]);
}
int mid=(l+r)>>,lson=pos<<,rson=lson|;
if(l==r){if(mid)printf("%lld\n",ans);}
else dfs(l,mid,lson,ans),dfs(mid+,r,rson,ans);
while(opersize>bottom){
pair<bool,int>jy=oper[opersize--];
if(!jy.first)link(jy.second,node[jy.second].from),link(jy.second,node[jy.second].to);
else cut(jy.second,node[jy.second].from),cut(jy.second,node[jy.second].to);
}
}
int main(){
fread(p,,LIMIT,stdin);
n=getInt(),m=getInt(),q=getInt();
for(int i=;i<=m;i++)xx=getInt(),yy=getInt(),zz=getInt(),road[i]=Road(xx,yy,zz);
for(int i=;i<=n;i++)node[i].wei=-;
for(int i=;i<=q;i++){
xx=getInt(),zz=getInt(),
node[++cnt+n]=road[xx];
insert(,q,,tim[xx],i-,cnt+n);
tim[xx]=i,road[xx].wei=zz;
}
for(int i=;i<=m;i++)node[++cnt+n]=road[i],insert(,q,,tim[i],q,cnt+n);
dfs(,q,,);
}


就当我理论AC了吧,,,
BZOJ 2001 线段树+LCT (TLE)的更多相关文章
- BZOJ 3779: 重组病毒(线段树+lct+树剖)
题面 escription 黑客们通过对已有的病毒反编译,将许多不同的病毒重组,并重新编译出了新型的重组病毒.这种病毒的繁殖和变异能力极强.为了阻止这种病毒传播,某安全机构策划了一次实验,来研究这种病 ...
- 【SDOI2017】树点染色【线段树+LCT】
本来只是想练练LCT,没想到是个线段树 对于操作1:诶新的颜色?这不是access吗? 也就是说,我们用一棵splay来表示一种颜色 操作2直接在LCT上乱搞-- 不对啊,操作3要查子树 诶好像是静态 ...
- bzoj 1018 线段树维护连通性
本题将一道LCT的题特殊化(支持加边和删边,询问图的连通性),将图变成了2×m的网格图,然后就神奇地可以用线段树来维护. 对于每个区间[l,r],维护其四个角落之间的连通性(仅仅通过[l,r]这段的边 ...
- Cogs 1688. [ZJOI2008]树的统计Count(树链剖分+线段树||LCT)
[ZJOI2008]树的统计Count ★★★ 输入文件:bzoj_1036.in 输出文件:bzoj_1036.out 简单对比 时间限制:5 s 内存限制:162 MB [题目描述] 一棵树上有n ...
- BZOJ 1798 (线段树||分块)的标记合并
我原来准备做方差的.. 结果发现不会维护两个标记.. 就是操作变成一个 a*x+b ,每次维护a , b 即可 加的时候a=1 ,b=v 乘的时候a=v ,b=0 #include <cstdi ...
- bzoj 3999 线段树区间提取 有序链剖
看错题目了,想成每个城市都可以买一个东西,然后在后面的某个城市卖掉,问最大收益.这个可以类似维护上升序列的方法在O(nlog^3n)的时间复杂度内搞定 这道题用到的一些方法: 1. 可以将有关的线段提 ...
- bzoj 3211 线段树
开方操作最多进行5次就可以把出现的任何数变成1. 所以用线段树暴力修改,以后修改时只需看一下是否当前区间都是0或1,如果是那么就直接返回. /***************************** ...
- bzoj 3212 线段树
裸的线段树 /************************************************************** Problem: User: BLADEVIL Langua ...
- bzoj 2120 线段树套平衡树
先吐下槽,改了快一个小时,最后发现是SBT的delete写错了,顿时就有想死的心..... 首先对于这道题,我们应该先做一下他的小问题,bzoj1878,虽然和这道题几乎一点关系没有, 但是能给我们一 ...
随机推荐
- python re模块与正则
1. re模块 1.1 转义符 正则表达式中的转义符在python的字符串中也刚好有转移的作用,但是正则表达式中的转义符和字符串中的转义符并没关系,且还容易有冲突. 为了避免这种冲突,我们所有的正则都 ...
- Unity常用常找(二)
本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/51315050 作者:car ...
- 百练4103:踩方格(DFS)
描述 有一个方格矩阵,矩阵边界在无穷远处.我们做如下假设:a. 每走一步时,只能从当前方格移动一格,走到某个相邻的方格上:b. 走过的格子立即塌陷无法再走第二次:c. 只能向北.东. ...
- 【Codeforces 382C】Arithmetic Progression
[链接] 我是链接,点我呀:) [题意] 让你在n个数字中再加入一个数字 使得这n+1个数字排序之后 相邻两个数字的差都相同 [题解] 注意相邻为0的情况 这种情况 只有全都相同才行 只有一种情况 然 ...
- pat甲级 1107. Social Clusters (30)
When register on a social network, you are always asked to specify your hobbies in order to find som ...
- P - FatMouse and Cheese 记忆化搜索
FatMouse has stored some cheese in a city. The city can be considered as a square grid of dimension ...
- 复习es6-解构赋值+字符串的扩展
1. 数组的解构赋值 从数组中获得变量的值,给对应的声明变量赋值,,有次序和对应位置赋值 解构赋值的时候右边必须可以遍历 解构赋值可以使用默认值 惰性求值,当赋值时候为undefined时候,默认是个 ...
- python 除法总返回浮点
python 除法总返回浮点,要返回整型需要用//: print(type(4/2),type(4//2)) #<class 'float'> <class 'int'>
- 怎样用EA设计ER图
我们开发系统从文档開始,而EA就是替我们开发文档的好工具.结束了我们从概念设计到逻辑设计中的非常多问题.完好我们的文档. 如今就给大家说说如何在EA中设计概念模型ER图: 首先打开EA-"新 ...
- LeetCode 645. Set Mismatch (集合不匹配)
The set S originally contains numbers from 1 to n. But unfortunately, due to the data error, one of ...