bzoj3159 决战
题目描述:
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 决战相关推荐
- bzoj3159 决战 LCT
题目大意: 维护一个树,支持以下操作: 1.链+ 2.链求和 3.链求最大 4.链求最小 5.链翻转(此处的翻转是指把链上的值翻转,而树的形态不变) 题目分析:(LCT) 如果只有前四个操作就可以用L ...
- BZOJ3159: 决战(FHQ Treap)
传送门: 解题思路: 算是补坑了,这题除了Invert以外就可以树剖线段树解决了. 考虑Invert操作,延续先前树链剖分的做法,考虑先前算法的瓶颈. 最暴力的方法是暴力交换权值,然而这种方法忽略了当 ...
- 陕西农心邮箱服务器,由农心杯决战看AI规则对胜负判断的差异
最近最为引人注目的就是农心杯的决战了.农心杯最后两局,都是半目胜负.因为在医院等候,都是通过腾讯围棋APP观看的.在评论区,有网友列示katago的胜率分析,与腾讯绝艺的胜率出入很大,甚至是完全相反的 ...
- vc++ mfc 非客户区 描绘线_决战客户端技术
原文链接-决战客户端技术 最近经常有小伙伴问我要做一个客户端, 该怎么弄. 这个问题问得很粗犷, 但是实际上客户端的选型是一个很细的问题. 从大学到现在, 也弄了不少的客户端, 从公司主营炒股专业客户 ...
- Serverless 与容器决战在即?有了弹性伸缩就不一样了
作者 | 阿里云容器技术专家 莫源 本文整理自莫源于 8 月 31 日 K8s & cloudnative meetup 深圳场的演讲内容.关注"阿里巴巴云原生"公众号 ...
- 6.19决战光荣日,一场魔兽狂欢里的青春、父爱和友谊
6月19日决战光荣日-程序员魔兽嘉年华在杭州城西银泰举办.全城开发者.魔兽迷以及电影爱好者济济一堂,燃情狂欢,游戏环节高潮迭起,点燃激情盛夏.观者如堵的同时,无论是联盟还是部落,现场组队征战,嗨翻全场 ...
- 战友!6.19决战光荣日,一个真实的魔兽世界在等你!
勇士们 还记得魔兽中曾经的战友吗? 还记得当年那热血的承诺吗? "一日WOWER,终身WOWER!" 曾记否在副本里被虐得死去活来 曾记否相约奥格门外插旗至天亮 我们早已不再青春 ...
- 为决战5G时代,小米出手一点不含糊,接连招揽牛人,这次是曾学忠
文 | 科技有意思,编辑 | 猫叔 目前,智能手机厂商们在4G时代的博弈战算是告一段落了.而随着国内市场的5G蓬勃发展,实际上许多中国手机厂商都已经做好了准备,甚至是All in 5G了. 这其中,小 ...
- html5决战沙城源码,决战沙城h5符文玩法介绍 怎么获得完美首通
导 读 决战沙城h5的符文玩法的作用更适用于PK当中,随着后期攻击力越高越高之后,伤害减少比起输出增加更为的重要,你得比别人站得更久,才能有更高的输出,一起来看看符文功能的一些介绍吧. 1.功... ...
最新文章
- Linux防止SSH暴力破解
- 八大排序算法合集 (归并排序、交换排序、插入排序、选择排序......)
- 详细!快速入门指南!Docker!
- 繁星代码生成器0.91版 【视频】
- 1.4 torch_向量/矩阵求偏导
- 小知识:常用开源协议详细解析
- C# 外接(网口)双摄像头视频获取
- Django中提供了6种缓存方式
- python开发wince软件_Wince6.0应用开发:二、模拟器的使用
- iloc,ix和loc有何不同?
- oracle kill所有plsql developer进程
- M1 macbook安装jdk
- golang 结构体数组的初始化赋值
- 华为 BGP路由聚合
- PMP笔记-风险应对策略的区别
- java mp3转wav_JAVA将MP3转为WAV
- html给图片添加边框
- 虚拟化VMware简介5——DRS 与 DPM 详解
- Crontab定时执行任务
- 从街机到抓娃娃机,硬币经济也将被移动支付取代?