同是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)的更多相关文章

  1. BZOJ 3779: 重组病毒(线段树+lct+树剖)

    题面 escription 黑客们通过对已有的病毒反编译,将许多不同的病毒重组,并重新编译出了新型的重组病毒.这种病毒的繁殖和变异能力极强.为了阻止这种病毒传播,某安全机构策划了一次实验,来研究这种病 ...

  2. 【SDOI2017】树点染色【线段树+LCT】

    本来只是想练练LCT,没想到是个线段树 对于操作1:诶新的颜色?这不是access吗? 也就是说,我们用一棵splay来表示一种颜色 操作2直接在LCT上乱搞-- 不对啊,操作3要查子树 诶好像是静态 ...

  3. bzoj 1018 线段树维护连通性

    本题将一道LCT的题特殊化(支持加边和删边,询问图的连通性),将图变成了2×m的网格图,然后就神奇地可以用线段树来维护. 对于每个区间[l,r],维护其四个角落之间的连通性(仅仅通过[l,r]这段的边 ...

  4. Cogs 1688. [ZJOI2008]树的统计Count(树链剖分+线段树||LCT)

    [ZJOI2008]树的统计Count ★★★ 输入文件:bzoj_1036.in 输出文件:bzoj_1036.out 简单对比 时间限制:5 s 内存限制:162 MB [题目描述] 一棵树上有n ...

  5. BZOJ 1798 (线段树||分块)的标记合并

    我原来准备做方差的.. 结果发现不会维护两个标记.. 就是操作变成一个 a*x+b ,每次维护a , b 即可 加的时候a=1 ,b=v 乘的时候a=v ,b=0 #include <cstdi ...

  6. bzoj 3999 线段树区间提取 有序链剖

    看错题目了,想成每个城市都可以买一个东西,然后在后面的某个城市卖掉,问最大收益.这个可以类似维护上升序列的方法在O(nlog^3n)的时间复杂度内搞定 这道题用到的一些方法: 1. 可以将有关的线段提 ...

  7. bzoj 3211 线段树

    开方操作最多进行5次就可以把出现的任何数变成1. 所以用线段树暴力修改,以后修改时只需看一下是否当前区间都是0或1,如果是那么就直接返回. /***************************** ...

  8. bzoj 3212 线段树

    裸的线段树 /************************************************************** Problem: User: BLADEVIL Langua ...

  9. bzoj 2120 线段树套平衡树

    先吐下槽,改了快一个小时,最后发现是SBT的delete写错了,顿时就有想死的心..... 首先对于这道题,我们应该先做一下他的小问题,bzoj1878,虽然和这道题几乎一点关系没有, 但是能给我们一 ...

随机推荐

  1. 带你全面分析嵌入式linux系统启动过程中uboot的作用

    资料链接:http://mp.weixin.qq.com/s/rYVchD-xy7Bdkc1O3fW2Wg

  2. BZOJ 3993 Luogu P3324 [SDOI2015]星际战争 (最大流、二分答案)

    字符串终于告一段落了! 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3993 (luogu) https://www.l ...

  3. 【Codeforces 382C】Arithmetic Progression

    [链接] 我是链接,点我呀:) [题意] 让你在n个数字中再加入一个数字 使得这n+1个数字排序之后 相邻两个数字的差都相同 [题解] 注意相邻为0的情况 这种情况 只有全都相同才行 只有一种情况 然 ...

  4. 教你 Shiro 整合 SpringBoot,避开各种坑

    教你 Shiro 整合 SpringBoot,避开各种坑-----https://www.cnblogs.com/HowieYuan/p/9259638.html

  5. 1067 Bash游戏 V2

    有一堆石子共有N个.A B两个人轮流拿,A先拿.每次只能拿1,3,4颗,拿到最后1颗石子的人获胜.假设A B都非常聪明,拿石子的过程中不会出现失误.给出N,问最后谁能赢得比赛. 例如N = 2.A只能 ...

  6. Java设计模式补充:回调模式、事件监听器模式、观察者模式(转)

    一.回调函数 为什么首先会讲回调函数呢?因为这个是理解监听器.观察者模式的关键. 什么是回调函数 所谓的回调,用于回调的函数. 回调函数只是一个功能片段,由用户按照回调函数调用约定来实现的一个函数. ...

  7. Setting .xap MIME Type for Silverlight

    http://www.adefwebserver.com/dotnetnukehelp/misc/Silverlight/SettingMimeType.html Windows 2003: In I ...

  8. ubuntu Shell

    Ubuntu下的ShellUbuntu的图形界面也是运行在Shell下的:虚拟终端机开启:Ctrl+Alt+F1~ F6 可以开启6个命令行的ShellCtrl+Alt+F7  开启图形终端机命令su ...

  9. ssh远程连接出现someone counld be eavesdropping on you right now 的错误

    master主机通过ssh远程连接slaves机子时出现下述错误 解决的方法: 一.删除/root/.ssh/下的kown_hosts文件 二.在master机子上又一次运行scp id_dsa.pu ...

  10. mysql 存储引擎的选择你会吗?

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXExMzU1NTQxNDQ4/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...