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序 坑的更多相关文章

  1. 【bzoj4817】树点涂色 LCT+线段树+dfs序

    Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. ...

  2. 洛谷3703 SDOI2017树点涂色(LCT+线段树+dfs序)

    又一道好题啊qwqqqq 一开始看这个题,还以为是一个树剖的什么毒瘤题目 (不过的确貌似可以用树剖啊) qwq这真是一道\(LCT\)维护颜色的好题 首先,我们来一个一个操作的考虑. 对于操作\(1\ ...

  3. 【XSY2534】【BZOJ4817】树点涂色 LCT 倍增 线段树 dfs序

    题目大意 ​ Bob有一棵\(n\)个点的有根树,其中\(1\)号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜 ...

  4. Tsinsen A1505. 树(张闻涛) 倍增LCA,可持久化线段树,DFS序

    题目:http://www.tsinsen.com/A1505 A1505. 树(张闻涛) 时间限制:1.0s   内存限制:512.0MB    总提交次数:196   AC次数:65   平均分: ...

  5. BZOJ_3252_攻略_线段树+dfs序

    BZOJ_3252_攻略_线段树+dfs序 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏< ...

  6. S - Query on a tree HDU - 3804 线段树+dfs序

    S - Query on a tree HDU - 3804   离散化+权值线段树 题目大意:给你一棵树,让你求这棵树上询问的点到根节点直接最大小于等于val的长度. 这个题目和之前写的那个给你一棵 ...

  7. HDU 5692 线段树+dfs序

    Snacks Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  8. BZOJ 4034 线段树+DFS序

    思路: 先搞出来每个点的DFS序 (要有入栈和出栈两种状态的) 处理出来 线段树区间有多少入栈的和多少出栈的 加区间的时候就加(入-出)*wei 查前缀和 //By SiriusRen #includ ...

  9. 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序

    3779: 重组病毒 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 224  Solved: 95[Submit][Status][Discuss] ...

随机推荐

  1. Python基础(十一) 异常处理

    在程序运行过程中,总会遇到各种各样的错误,有的错误是程序编写有问题造成的,比如本来应该输出整数结果输出了字符串,这样的错误我们通常称之为BUG,BUG是必须修复的.在Python中内置了一套异常处理机 ...

  2. [luoguP2701] [USACO5.3]巨大的牛棚Big Barn(DP)

    传送门 经典问题. 找出最大的不包含 1 的正方形. f[i][j] 表示 以 (i,j) 结尾的最大的不包含 1 的正方形 f[i][j] = min(f[i - 1][j], f[i][j - 1 ...

  3. The Balance POJ 2142 扩展欧几里得

    Description Ms. Iyo Kiffa-Australis has a balance and only two kinds of weights to measure a dose of ...

  4. SQL Server memory – Internals

    https://blogs.msdn.microsoft.com/karthick_pk/2013/03/16/sql-server-memory-internals/

  5. postgresql 删除旧的版本9.5 并同时 升级到9.6

    sudo apt-get purge postgresql-9.5 On Ubuntu 14.04 I have done this to get the latest postgres: sudo ...

  6. 在psql客户端中修改函数

    \ef 创建一个新的函数. \df 显示已经创建的函数. \df+    somefunc 显示这个函数的详细定义 \ef   somefunc 编辑这个函数, 编辑保存退出之后,要执行 \g ,刚才 ...

  7. 红帽/CentOS ext4无法格式化大分区

    红帽/CentOS 6.5的e2fsprogs版本号为1.41.12较低.无法创建16TB以上的文件系统 下载最新的e2fsprogs,编译安装 ftp://ftp.ntu.edu.tw/linux/ ...

  8. OpenCV2马拉松第17圈——边缘检測(Canny边缘检測)

    计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g 收入囊中 利用OpenCV Canny函数进行边缘检測 掌握Canny算法基本理论 ...

  9. URAL 2031. Overturned Numbers (枚举)

    2031. Overturned Numbers Time limit: 1.0 second Memory limit: 64 MB Little Pierre was surfing the In ...

  10. 【Cocos2dx游戏开发】CCNotificationCenter传递消息和数据

    在开发游戏的时候我们经常需要在层与层之间.场景与场景之间传递数据和消息,Cocos2dx框架应用观察者模式为我们封装了一个CCNotificationCenter类,也叫消息通知中心,它也是一个单例类 ...