首页 > 其他分享 >九月做题记录

九月做题记录

时间:2024-09-10 21:36:35浏览次数:11  
标签:tagp rs int 记录 tagd ls root 九月

都成老年选手了,能记点就记点吧。

9.10

BZOJ3786 星际探索

不知道为啥瞥见了这题题解,所以成了个玛丽题,跑出括号序后成区间问题,平衡树维护区间移动,加法。
对于移动一段区间,平衡树需要维护节点内正的贡献数量,方便区间加法,然后区间移动的变化量要算清。

点击查看代码
#include<bits/stdc++.h>
#define int long long
typedef long long ll;
typedef unsigned long long ull;
inline int read(){char ch=getchar();int x=0,f=1;for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<3)+(x<<1)+(ch^48);return x*f;}
const int N=2e5+10;
std::mt19937 myrand(1);
int n,m,dfc,dfnl[N],dfnr[N],v[N];
std::vector<int> e[N];
inline void dfs(int u,int fa){
	dfnl[u]=++dfc;
	for(int v:e[u])if(v!=fa)dfs(v,u);
	dfnr[u]=++dfc;
}
struct FHQ{
	int root,x,y,cnt,size[N],ls[N],rs[N],sum[N],val[N],w[N],pd[N],tagp[N],tagd[N],rnd[N],num[N],fa[N];
	inline int new_node(int k,int W,int P){val[++cnt]=k,w[cnt]=sum[cnt]=W,num[cnt]=pd[cnt]=P,size[cnt]=1,rnd[cnt]=myrand();return cnt;}
	inline void update(int p){fa[ls[p]]=p,fa[rs[p]]=p; size[p]=size[ls[p]]+rs[p]+1;sum[p]=sum[ls[p]]+sum[rs[p]]+w[p];num[p]=num[ls[p]]+num[rs[p]]+pd[p];}
	inline void pushdown(int p){
		fa[ls[p]]=p,fa[rs[p]]=p; 
		if(tagp[p]){tagp[ls[p]]+=tagp[p],tagp[rs[p]]+=tagp[p],val[ls[p]]+=tagp[p],val[rs[p]]+=tagp[p];}
		if(tagd[p]){tagd[ls[p]]+=tagd[p],tagd[rs[p]]+=tagd[p],sum[ls[p]]+=num[ls[p]]*tagd[p],sum[rs[p]]+=num[rs[p]]*tagd[p];w[ls[p]]+=pd[ls[p]]*tagd[p],w[rs[p]]+=pd[rs[p]]*tagd[p];}
		return tagd[p]=tagp[p]=0,void();
	}
	inline void split(int fx,int fy,int p,int k,int &x,int &y){
		if(!p){return x=y=0,void();}
		pushdown(p);
		if(val[p]<=k)x=p,fa[x]=fx,fx=fx,split(fx,fy,rs[p],k,rs[p],y);
		else y=p,fa[y]=fy,fy=y,split(fx,fy,ls[p],k,x,ls[p]);
		update(p);
	}
	inline int merge(int u,int v){
		if(!u||!v){return u|v;}
		if(rnd[u]<rnd[v]){pushdown(u);rs[u]=merge(rs[u],v);fa[rs[u]]=u,update(u);return u;}
		else{pushdown(v);ls[v]=merge(u,ls[v]);fa[ls[v]]=v;update(v);return v;}
	}
	inline void F(int x){if(!x)return;F(fa[x]);pushdown(x);}
	inline int find(int u){F(fa[u]);return val[u];}
	inline void insert(int k,int W,int P){split(0,0,root,k,x,y);root=merge(merge(x,new_node(k,W,P)),y);fa[root]=0;}
	inline void move(int u,int f){
		int l=find(2*u-1),r=find(2*u),pos=find(2*f-1),z=0;
		int len=r-l+1,d;
		if(l>pos){
			d=pos+1-l;
			split(0,0,root,r,x,y);split(0,0,x,l-1,x,z);
			tagp[z]+=d,val[z]+=d;
			int c=0;split(0,0,x,pos,x,c);
			tagp[c]+=len,val[c]+=len;
			root=merge(merge(merge(x,z),c),y);
		}else{
			d=pos-r;
			split(0,0,root,r,x,y);split(0,0,x,l-1,x,z);
			tagp[z]+=d,val[z]+=d;
			int c=0;split(0,0,y,pos,c,y);
			tagp[c]-=len,val[c]-=len;
			root=merge(merge(merge(x,c),z),y);
		}fa[root]=0;
	}
	inline void add(int u,int d){
		int l=find(2*u-1),r=find(2*u);
		int z;split(0,0,root,r,x,y);split(0,0,x,l-1,x,z);
		sum[z]+=num[z]*d,w[z]+=pd[z]*d,tagd[z]+=d;
		root=merge(merge(x,z),y);fa[root]=0;
	}
	inline int ask(int u){
		int l=find(2*u-1);
		split(0,0,root,l,x,y);int res=sum[x];
		root=merge(x,y);fa[root]=0;
		return res;
	}
}s;
signed main(){
	// freopen("in.in","r",stdin);freopen("out.out","w",stdout);
	std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);
	n=read();for(int i=2;i<=n;++i){int x=read();e[x].emplace_back(i);e[i].emplace_back(x);}
	for(int i=1;i<=n;++i){v[i]=read();}
	dfs(1,0);
	for(int i=1;i<=n;++i)s.insert(dfnl[i],v[i],1),s.insert(dfnr[i],-v[i],-1);
	m=read();
	for(int i=1;i<=m;++i){
		char ch=getchar();while(ch<'A'||ch>'Z')ch=getchar();
		if(ch=='Q')std::cout<<s.ask(read())<<'\n';
		if(ch=='C'){int u=read(),fa=read();s.move(u,fa);}
		if(ch=='F'){int u=read(),d=read();s.add(u,d);}
	}
}

