BZOJ#3786. 星系探索(平衡树,fhq-treap,弱化版ETT)

BZOJ#3786. 星系探索

Solution

子树加,换fatherfatherfather(保证还是树),询问到根路径和。
树上路径求和不好动态维护,于是转化到序列上,维护一个括号序,dfndfndfn处贡献为wwwfnsfnsfns处贡献为−w-ww,一段路径(x,y)(x,y)(x,y)的和相当于序列上dfnxdfn_xdfnxdfnydfn_ydfny的贡献和。

于是子树加相当于区间加,交换子树相当于在括号序上取出一个区间插入到其他地方去。
这个可以直接用平衡树维护,这里用的是fhq−treapfhq-treapfhqtreap

我们在fhq−treapfhq-treapfhqtreap中节点的下标对应的是原树的括号序编号,即dfnxdfn_xdfnxtreaptreaptreap上对应dfnxdfn_xdfnx号节点,在splitsplitsplit时,当前的括号序为中序遍历treaptreaptreap后得到的节点编号序列。需要求出节点在treaptreaptreap上的rankrankrank,然后再按rankrankrank分成两棵子树。

剩下的就是treaptreaptreap的区间标记维护区间和了(注意dfnx+=Δdfn_x+=\Deltadfnx+=Δ,则fnsx−=Δfns_x-=\Deltafnsx=Δ,因此我们的区间和要带符号维护)。

时间复杂度O(nlgn)O(nlgn)O(nlgn)

