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] ...
随机推荐
- Python进阶-打包程序为exe
操作系统:win7 x64 运行环境:Python3.5 安装PyInstaller 第一步:下载PyInstaller https://github.com/pyinstaller/pyinstal ...
- 【Codeforces 364A】Matrix
[链接] 我是链接,点我呀:) [题意] 让你求出b[i][j]=s[i]*s[j]规则构成的矩阵 的所有子矩阵中子矩阵的和为a的子矩阵的个数 [题解] (x,y,z,t) 会发现它的和就是sum(x ...
- c++ 上机实验题
c++语言俺是不会啦,但是朋友考试需要,那只能勉为其难的入门下做做考试题了. 以下就是具体的题目和答案: ----------------------------------------------- ...
- [luoguP1220] 关路灯(DP)
传送门 如果去关某一个灯,那么途中经过的灯都能关闭,那么就是连续一段区间,区间DP. f[i][j][0] 表示关完 i, j 这个区间且在 i 这个位置 f[i][j][1] 表示关完 i, j 这 ...
- Win32编程API 基础篇 -- 5.使用资源
使用资源 你可能想参考教程结尾的附近,为了获得跟VC++和BC++资源相关的信息. 在我们讲得更加深入之前,我将大致讲解一下资源的主题,这样在每个小节中我就不必再去重讲一遍了.在这一小节中,你不需要编 ...
- 这个贴子的内容值得好好学习--实例详解Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化
感觉要DJANGO用得好,ORM必须要学好,不管理是内置的,还是第三方的ORM. 最最后还是要到SQL.....:( 这一关,慢慢练啦.. 实例详解Django的 select_related 和 p ...
- 洛谷—— P3811 【模板】乘法逆元
https://www.luogu.org/problem/show?pid=3811 题目背景 这是一道模板题 题目描述 给定n,p求1~n中所有整数在模p意义下的乘法逆元. 输入输出格式 输入格式 ...
- tapset::iosched(3)
DESCRIPTION This family of probe points is used to probe the IO scheduler activities. It contains th ...
- Luca Canali
https://github.com/LucaCanali http://cern.ch/canali/
- NetCore +EFCore+SqlServer根据数据库生成实体类到项目中
转载自:https://www.cnblogs.com/yangjinwang/p/9516988.html 1.点击“工具”->“NuGet包管理器”->“程序包管理器控制台” 分别安装 ...