标签:tagp,rs,int,记录,tagd,ls,root,九月
From: https://www.cnblogs.com/Ishar-zdl/p/18404305

相关文章

  • LeetCode Hot100刷题记录-234.回文链表
    题目:给你一个单链表的头节点head,请你判断该链表是否为回文链表。如果是,返回true;否则,返回false。PS:回文序列是向前和向后读都相同的序列。解题思路:遍历链表,将每个元素存放入一个新的数组中。遍历完成后,再用两个指针前后遍历数组来判断两个数字是否相等。/***Def......
  • 一、记录最近网安面试题
    前言大家好,我是一名大四学生,最近正在找实习,我整理一些面试遇到的问题。以下的解答是我经过网络整理得出的,如果有不对或者缺少的地方欢迎大家指出。一、CDN绕过的方法方法1:查询历史DNS记录1)查看IP与域名绑定的历史记录,可能会存在使用CDN前的记录,相关查询网站有:https://......
  • 学习记录
    电脑搜索引擎分类:1.目录式分类搜索引擎。特点:检索的准确率比较低,完全依赖流程操作进行检索,过程较复杂;代表有新浪网、网易等。2.全文检索搜索引擎(关键词搜索)特点是搜全率比较高,自动提取网站信息。代表网站有谷歌、必应等。安装字体过程:第一步:找到字体网站下载所需字体文件,一般......
  • 九月十号人工智能
    一.搜索引擎1.引擎分为两种第一种:目录式分类搜索引擎。过程比较复杂,不容易找到想要的信息。第二种:全文检索搜索引擎(关键词搜索)。准确率比较高,信息易于提取2.搜索指令使用filetype指令可以查询特定格式的文件,比如doc\txt\ppt\pdf,搜索格式为:关健词:空格+filetype-+文件格式使用......
  • 人工智能课程记录(2024.9.10)
    一、搜索引擎的分类:1.目录式搜索:网易、搜狐、知网等2.全文式搜索:百度、夸克等二、使用搜索引擎的技巧指令:1.使用“-”(减号)在关键词的前面使用减号,也就意味着在查询结果中不能出现该关键词,覆索的格式为“关键词空榴+减号+关键词B”。2.使用filetype指令可以查询特定格式的文件......
  • React路由配置参考(记录)
    整体:登录页单独处理:将登录页单独处理,路径为/login。使用AuthLayout处理授权页面:AuthLayout可以作为一个高阶组件,确保用户登录后才能访问系统中的其他页面。加载主布局BasicLayout:BasicLayout可以用来加载系统的主布局,并通过routesRender(routesConfig)渲染配置文件中......
  • 安装linux记录
    1.目标:把windows上python脚本运行ray集群迁移到linux上,ubuntu22.042.踩坑:dpkg崩溃重装系统3.安装sshwin上安装xftp7unix安装openssh服务4.能通过xftp7传输文件到unix5.乱码xftp:文件当前对话属性选项连接-编码6.更改权限7.安装python3.10.14只能自己打包安装https......
  • 事业单位考试日程记录
    下半年事业单位联考,2024届毕业生可以报考,25届应届生不具备报考资格;选调生考试、事业单位进校园专项考试,仅面向2025届应届生群体;如果考试公告的标题是“2025”开头的,那就意味着是2025年的考试,2025届应届生群体就可以报考;7月份开始!2025年考公考编上岸时间节点尽快了解......
  • Nodered学习记录-时间戳和时区设置
    昨天刷到个博主,跟着她的教程开始实践。Node-red的基础使用——inject/debug/function的使用(1)Node-red的基础使用——cronplus节点的使用(2)通过(1)大致理解了node-red里面的信息传递,以及javaScript写的function,虽说部分细节不甚明了,但不妨碍拿来用。到了(2)时,首先遇到的是cronpl......
  • Mybatis踩坑记录:探究Mybatis源码为何当传入参数Integer类型为0时,if条件生效
    目录前言 ​编辑问题背景 深入源码 解决问题方案一方案二方案三 结果结语前言在MyBatis中,<if>标签用于动态生成SQL查询条件。然而,在一些特定的场景下,<if>标签的条件判断可能会出现意料之外的结果。例如,当传入的Integer参数为0时,条件判断可能不会如......