首页 > 其他分享 >字典树补题记录

字典树补题记录

时间:2023-11-29 20:46:06浏览次数:31  
标签:记录 int 线段 long read 补题 字典

Luogu - P6587 超超的序列 加强

AC 2023.11.19

发现 \(x \le 20\),可以取编号 01 串的后 \(x\) 位,按字典树的形式,线段树的思想。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define debug(x) cout<<#x<<" = "<<x<<endl;
const int N = 2e5 + 5, T = 4e6 + 5;
int n, m, a[N], point[N*20][2], num, son_num[T];
ll sum[T], tag_add[T], lastans;
inline int read(){
	int s=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){s=(s<<1)+(s<<3)+(c^48);c=getchar();}
	return s*f;
}
void insert(int val, int id){
	int p=0, x=1;
	son_num[x]++;
	sum[x] += val;
	for(int i=0;i<20;i++){
		bool k = id & (1 << i);
		if(!point[p][k])point[p][k] = ++num;
		p = point[p][k];
		if(k)x = x<<1|1;
		else x = x<<1;
		son_num[x]++;
		sum[x] += val;
	}
}
int find(int f, int y){
	int p=0, x=1;
	for(int i=0;i<f;i++){
		bool k = y & (1 << i);
		sum[x<<1] += tag_add[x] * son_num[x<<1];
		sum[x<<1|1] += tag_add[x] * son_num[x<<1|1];
		tag_add[x<<1] += tag_add[x];
		tag_add[x<<1|1] += tag_add[x];
		tag_add[x] = 0;
		if(!point[p][k])return 0; 
		p = point[p][k];
		if(k)x = x<<1|1;
		else x = x<<1;
	}
	return x;
}
void add(int f, int y, ll v){
	int p=0, x=1;
	for(int i=0;i<f;i++){
		bool k = y & (1 << i);
		sum[x<<1] += tag_add[x] * son_num[x<<1];
		sum[x<<1|1] += tag_add[x] * son_num[x<<1|1];
		tag_add[x<<1] += tag_add[x];
		tag_add[x<<1|1] += tag_add[x];
		tag_add[x] = 0;
		if(!point[p][k])return;
		p = point[p][k];
		if(k)x = x<<1|1;
		else x = x<<1;
	}
	tag_add[x] += v;
	int now_son_num = son_num[x];
	while(x){sum[x] += v * now_son_num; x>>=1;}//线段树的 pushup 
}
int main(){
	n = read(), m = read();
	for(int i=1;i<=n;i++)a[i] = read(), insert(a[i], i);
	while(m--){
		int op = read();
		int opt = (lastans + op) % 2 + 1;
		if(opt == 1){
			int x = read(), y = read(), v = read();
			add(x, y, v);
		}else{
			int x = read(), y = read();
			lastans = sum[find(x, y)];
			cout << lastans << endl;
		}
	}
	return 0;
}

标签:记录,int,线段,long,read,补题,字典
From: https://www.cnblogs.com/JT-dw/p/17865783.html

相关文章

  • 记录--闭包,沙箱,防抖节流,函数柯里化,数据劫持......
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助函数创建与定义的过程函数定义阶段在堆内存中开辟一段空间把函数体内的代码一模一样的存储在这段空间内把空间赋值给栈内存的变量中函数调用阶段按照变量名内的存储地址找到堆内存中对应的存储空间......
  • 一对多 多对多 添加记录,修改,删除
    一对多添加记录:publish=models.Publish.objects.create(name='北京出版社',addr='北京',phone='0536-12345678',email='邮箱地址')#新增西游记图书book=models.Book.objects.create(name='红楼梦',price='23.45',publish=publish)#pu......
  • 浏览器插件 Obsidian web 与 Obsidian 插件 local rest api 结合配置过程记录
    1.安装浏览器插件能到这里的肯定是已经有Obsidian了.首先要安装chrome浏览器插件Obsidianweb如图2.安装Obsidian上的插件插件名为localrestapi,如图3.设置浏览器插件配置对应的Obsidianweb中设置上localrestapi的信息,需要简单理解一下,就是......
  • Linux学习记录
    工作几年,发现原来的工作并不适合自己,遂决定不破不立,毅然离职。离职的这几个月一直在寻找方向。但发现今年(23年)的行情比疫情期间还差。很多工作没有经验根本转不了。经过几个月的摸索探索。在各大平台查找。最终决定学习Linux。大佬们勿喷,本文权当学习日记了,好了,开始。231129现在......
  • 记录一次MySQL多表查询,order by不走索引的情况.
    首先是表结构,部分字段脱敏已删除 CREATETABLE`log_device_heart`(`id`intunsignedNOTNULLAUTO_INCREMENT,`device_number`varchar(255)CHARACTERSETutf8mb4COLLATEutf8mb4_0900_ai_ciNOTNULL,`time_periods_begin`datetimeNOTNULL,`time_peri......
  • 「Log」做题记录 2023.11.27-
    \(2023.11.27-2023.12.3\)\(\color{black}{P6965}\)2-sat是显著的。对于无问号串,直接否定向自己连边即可,然后塞到Trie树里。Trie树上用子树、路径前缀优化建图即可。\(\color{blueviolet}{P4334}\)圆方树,点是显著的,割边转换为对应方点即可。\(\color{blueviolet}{CF855......
  • 2023-11-29:用go语言,给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现
    2023-11-29:用go语言,给你一个字符串s,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证返回结果的字典序最小。要求不能打乱其他字符的相对位置)。输入:s="cbacdcbc"。输出:"acdb"。来自左程云。答案2023-11-29:所有的代码用灵捷3.5编写,感觉有点抽风了,生成的代码需要修改......
  • js 拼接字符串带变量(js方法参数单双引号拼接的问题记录)
    小结:外面单引号,里面双引号,然后方法参数给转义的单引号即可(看下面的onClick事件即可)//刷新二级信号表格(增删改操作后)functionreloadSignal(subId){//清空$("#msgAll"+subId).empty();//js手工添加表格varhtmlStart='<spanstyle="position:......
  • 记录达梦8安装过程与一些注意事项
    最近项目中使用到达梦数据库(开发版),安装时总是忘记一些比较重要的,常用的参数,所以记录一下.环境:CPU:鲲鹏arm64系统:银河麒麟服务器版V10SP3下载达梦数据库打开达梦数据库下载页(可能需要登录)找到DM8开发版,需要选择安装的机器的CPU平台和系统,再点击下载......
  • Linux学习记录:yum管理器
    1.yum是CentOS和RedHat中的Shell前端软件包管理器。2.yum基础源官方源:更新yum仓库本地缓存 3.yum的使用首先要确认网络是否联通,在这里我们可以ping一下外网来测试 然后查看软件包 最左边的是各种操作系统下的软件名称,中间是发行版本,最右边的是发行商。 安装软件......