BZOJ 3779 LCT 线段树 DFS序 坑
hhhh抄了半天lty代码最后T了 对拍也没事..
药丸
mine
#pragma GCC optimize("O3")
//By SiriusRen
#include <bits/stdc++.h>
using namespace std;
const int N=;
typedef long long ll;
int n,m,xx,yy,first[N],next[N*],v[N*],tot;
int in[N],out[N],deep[N],p[N],f[N][],cnt,lazy[N*];
int fa[N],ch[N][],rev[N],q[N],top,root;
ll sum[N*];char op[];
void add(int x,int y){v[tot]=y,next[tot]=first[x],first[x]=tot++;}
void dfs(int x){
in[x]=++cnt,p[cnt]=x;
for(int i=first[x];~i;i=next[i])if(!deep[v[i]])
deep[v[i]]=deep[x]+,f[v[i]][]=x,fa[v[i]]=x,dfs(v[i]);
out[x]=cnt;
}
int lca(int x,int y){
if(deep[x]<deep[y])swap(x,y);
for(int i=;~i;i--)if(deep[f[x][i]]>=deep[y])x=f[x][i];
if(x==y)return x;
for(int i=;~i;i--)if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
return f[x][];
}
int _lca(int x,int y){for(int i=;~i;i--)if(deep[f[x][i]]>deep[y])x=f[x][i];return x;}
void pushup(int pos){sum[pos]=sum[pos<<]+sum[pos<<|];}
void pushdown(int l,int r,int pos){
int mid=(l+r)>>,lson=pos<<,rson=pos<<|;
lazy[lson]+=lazy[pos],sum[lson]+=1ll*(mid-l+)*lazy[pos];
lazy[rson]+=lazy[pos],sum[rson]+=1ll*(r-mid)*lazy[pos];
lazy[pos]=;
}
void build(int l,int r,int pos){
if(l==r){sum[pos]=deep[p[l]];return;}
int mid=(l+r)>>,lson=pos<<,rson=pos<<|;
build(l,mid,lson),build(mid+,r,rson),pushup(pos);
}
void insert(int l,int r,int pos,int L,int R,int wei){
if(l>=L&&r<=R){lazy[pos]+=wei;sum[pos]+=1ll*wei*(r-l+);return;}
if(lazy[pos])pushdown(l,r,pos);
int mid=(l+r)>>,lson=pos<<,rson=pos<<|;
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);
pushup(pos);
}
ll query(int l,int r,int pos,int L,int R){
if(l>=L&&r<=R)return sum[pos];
if(lazy[pos])pushdown(l,r,pos);
int mid=(l+r)>>,lson=pos<<,rson=pos<<|;
if(mid<L)return query(mid+,r,rson,L,R);
else if(mid>=R)return query(l,mid,lson,L,R);
else return query(l,mid,lson,L,R)+query(mid+,r,rson,L,R);
}
bool isroot(int x){return ch[fa[x]][]!=x&&ch[fa[x]][]!=x;}
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;
}
void push_down(int x){if(rev[x])rev[ch[x][]]^=,rev[ch[x][]]^=,swap(ch[x][],ch[x][]),rev[x]=;}
void Pushdown(int x){
q[++top]=x;
for(int i=x;!isroot(i);i=fa[i])q[++top]=fa[i];
while(top)push_down(q[top]),top--;
}
void splay(int x){
Pushdown(x);
for(int y=fa[x];!isroot(x);rotate(x),y=fa[x])if(!isroot(y)){
if((ch[fa[y]][]==y)^(ch[y][]==x))rotate(x);
else rotate(y);
}
}
void find(int x,int y){
Pushdown(x);
while(ch[x][])x=ch[x][],Pushdown(x);
if(x==root)insert(,n,,,n,y);
else if(lca(x,root)!=x)insert(,n,,in[x],out[x],y);
else{
int t1=_lca(root,x);
if(in[t1]^)insert(,n,,,in[t1]-,y);
if(out[t1]^n)insert(,n,,out[t1]+,n,y);
}
}
void access(int x){
for(int t=;x;ch[x][]=t,t=x,x=fa[x]){
splay(x);if(ch[x][])find(ch[x][],);if(t)find(t,-);
}
}
void makeroot(int x){access(x),splay(x),rev[x]^=,root=x;}
ll Query(int x,int k){
if(x==root)return k?n:query(,n,,,n);
if(lca(x,root)!=x)return k?out[x]-in[x]+:query(,n,,in[x],out[x]);
int t1=_lca(root,x);ll r=;
if(in[t1]^)r=k?in[t1]-:query(,n,,,in[t1]-);
if(out[t1]^n)r+=k?n-out[t1]:query(,n,,out[t1]+,n);
return r;
}
inline int read(){
int x=;char p=getchar();
while(p<''||p>'')p=getchar();
while(p>=''&&p<='')x=x*+p-'',p=getchar();
return x;
}
int main(){
memset(first,-,sizeof(first));
scanf("%d%d",&n,&m);
for(int i=;i<n;i++)xx=read(),yy=read(),add(xx,yy),add(yy,xx);
root=deep[]=,dfs(),build(,n,);
for(int j=;j<;j++)for(int i=;i<=n;i++)f[i][j]=f[f[i][j-]][j-];
while(m--){
scanf("%s",op),xx=read();
if(op[]=='L')access(xx);
else if(op[]=='C')makeroot(xx);
else if(op[]=='Q')printf("%.10f\n",(double)Query(xx,)/Query(xx,));
}
}
lty
#include <cstdio>
#include <algorithm>
#define M ((L+R)>>1)
#define lc o<<1
#define rc o<<1|1
#define ls lc,L,M
#define rs rc,M+1,R
#define f(x) t[x].p
#define l(x) t[x].s[0]
#define r(x) t[x].s[1]
#define LC(x) (r(f(x))==x)
#define st(a,b,c) t[a].s[b]=c;f(c)=a typedef long long ll;
const int N=,B=;
char op[]; int n,m,x,y,e,tt,sd,hd[N],nx[B],to[B],bg[N],ed[N],f[N][],d[N],p[N],v[N*]; ll sm[N*];
struct nd {int p,rv,s[];}t[N];
void ad(int x,int y) {to[++e]=y,nx[e]=hd[x],hd[x]=e;} void dfs(int x) {
bg[x]=++tt,p[tt]=x;
for(int i=hd[x];i;i=nx[i]) if(!d[to[i]]) d[to[i]]=d[x]+,f[to[i]][]=x,f(to[i])=x,dfs(to[i]);
ed[x]=tt;
}
int lca(int x,int y) {
if(d[x]<d[y]) std::swap(x,y);
for(int i=;~i;i--) if(d[f[x][i]]>=d[y]) x=f[x][i];
if(x==y) return x;
for(int i=;~i;i--) if(f[x][i]^f[y][i]) x=f[x][i],y=f[y][i];
return f[x][];
}
int _lca(int x,int y) {for(int i=;~i;i--) if(d[f[x][i]]>d[y]) x=f[x][i]; return x;}
void pu(int o) {sm[o]=sm[lc]+sm[rc];}
void bd(int o,int L,int R) {
if(L==R) {sm[o]=d[p[L]]; return;}
bd(ls),bd(rs),pu(o);
}
void PD(int o,int L,int R) {if(v[o]) v[lc]+=v[o],v[rc]+=v[o],sm[lc]+=(ll)(M-L+)*v[o],sm[rc]+=(ll)(R-M)*v[o],v[o]=;}
void upd(int o,int L,int R,int l,int r,int x) {
if(l<=L&&r>=R) {v[o]+=x,sm[o]+=(ll)x*(R-L+); return;}
PD(o,L,R);
if(l<=M) upd(ls,l,r,x); if(r>M) upd(rs,l,r,x);
pu(o);
}
ll qr(int o,int L,int R,int l,int r) {
if(l<=L&&r>=R) return sm[o];
PD(o,L,R);
if(r<=M) return qr(ls,l,r);
if(l>M) return qr(rs,l,r);
return qr(ls,l,r)+qr(rs,l,r);
} bool rt(int x) {return l(f(x))!=x&&r(f(x))!=x;}
void _pd(int x) {if(t[x].rv) t[l(x)].rv^=,t[r(x)].rv^=,std::swap(l(x),r(x)),t[x].rv=;}
void pd(int x) {if(!rt(x)) pd(f(x)); _pd(x);}
void rot(int x) {int y=f(x),lx=LC(x); st(y,lx,t[x].s[!lx]); if(!rt(y)) st(f(y),LC(y),x); st(x,!lx,y);}
void sp(int x) {pd(x); for(int y=f(x);!rt(x);rot(x),y=f(x)) if(!rt(y)) {if(LC(x)^LC(y)) rot(x); else rot(y);}}
void fd(int x,int y) {
_pd(x);
while(l(x)) x=l(x),_pd(x);
if(x==sd) upd(,,n,,n,y);
else if(lca(x,sd)^x) upd(,,n,bg[x],ed[x],y);
else {
int t1=_lca(sd,x);
if(bg[t1]^) upd(,,n,,bg[t1]-,y);
if(ed[t1]^n) upd(,,n,ed[t1]+,n,y);
}
}
void acs(int x) {
for(int y=;x;r(x)=y,y=x,x=f(x)) {
sp(x);
if(r(x)) fd(r(x),);
if(y)fd(y,-);
}
}
void mk(int x) {acs(x),sp(x),t[x].rv^=,sd=x;}
ll qs(int x,int k) {
if(x==sd) return k?n:qr(,,n,,n);
if(lca(x,sd)^x) return k?ed[x]-bg[x]+:qr(,,n,bg[x],ed[x]);
int t1=_lca(sd,x); ll r=;
if(bg[t1]^) r=k?bg[t1]-:qr(,,n,,bg[t1]-);
if(ed[t1]^n) r+=k?n-ed[t1]:qr(,,n,ed[t1]+,n);
return r;
} int main() {
scanf("%d%d",&n,&m);
for(int i=;i<n;i++) scanf("%d%d",&x,&y),ad(x,y),ad(y,x);
sd=d[]=,dfs(),bd(,,n);
for(int j=;j<;j++) for(int i=;i<=n;i++) f[i][j]=f[f[i][j-]][j-];
while(m--) {
scanf("%s%d",op,&x);
if(op[]=='L') acs(x);
else if(op[]=='C') mk(x);
else if(op[]=='Q') printf("%.10f\n",(double)qs(x,)/qs(x,));
}
return ;
}
//By SiriusRen
#include <ctime>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define rd (rand()|rand()<<15)
int seed;
const int mod=;
int main(){
freopen("seed.txt","r",stdin);
scanf("%d",&seed);
srand(seed+time());
rand();rand();rand();rand();rand();rand();rand();rand();rand();rand();rand();rand();
rand();rand();rand();rand();rand();rand();rand();rand();rand();rand();rand();rand();
rand();rand();rand();rand();rand();rand();rand();rand();rand();rand();rand();rand();
rand();rand();rand();rand();rand();rand();rand();rand();rand();rand();rand();rand();
rand();rand();rand();rand();rand();rand();rand();rand();rand();rand();rand();rand();
freopen("seed.txt","w",stdout);
freopen("in.txt","w",stdout);
int n=,m=;
printf("%d %d\n",n,m);
for(int i=;i<=n;i++)printf("%d %d\n",rand()%(i-)+,i);
for(int i=;i<=m;i++){
int t=rand()%;
if(t==)printf("RELEASE %d\n",rand()%n+);
else if(t==)printf("RECENTER %d\n",rand()%n+);
else printf("REQUEST %d\n",rand()%n+);
}
}
//By SiriusRen
#include <ctime>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int cases,xx;
int main(){
while(){
printf("case # %d\n",++cases);
system("mk.exe");
long tim=clock();
system("a.exe<in.txt>out1.txt");
printf("programme a time=%ld\n",clock()-tim);
tim=clock();
system("b.exe<in.txt>out2.txt");
printf("programme b time=%ld\n",clock()-tim);
if(system("fc out1.txt out2.txt")){
puts("Wrong Answer");
while();
}printf("Accepted\n\n");
}
}
BZOJ 3779 LCT 线段树 DFS序 坑的更多相关文章
- 【bzoj4817】树点涂色 LCT+线段树+dfs序
Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. ...
- 洛谷3703 SDOI2017树点涂色(LCT+线段树+dfs序)
又一道好题啊qwqqqq 一开始看这个题,还以为是一个树剖的什么毒瘤题目 (不过的确貌似可以用树剖啊) qwq这真是一道\(LCT\)维护颜色的好题 首先,我们来一个一个操作的考虑. 对于操作\(1\ ...
- 【XSY2534】【BZOJ4817】树点涂色 LCT 倍增 线段树 dfs序
题目大意 Bob有一棵\(n\)个点的有根树,其中\(1\)号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜 ...
- Tsinsen A1505. 树(张闻涛) 倍增LCA,可持久化线段树,DFS序
题目:http://www.tsinsen.com/A1505 A1505. 树(张闻涛) 时间限制:1.0s 内存限制:512.0MB 总提交次数:196 AC次数:65 平均分: ...
- BZOJ_3252_攻略_线段树+dfs序
BZOJ_3252_攻略_线段树+dfs序 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏< ...
- S - Query on a tree HDU - 3804 线段树+dfs序
S - Query on a tree HDU - 3804 离散化+权值线段树 题目大意:给你一棵树,让你求这棵树上询问的点到根节点直接最大小于等于val的长度. 这个题目和之前写的那个给你一棵 ...
- HDU 5692 线段树+dfs序
Snacks Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- BZOJ 4034 线段树+DFS序
思路: 先搞出来每个点的DFS序 (要有入栈和出栈两种状态的) 处理出来 线段树区间有多少入栈的和多少出栈的 加区间的时候就加(入-出)*wei 查前缀和 //By SiriusRen #includ ...
- 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序
3779: 重组病毒 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 224 Solved: 95[Submit][Status][Discuss] ...
随机推荐
- 利用stylist插件,简单两步屏蔽新浪微博上的广告
以前新浪微博只是在侧栏有几块小小的广告,还算可以接受,想着忍忍就算了,可最近真是越来越不厚道了,自从和淘宝合作之后,侧栏就开始有一大块广告根据你在淘宝的搜索记录推荐商品,更可恶的是信息流里的祛痘微博现 ...
- 51NOD 1154 回文串的划分(DP)
思路:参考了网上,思路很清奇,借助vis[i][j]来表示从i到j是否为回文串,回文串这边是用的双重循环来写的:dp[i]用来表示以i结尾的字符串最少的回文串有多长. #include<cstr ...
- 【Codeforces 264B】Good Sequences
[链接] 我是链接,点我呀:) [题意] 让你在一个递增数组中选择一个最长子序列使得gcd(a[i],a[i+1])>1 [题解] 设f[i]表示以一个"含有素因子i的数字" ...
- 使用pycharm学习django纪实
之前已经下了python3.7 首先官网下载pycharm专业版,然后利用学生邮箱激活 新建django项目,使用虚拟环境就好了,方便之后的服务器部署(大概 找到博客开始学习:https://blog ...
- 47. Spring Boot发送邮件【从零开始学Spring Boot】
(提供源代码) Spring提供了非常好用的JavaMailSender接口实现邮件发送.在Spring Boot的Starter模块中也为此提供了自动化配置.下面通过实例看看如何在Spring Bo ...
- IDA 宏定义
/* This file contains definitions used by the Hex-Rays decompiler output. It has type definitions an ...
- Ubuntu桌面卡死时的处理
1.这种方式可以尝试,但是不成功 sudo skill x sudo stop lightdm sudo start lightdm 2.这种方式比较可靠 ps -t tty7 kill 27342 ...
- 符号变换引擎(Symbol Transform Engine - STE)
在写编译器的过程中.我意识到编译事实上是一种符号变换,比方C语言编译成机器码,事实上是C源代码文件里的符号变换成EXE的16进制符号,这和中文翻译成英语的语言翻译器没什么差别. 每一个程序猿都有自己喜 ...
- 导入数据到mysql的一种简单的方法
由于ubuntu默认自带的mysql版本号为5.5,并不能使用load data infile这样的高级的功能,因此我们写了一个通用的脚本来上传文件 shell脚本 cat ./employee.cs ...
- java集合: List、Set、Map总结 + HashMap/Hashtable 差别
List:(有序,能够反复)通过下标索引 ----ArrayList 可变数组,随机查找 ----LinkedList 链表,不论什么位置插入删除快 ----Vecto ...