题目描述:

bz

咕了几个月的题解:

无脑$splay$+树剖。

论复制粘贴在考场上拉分的重要作用。

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 50050;
template<typename T>
inline void read(T&x)
{T f = 1,c = 0;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){c=c*10+ch-'0';ch=getchar();}x = f*c;
}
int n,m,Rt,hed[N],cnt;
struct EG
{int to,nxt;
}e[N<<1];
void ae(int f,int t)
{e[++cnt].to = t;e[cnt].nxt = hed[f];hed[f] = cnt;
}
int dep[N],siz[N],tp[N],son[N],fa[N],tin[N],tout[N],tim,pla[N];
void dfs1(int u,int f)
{fa[u]=f,siz[u]=1,dep[u]=dep[f]+1;for(int j=hed[u],to;j;j=e[j].nxt)if((to=e[j].to)!=f){dfs1(to,u),siz[u]+=siz[to];if(siz[to]>siz[son[u]])son[u]=to;}
}
void dfs2(int u,int Top)
{tp[u]=Top,tin[u]=++tim,pla[tim]=u;if(son[u]){dfs2(son[u],Top);for(int j=hed[u],to;j;j=e[j].nxt)if((to=e[j].to)!=fa[u]&&to!=son[u])dfs2(to,to);}tout[u]=tim;
}
int get_lca(int x,int y)
{while(tp[x]!=tp[y]){if(dep[tp[x]]<dep[tp[y]])swap(x,y);x = fa[tp[x]];}return dep[x]<dep[y]?x:y;
}
struct Splay
{int w[N],mx[N],mn[N],rt,rtt,fa[N],ch[N][2],siz[N];ll tag[N],s[N];bool res[N];void add(int u,ll d){if(u)w[u]+=d,tag[u]+=d,s[u]+=d*siz[u],mx[u]+=d,mn[u]+=d;}void rever(int u){if(u)swap(ch[u][0],ch[u][1]),res[u]^=1;}void pushdown(int u){if(tag[u]){add(ch[u][0],tag[u]);add(ch[u][1],tag[u]);tag[u]=0;}if(res[u]){rever(ch[u][0]);rever(ch[u][1]);res[u] = 0;}}void update(int x){s[x]=s[ch[x][0]]+s[ch[x][1]]+w[x];siz[x]=siz[ch[x][0]]+siz[ch[x][1]]+1;mx[x]=max(w[x],max(mx[ch[x][0]],mx[ch[x][1]]));mn[x]=min(w[x],min(mn[ch[x][0]],mn[ch[x][1]]));}void rotate(int x){int y = fa[x],z = fa[y],k = (ch[y][1]==x);ch[z][ch[z][1]==y]=x,fa[x]=z;ch[y][k]=ch[x][!k],fa[ch[x][!k]]=y;ch[x][!k]=y,fa[y]=x;update(y),update(x);}int sta[N],tl;void down(int x){tl = 0;while(x)sta[++tl]=x,x=fa[x];while(tl)pushdown(sta[tl--]);}void splay(int x,int goal){down(x);while(fa[x]!=goal){int y = fa[x],z = fa[y];if(z!=goal)(ch[y][1]==x)^(ch[z][1]==y)?rotate(x):rotate(y);rotate(x);}if(!goal)rt=x;}void splayy(int x,int goal){down(x);while(fa[x]!=goal){int y = fa[x],z = fa[y];if(z!=goal)(ch[y][1]==x)^(ch[z][1]==y)?rotate(x):rotate(y);rotate(x);}if(!goal)rtt=x;}int build(int l,int r,int f){if(l>r)return 0;int mid = (l+r)>>1;fa[mid] = f;if(!f)rt=mid;ch[mid][0] = build(l,mid-1,mid);ch[mid][1] = build(mid+1,r,mid);update(mid);return mid;}void init(){fa[n+4]=n+3;ch[n+3][1]=n+4;rtt=n+3;siz[n+3]=2,siz[n+4]=1;mn[0]=0x3f3f3f3f,mx[0]=-0x3f3f3f3f;}int get_kth(int u,int k){pushdown(u);int tmp = siz[ch[u][0]];if(k<=tmp)return get_kth(ch[u][0],k);else if(k==tmp+1)return u;else return get_kth(ch[u][1],k-1-tmp);}void split(int l,int r){l = get_kth(rt,l),r = get_kth(rt,r+2);splay(l,0),splay(r,l);}void splitt(int l,int r){l = get_kth(rtt,l),r = get_kth(rtt,r+2);splayy(l,0),splayy(r,l);}int get_kw(int k){int x = get_kth(rt,k+1);return w[x];}ll get_sum(int l,int r){split(l,r);return s[ch[ch[rt][1]][0]];}int get_max(int l,int r){split(l,r);return mx[ch[ch[rt][1]][0]];}int get_min(int l,int r){split(l,r);return mn[ch[ch[rt][1]][0]];}void Inc(int l,int r,int d){split(l,r);add(ch[ch[rt][1]][0],d);update(ch[rt][1]),update(rt);}void mr(int l,int r){split(l,r);int now = get_kth(rtt,2),las = ch[ch[rt][1]][0];splayy(now,0);fa[las]=n+3,ch[n+3][1]=las,ch[ch[rt][1]][0]=0;update(ch[rt][1]),update(rt),update(n+3),update(now);}void rvs(){splayy(n+3,0),splayy(n+4,n+3);rever(ch[ch[rtt][1]][0]);}void ml(int l,int r){int xl = get_kth(rt,l),xr = get_kth(rt,l+1);splay(xr,0),splay(xl,xr);splitt(1,r-l+1);int now = ch[ch[rtt][1]][0];ch[ch[rtt][1]][0]=0,ch[ch[rt][0]][1]=now,fa[now]=ch[rt][0];update(ch[rt][0]),update(rt),update(ch[rtt][1]),update(rtt);}
}tr;
char op[10];
int lst[N],rst[N],tl;
ll queryS(int x,int y)
{ll ret = 0;while(tp[x]!=tp[y]){ret+=tr.get_sum(tin[tp[x]],tin[x]);x = fa[tp[x]];}return ret+tr.get_sum(tin[y],tin[x]);
}
int queryMax(int x,int y)
{int ret = -0x3f3f3f3f;while(tp[x]!=tp[y]){ret = max(ret,tr.get_max(tin[tp[x]],tin[x]));x = fa[tp[x]];}return max(ret,tr.get_max(tin[y],tin[x]));
}
int queryMin(int x,int y)
{int ret = 0x3f3f3f3f;while(tp[x]!=tp[y]){ret = min(ret,tr.get_min(tin[tp[x]],tin[x]));x = fa[tp[x]];}return min(ret,tr.get_min(tin[y],tin[x]));
}
int main()
{read(n),read(m),read(Rt);for(int i=1,u,v;i<n;i++){read(u),read(v);ae(u,v),ae(v,u);}dfs1(Rt,0),dfs2(Rt,Rt);tr.build(1,n+2,0);tr.init();for(int i=1,x,y,w;i<=m;i++){scanf("%s",op+1),read(x),read(y);if(dep[x]>dep[y])swap(x,y);if(op[1]=='I'&&op[3]=='c'){read(w);while(tp[y]!=tp[x]){ tr.Inc(tin[tp[y]],tin[y],w);y = fa[tp[y]];}tr.Inc(tin[x],tin[y],w);}else if(op[1]=='I'&&op[3]=='v'){tl = 0;while(tp[y]!=tp[x]){lst[++tl]=tin[tp[y]],rst[tl]=tin[y];tr.mr(lst[tl],rst[tl]);y = fa[tp[y]];}lst[++tl]=tin[x],rst[tl]=tin[y];tr.mr(lst[tl],rst[tl]);tr.rvs();for(int j=tl;j>=1;j--)tr.ml(lst[j],rst[j]);}else if(op[1]=='S'){int Lca = get_lca(x,y);ll ans = queryS(x,Lca);ans+=queryS(y,Lca);ans-=tr.get_kw(tin[Lca]);printf("%lld\n",ans);}else if(op[1]=='M'&&op[2]=='a'){int Lca = get_lca(x,y);int ans = max(queryMax(x,Lca),queryMax(y,Lca));printf("%d\n",ans);}else{int Lca = get_lca(x,y);int ans = min(queryMin(x,Lca),queryMin(y,Lca));printf("%d\n",ans);}}return 0;
}

