同是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. 通过request对象获取客户端的相关信息

    通过request对象获取客户端的相关信息 制作人:全心全意 通过request对象可以获取客户端的相关信息.例如HTTP报头信息.客户信息提交方式.客户端主机IP地址.端口号等等. request获 ...

  2. FJoi2017 1月20日模拟赛 交错和(等差数列+rmq)

    [题目描述] 无限循环数字串S由长度为n的循环节s构成.设s为12345(n=5),则数字串S为123451234512345… 设Si为S的第i位数字,在上面的例子中,S1=1,S2=2,S6=1. ...

  3. ebay 如何获取用户token

    1. 首先 配置环境加载依赖的ebay SDK 下载地址 https://go.developer.ebay.com/ebay-sdks 需要在本地仓库安装下面的jar mvn install:ins ...

  4. Spring 获取当前activeProfile

    WebApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(getServletContext()) ...

  5. noip模拟赛 洗衣

    分析:好神的一道题啊.对每棵树建个图跑一下floyd可以有40分,想要打出正解就得对树有比较深的认识了. 每次新生成一棵树都是由两棵树i,j拼成的,答案为原来两棵树的答案和+i中每个点到j中每个点的距 ...

  6. 爬虫——使用ItemLoader维护item

    在item的Filed()中设置参数函数,可以用来预处理item字段的数据,另一方面也方便程序代码的管理和重用 item中 from scrapy.loader.processors import M ...

  7. codevs3730 无线网络发射选址

    题目描述 Description 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的129条东西向街道和129条南北向街道所形 ...

  8. 浪潮服务器装机RAID

    下面是在装浪潮服务器NF8480M5收集的资料,但是NF8480M5服务器没有网上说的webBIOS界面需要按住DEL进BIOS,将启动都禁止了再重启,进入页面配置. http://blog.51ct ...

  9. Python3基础(六) 深入list列表

    正如Python FAQ1附录中说的, Python中任何值都是一个对象,所以任何类型(int.str.list-)都是一个类.而类就必然有它的方法或属性,我们要记下这么多类的所有方法显然是不可能的, ...

  10. JAVA学习(三):Java基础语法(变量、常量、数据类型、运算符与数据类型转换)

    Java基础语法(变量.常量.数据类型.运算符与数据类型转换) 1.变量 Java中.用户能够通过指定数据类型和标识符来声明变量.其基本的语法为: DataType identifier; 或 Dat ...