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爬虫24 | 搞事情了,用 Appium 爬取你的微信朋友圈。
昨天小帅b看到一些事情不顺眼 有人偷换概念 忍不住就写了一篇反讽 996 的 看不下去了,我支持996,年轻人就该996! 没想到有些人看不懂 这就算了 还来骂我 早些时候关注我的小伙伴应该知道我第一 ...
- 超星toPDF
* ssReader to pdf Note: editor: Emacs-org 1. download and open the book with sspreader 2. click ...
- 如何卸载 win10 自带的“电影和电视”软件
参考这里: https://answers.microsoft.com/zh-hans/windows/forum/apps_windows_10-movies/win10%E7%9A%84%E7%9 ...
- PAT 1121 Damn Single
"Damn Single (单身狗)" is the Chinese nickname for someone who is being single. You are suppo ...
- slf4j+log4j2的配置
昨天自己测试了一下slf4j+log4j2的配置,可以正常使用,虽然配置十分简单,但好记性不如烂笔头,想想还是记录下来吧. 运行的环境:jdk1.7.tomcat7.Maven的web项目 1.在新建 ...
- java nio--采用Selector实现Socket通信
server: /** * 选择器服务端 * Created by ascend on 2017/6/9 9:30. */ public class SelectorServer { // publi ...
- 【Codeforces 486C】Palindrome Transformation
[链接] 我是链接,点我呀:) [题意] 光标一开始在p的位置 你可以用上下左右四个键位移动光标(左右)或者更改光标所在的字符(上下增加或减少ascill码) 问你最少要操作多少次才能使得字符串变成回 ...
- 九度oj 题目1089:数字反转
题目1089:数字反转 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3531 解决:1935 题目描述: 12翻一下是21,34翻一下是43,12+34是46,46翻一下是64,现在又任 ...
- - > 贪心基础入门讲解一——完美字符串
约翰认为字符串的完美度等于它里面所有字母的完美度之和.每个字母的完美度可以由你来分配,不同字母的完美度不同,分别对应一个1-26之间的整数. 约翰不在乎字母大小写.(也就是说字母F和f)的完美度相同. ...
- something interesting when read docs
When you kill a session with "ALTER SYSTEM KILL SESSION '' ". If the session is performin ...