View Code

转载于:https://www.cnblogs.com/LiGuanlin1124/p/10907010.html

bzoj3159 决战相关推荐

  1. bzoj3159 决战 LCT

    题目大意: 维护一个树,支持以下操作: 1.链+ 2.链求和 3.链求最大 4.链求最小 5.链翻转(此处的翻转是指把链上的值翻转,而树的形态不变) 题目分析:(LCT) 如果只有前四个操作就可以用L ...

  2. BZOJ3159: 决战(FHQ Treap)

    传送门: 解题思路: 算是补坑了,这题除了Invert以外就可以树剖线段树解决了. 考虑Invert操作,延续先前树链剖分的做法,考虑先前算法的瓶颈. 最暴力的方法是暴力交换权值,然而这种方法忽略了当 ...

  3. 陕西农心邮箱服务器,由农心杯决战看AI规则对胜负判断的差异

    最近最为引人注目的就是农心杯的决战了.农心杯最后两局,都是半目胜负.因为在医院等候,都是通过腾讯围棋APP观看的.在评论区,有网友列示katago的胜率分析,与腾讯绝艺的胜率出入很大,甚至是完全相反的 ...

  4. vc++ mfc 非客户区 描绘线_决战客户端技术

    原文链接-决战客户端技术 最近经常有小伙伴问我要做一个客户端, 该怎么弄. 这个问题问得很粗犷, 但是实际上客户端的选型是一个很细的问题. 从大学到现在, 也弄了不少的客户端, 从公司主营炒股专业客户 ...

  5. Serverless 与容器决战在即?有了弹性伸缩就不一样了

    作者 | 阿里云容器技术专家 莫源   本文整理自莫源于 8 月 31 日 K8s & cloudnative meetup 深圳场的演讲内容.关注"阿里巴巴云原生"公众号 ...

  6. 6.19决战光荣日,一场魔兽狂欢里的青春、父爱和友谊

    6月19日决战光荣日-程序员魔兽嘉年华在杭州城西银泰举办.全城开发者.魔兽迷以及电影爱好者济济一堂,燃情狂欢,游戏环节高潮迭起,点燃激情盛夏.观者如堵的同时,无论是联盟还是部落,现场组队征战,嗨翻全场 ...

  7. 战友!6.19决战光荣日,一个真实的魔兽世界在等你!

    勇士们 还记得魔兽中曾经的战友吗? 还记得当年那热血的承诺吗? "一日WOWER,终身WOWER!" 曾记否在副本里被虐得死去活来 曾记否相约奥格门外插旗至天亮 我们早已不再青春 ...

  8. 为决战5G时代,小米出手一点不含糊,接连招揽牛人,这次是曾学忠

    文 | 科技有意思,编辑 | 猫叔 目前,智能手机厂商们在4G时代的博弈战算是告一段落了.而随着国内市场的5G蓬勃发展,实际上许多中国手机厂商都已经做好了准备,甚至是All in 5G了. 这其中,小 ...

  9. html5决战沙城源码,决战沙城h5符文玩法介绍 怎么获得完美首通

    导 读 决战沙城h5的符文玩法的作用更适用于PK当中,随着后期攻击力越高越高之后,伤害减少比起输出增加更为的重要,你得比别人站得更久,才能有更高的输出,一起来看看符文功能的一些介绍吧. 1.功... ...