Code

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <cassert>
#include <string.h>
//#include <unordered_set>
//#include <unordered_map>
//#include <bits/stdc++.h>#define MP(A,B) make_pair(A,B)
#define PB(A) push_back(A)
#define SIZE(A) ((int)A.size())
#define LEN(A) ((int)A.length())
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define fi first
#define se secondusing namespace std;template<typename T>inline bool upmin(T &x,T y) { return y<x?x=y,1:0; }
template<typename T>inline bool upmax(T &x,T y) { return x<y?x=y,1:0; }typedef long long ll;
typedef unsigned long long ull;
typedef long double lod;
typedef pair<int,int> PR;
typedef vector<int> VI;const lod eps=1e-11;
const lod pi=acos(-1);
const int oo=1<<30;
const ll loo=1ll<<62;
const int mods=998244353;
const int MAXN=600005;
const int INF=0x3f3f3f3f;//1061109567
/*--------------------------------------------------------------------*/
inline int read()
{int f=1,x=0; char c=getchar();while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+(c^48); c=getchar(); }return x*f;
}
struct fhq_treap
{ll a[MAXN],sum[MAXN],tag[MAXN];int b[MAXN],sz[MAXN],p[MAXN],num[MAXN],fa[MAXN],ch[MAXN][2],rt;void up(int x) { sz[x]=sz[ch[x][0]]+sz[ch[x][1]]+1;num[x]=num[ch[x][0]]+num[ch[x][1]]+p[x];sum[x]=sum[ch[x][0]]+sum[ch[x][1]]+a[x]; if (ch[x][0]) fa[ch[x][0]]=x;if (ch[x][1]) fa[ch[x][1]]=x;}void puttag(int x,ll y) { if (!x) return; tag[x]+=y,a[x]+=y*p[x],sum[x]+=y*num[x]; }void down(int x) { if (!x||tag[x]==0) return;puttag(ch[x][0],tag[x]),puttag(ch[x][1],tag[x]),tag[x]=0;}int nwnode(int id,int opt,int x) { p[id]=num[id]=opt;a[id]=sum[id]=opt*x;b[id]=rand(),sz[id]=1; return id; }void split(int nw,int k,int &x,int &y){if (!nw) x=y=0;else{down(nw);if (k<=sz[ch[nw][0]]) y=nw,split(ch[nw][0],k,x,ch[nw][0]);else x=nw,split(ch[nw][1],k-sz[ch[nw][0]]-1,ch[nw][1],y);up(nw);}}int merge(int x,int y){if (!x||!y) return x|y;down(x),down(y);if (b[x]<b[y]) return ch[x][1]=merge(ch[x][1],y),up(x),x;else return ch[y][0]=merge(x,ch[y][0]),up(y),y;}int rank(int x){int rk=sz[ch[x][0]]+1;while (fa[x]) {if (x==ch[fa[x]][1]) rk+=sz[ch[fa[x]][0]]+1;x=fa[x];}return rk;}ll Query(int x){int A,B;split(rt,rank(x),A,B);ll ans=sum[A];rt=merge(A,B);return ans;}void Swap(int l,int r,int x){int A,B,C,D;l=rank(l),r=rank(r),x=rank(x);if (x<=l-1)  //1...x...l...r...n{split(rt,r,A,D);split(A,l-1,A,B);split(A,x,A,C);rt=merge(merge(merge(A,B),C),D);}else{split(rt,x,A,D); //1...l...r...x...nsplit(A,r,A,B);split(A,l-1,A,C);rt=merge(merge(merge(A,B),C),D);}}void Update(int l,int r,int y){int A,B,C;l=rank(l),r=rank(r);split(rt,r,A,C);split(A,l-1,A,B);puttag(B,y);rt=merge(merge(A,B),C);}
} T;
vector<int> e[MAXN];
int dfn[MAXN],fns[MAXN],w[MAXN],DFN=0;
void dfs(int x,int father)
{dfn[x]=++DFN;T.rt=T.merge(T.rt,T.nwnode(DFN,1,w[x]));for (auto v:e[x]) if (v!=father) dfs(v,x);fns[x]=++DFN;T.rt=T.merge(T.rt,T.nwnode(DFN,-1,w[x]));
}
signed main()
{srand(time(0));int n=read();for (int i=2;i<=n;i++) e[read()].PB(i);for (int i=1;i<=n;i++) w[i]=read();dfs(1,0);int Case=read();while (Case--){int x,y; char c; scanf("%c",&c);if (c=='Q') x=read(),printf("%lld\n",T.Query(dfn[x]));else if (c=='C') x=read(),y=read(),T.Swap(dfn[x],fns[x],dfn[y]);else x=read(),y=read(),T.Update(dfn[x],fns[x],y);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315543.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Worker Service in ASP .NET Core

介绍提到 ASP.NET Core&#xff0c;我们多半会想到 ASP.NET MVC、ASP.NET Web API、Razor page 及 Blazor。随着 .NET Core 3.0 的推出&#xff0c;今天会介绍一个全新推出的功能&#xff1a;Work Service 。我们可以在 Visual Studio 2019 中通过预定的项目模版快速创建一个 W…

Codeforces Round #693 (Div. 3) G. Moving to the Capital dp + 思维

传送门 题意&#xff1a; 给一个图&#xff0c;111号点为中心点&#xff0c;定义dis[i]dis[i]dis[i]表示111号点到iii的距离。现在有三种移动方式 (1)(1)(1)从iii移动到jjj且dis[i]<dis[j]dis[i]<dis[j]dis[i]<dis[j]。 (2)(2)(2)从iii移动到jjj且dis[i]>dis[j]dis…

AGC038D - Unique Path(建图)

AGC038D - Unique Path Solution 此题较水。 大概就是简单路径唯一意味着连成一棵树&#xff0c;因此先给这些限制的端点放在同一个连通块内&#xff0c;然后如果有多条路径的限制的两端点在同一个连通块内&#xff0c;则无解。 然后考虑如果没有多条路径的限制&#xff0c;…

ASP.NET Core 奇淫技巧之动态WebApi

一.前言接触到动态WebApi&#xff08;Dynamic Web API&#xff09;这个词的已有几年&#xff0c;是从ABP框架里面接触到的&#xff0c;当时便对ABP的这个技术很好奇&#xff0c;后面分析了一波&#xff0c;也尝试过从ABP剥离一个出来作为独立组件来使用&#xff0c;可是后来因与…

CF1478A - Nezzar and Colorful Ball(数学)

CF1478A - Nezzar and Colorful Balls Solution 真不戳&#xff0c;这AAA题真不戳&#xff0c;我直接好家伙。 讲一下我搞了半个小时的垃圾做法 &#xff08;好吧后来看了看标算好像和我是一样的&#xff09; 。 大概是容易发现你两个数(x,y)(x,y)(x,y)做来做去最后一定是ax…

Codeforces Round #693 (Div. 3) E. Correct Placement 思维

传送门 题意&#xff1a; 思路&#xff1a; 对于每个人都有个二元组(x,y)(x,y)(x,y)&#xff0c;从题意中提取有效信息就是&#xff1a;当(x1,y1)(x_1,y_1)(x1​,y1​)的最大值大于(x2,y2)(x_2,y_2)(x2​,y2​)的最大值&#xff0c;(x1,y1)(x_1,y_1)(x1​,y1​)的最小值大于(…

记录一次生产发布事件——(简单的非空验证也能引发大问题)

事件经过下午四点&#xff0c;发布生产g环境(生产环境m为正式环境&#xff0c;g为内测环境)。这时测试有人提出“服务器忙”。听到这里我赶紧翻了翻内测日志&#xff0c;发现了最熟悉的老朋友——未将对象引用设置到对象的实例。问题出现在如下代码上。(我下面附上了伪代码&…

Codeforces Round #705 (Div. 2) D. GCD of an Array 质因子分解 + stl维护

传送门 题意&#xff1a; 给nnn个数&#xff0c;让后qqq个操作&#xff0c;每次选择一个位置的数使其乘xxx&#xff0c;每次询问后输出所有数的gcdgcdgcd。 思路&#xff1a; 这个题思路算是比较好想的。首先就是一个计算方式即计算所有数的gcdgcdgcd&#xff0c;这个比较容易…

CF938G Shortest Path Queries(线性基,线段树分治,并查集)

CF938G Shortest Path Queries Solution 套路题。 xorxorxor最短路可以用线性基维护&#xff08;把每个环的边权异或和放进线性基&#xff0c;询问时把树边路径边权异或和放在线性基里跑出最小值即可&#xff09;。 然后因为线性基删除比较慢而麻烦&#xff08;注意线性基是…

程序员过关斩将--你为什么还在用存储过程?

点击上面“蓝字”关注&#xff0c;带你看好电影菜菜哥&#xff0c;我新接手了一个项目&#xff0c;看的我头疼呀业务有这么复杂呀&#xff1f;不是的&#xff0c;这个老项目完全是用存储过程写的&#xff0c;每个存储过程都好几百行这样呀&#xff0c;是够头疼的~有没有办法帮我…

Educational Codeforces Round 101 (Rated for Div. 2) C. Building a Fence 思维取范围

传送门 题意&#xff1a; 思路&#xff1a; 刚看到这个题其实是没什么思路&#xff0c;想过从前往后推或者从后往前推&#xff0c;但是都不是很可行。因为两边都有一个固定的挡板挡住&#xff0c;我们可以根据其中的一个算出来每个位置高度的范围&#xff0c;让后检查一下范…

CF1237F Balanced Domino Placements(组合计数,dp)

CF1237F Balanced Domino Placements Solution 显然可以先考虑横着的骨牌&#xff0c;再考虑竖着的骨牌。但是思路卡在了选取横着的骨牌会对竖着的骨牌的相邻对数产生影响。 然而事实上我们只需要换一个统计顺序&#xff0c;先考虑横着的骨牌的列和竖着的骨牌的行&#xff0…

asp.net core 集成JWT

【什么是JWT】JSON Web Token&#xff08;JWT&#xff09;是目前最流行的跨域身份验证解决方案。JWT的官网地址&#xff1a;https://jwt.io/通俗地来讲&#xff0c;JWT是能代表用户身份的令牌&#xff0c;可以使用JWT令牌在api接口中校验用户的身份以确认用户是否有访问api的权…

2021年度训练联盟热身训练赛第一场 E Early Orders 思维 + 栈

传送门 题意&#xff1a; 给nnn个数&#xff0c;一个kkk&#xff0c;求aaa中包含1−k1-k1−k且字典序最小的子序列。 思路1&#xff1a; 记p[i]p[i]p[i]为iii出现的最后位置&#xff0c;让后维护一个栈&#xff0c;当这个数不在栈里时将其入栈&#xff0c;入栈的时候跟栈顶比…

CF855G. Harry Vs Voldemort(边双,并查集,dp)

CF855G. Harry Vs Voldemort Solution 考虑每增加一条边都会把路径上的边双都连成一个大边双&#xff0c;考虑合并xxx和yfaxy fa_xyfax​ 这两个边双的贡献&#xff0c;分类讨论&#xff1a; 选取三个同边双内的点。选取在同一个边双内选两个点&#xff0c;剩下一个在其他边…

xBIM(eXtensible Building Information Modelling)可扩展的建筑信息模型

一、xBIM 简介BIM&#xff08;Building Information Modelling&#xff09;建筑信息模型&#xff0c;xBIM&#xff08;eXtensible Building Information Modelling&#xff09;可扩展的建筑信息模型。它是一个.NET 开源软件开发BIM工具包&#xff0c;支持BuildingSmart数据模型…

Codeforces Global Round 12 C1 C2. Errich-Tac-Toe 思维构造 好题

传送门 题意&#xff1a; 给了如下规则&#xff0c;上面三个只要出现一个情况就是非平局&#xff0c;现在给你个字符矩阵&#xff0c;让后其中XXX字符有KKK个(hardhardhard版本XXX和OOO一共KKK个)&#xff0c;每次操作可以将XXX变成OOO&#xff0c;OOO变成XXX&#xff0c;用不…

AGC019D - Shift and Flip(枚举)

AGC019D - Shift and Flip 很久之前WAWAWA的题&#xff0c;终于补掉了。。。这题细节是真的烦。 Solution 这题数据范围较小&#xff0c;于是我们枚举最终AAA与BBB的哪一个字符开始匹配&#xff0c;设这个位置为SSS。 然后考虑分顺时针/逆时针转到SSS两种情况讨论。 以逆时…

译 | .NET Core 3.0 Preview 6 已发布

原文&#xff1a;Richard Lander翻译&#xff1a;Edi Wang今天&#xff0c;我们宣布 .NET Core 3.0 Preview 6。它的更新包括编译程序集以改进启动、使用链接器和 EventPipe 改进优化应用程序的大小。我们还在 ARM64 上发布了针对 Alpine 的新 Docker 镜像。立即在 Windows、ma…

Codeforces Global Round 12 D. Rating Compression 思维 + 贪心

传送门 题意&#xff1a; 给一个长度为nnn的数组aaa&#xff0c;定义一个数组bbb&#xff0c;且bjminj<i<jk−1aib_jmin_{j<i<jk-1}a_ibj​minj<i<jk−1​ai​&#xff0c;比如j3j3j3的时候&#xff0c;a[1,3,4,5,2]a[1,3,4,5,2]a[1,3,4,5,2]&#xff0c;b3…