最新文章

  1. Linux防止SSH暴力破解
  2. 八大排序算法合集 (归并排序、交换排序、插入排序、选择排序......)
  3. 详细!快速入门指南!Docker!
  4. 繁星代码生成器0.91版 【视频】
  5. 1.4 torch_向量/矩阵求偏导
  6. 小知识:常用开源协议详细解析
  7. C# 外接(网口)双摄像头视频获取
  8. Django中提供了6种缓存方式
  9. python开发wince软件_Wince6.0应用开发:二、模拟器的使用
  10. iloc,ix和loc有何不同?
  11. oracle kill所有plsql developer进程
  12. M1 macbook安装jdk
  13. golang 结构体数组的初始化赋值
  14. 华为 BGP路由聚合
  15. PMP笔记-风险应对策略的区别
  16. java mp3转wav_JAVA将MP3转为WAV
  17. html给图片添加边框
  18. 虚拟化VMware简介5——DRS 与 DPM 详解
  19. Crontab定时执行任务
  20. 从街机到抓娃娃机,硬币经济也将被移动支付取代?

热门文章

  1. 2018年智能手表出货量曝光 苹果Apple Watch占据半壁江山
  2. 嵌入式Linux开发板上NFS文件系统的使用【ZT】
  3. 简单的Postman,硬是玩出花!我能咋办
  4. react生命周期(自己的方式理解)
  5. 软件测试基础课程学习笔记6--测试执行的几点技巧
  6. 史上最详细JVM笔记
  7. 晨哥真有料丨一定要在一个月内让她爱上你!
  8. hiredis源码分析与简单封装
  9. nodejs async await promise理解
  10. 【clickhouse】clickhouse 解析器