11.22 校内模拟赛总结

挂分场

复盘

决定尝试一下多放一点时间在前期看题上

T1 发现是模拟;T2 看上去好神秘啊!想了一会一直没什么思路;T3 看上去眼熟,但还是觉得计数很困难;T4 看完发现是数据结构,推了推很快会了树高做法,感觉这个很好拓展啊!就多推了一会,最后思路大概是操作分块,但块内贡献不会处理

一直到 8:30 才开始码,8:40 交了 T1

推 T2,仔细开始分析,首先 l 1 , l 2 l_1,l_2 l1,l2 肯定是 1 1 1,然后按位考虑,发现 l 1 l_1 l1 肯定要取在第一个 1 1 1 的位置,又讨论了一下发现直接贪心做完了?这么诈骗

9:20 交了,看大样例强度感觉还可以,应该不是很能挂(

T3 换题了,才知道是之前 daimayuan 的原题 但是我不记得 ,换之后感觉比之前好做了,更符合我那个贪心判定的思路

还是找性质,首先肯定从小到大贪心匹配,然后发现单点操作一定优于顺子操作,然后状态很少,然后就会暴力 dp 了,然后正解感觉上矩乘就行了?

先写了暴力 dp,发现过了样例;改矩乘,调了一会也过了样例,10:30 交了

还有 1.5h 多,感觉很稳

先看了看部分分,发现 45pts 是简单的,后面的链感觉应该是在提示正解

还是在想最开始那个基于树高的做法,从每个点往上暴力跳,贡献是可以直接算的。那么本质上是链求和,然后对若干完全不连续的点进行点权修改

链的话显然可以分块,考虑某个前缀对整块的贡献

但是有问题,这是区间赋值,不像加加减减可以直接拼贡献,想了很久灵光一现:ODT!

对啊,基于颜色段均摊,赋值操作就可以拆成若干个区间加和区间撤销,这就可以维护了

每次怎么查答案呢?貌似只能暴力枚举每一段了,整段对单点就只需要查祖先链中某一段区间内的贡献就行,主席树即可

但这需要满足询问区间随机,段数是 log ⁡ \log log 才可以

此时就剩 50min 了,反复权衡了一下感觉 ODT 会比较难写,还可能会被卡,决定写暴力吧

于是在大概 40min 的时间里写了 6 个 k,每个 sub 只过了手造的数据

然后就结束了

结果是:

100 + 0 + 100 + 35 = 235 100 + 0 + 100 + 35 = 235 100+0+100+35=235

蚌,T2 挂没了,发现是没有判 S S S 里全是 0 0 0 的情况,我直接没输出。。。而且它数据是每个 sub 里捆一个这种点,逆天

T4 挂了 10pts,原因是 p a i r pair pair f i r s t first first s e c o n d second second 弄反了

感觉有点亏啊!下午去实现 T4 ODT 的思路,发现不但十分好写,而且能有 90pts,拼上下午写的一个 sub 就过了

感觉有时候还是要自信点的

听正解,发现赛时是因为没有深入分析贡献的方式,只是觉得能做但是挺复杂的,仔细分讨完之后其实情况十分简单,直接基于这个算贡献就行

题解

在这里插入图片描述
还是先说贡献方式,发现对于节点 x x x,需要实时维护的只有两种:

1. 1. 1. x ∈ l s o n ( y ) , v y = − 1 x\in lson(y),v_y=-1 xlson(y),vy=1,那么 x x x 会加 1 1 1

2. 2. 2. x ∈ r s o n ( y ) , v y = 1 x\in rson(y),v_y=1 xrson(y),vy=1,那么 x x x 会减 1 1 1

考虑分块,整块的权值都一样时情况是比较好处理的,那么直接预处理出贡献系数数组 f x , i f_{x,i} fx,i 表示 第 i i i 个整块中有多少个 y y y 分别满足上面的条件,算答案时直接枚举每个整块

对于散块,先考虑单点,把这个放在修改时处理,枚举每个散块中的每个单点,直接进行子树加减

然而有个问题是把散块变成整块时需要撤销贡献,发现这个直接暴力做就行

具体来说,把块分为两类:有整块标记的,块内不一定统一的

进行整块枚举时,如果发现这是二类块,直接暴力枚举所有位置撤销贡献即可,由于颜色段均摊,这样复杂度显然也是对的

#include<bits/stdc++.h>//嘿嘿,ODT 才是最强的
using namespace std ;

typedef long long LL ;
const int N = 1e5+10 ;
 
int n , Q , ls[N] , rs[N] ;
int op[N] , l[N] , r[N] , id[N] ;
struct Segtree
{
	int ls , rs , cnt0 , cnt1 ;
}t[40*N] ;//作为左儿子往上跳/作为右儿子往上跳的节点编号 
int rt[N] , tot ;
inline int build() { return ++tot ; }
inline void update( int p )
{
	t[p].cnt0 = t[t[p].ls].cnt0 + t[t[p].rs].cnt0 ;
	t[p].cnt1 = t[t[p].ls].cnt1 + t[t[p].rs].cnt1 ;
}
int Insert( int p , int l , int r , int x , bool f )
{
	int nw = build() ;
	t[nw] = t[p] ;
	if( l == r ) {
		if( !f ) t[nw].cnt0 ++ ;
		else t[nw].cnt1 ++ ;
		return nw ;
	}
	int mid = (l+r)>>1 ;
	if( x <= mid ) t[nw].ls = Insert(t[p].ls,l,mid,x,f) ;
	else t[nw].rs = Insert(t[p].rs,mid+1,r,x,f) ;
	update(nw) ;
	return nw ;
}
typedef pair<int,int> PII ;
PII query( int p , int l , int r , int ql , int qr )
{
	if( !p ) return {0,0} ;
	if( ql <= l && r <= qr ) {
		return {t[p].cnt0,t[p].cnt1} ;
	}
	int mid = (l+r)>>1 ;
	if( ql > mid ) return query(t[p].rs,mid+1,r,ql,qr) ;
	if( qr <= mid ) return query(t[p].ls,l,mid,ql,qr) ;
	PII R1 = query(t[p].ls,l,mid,ql,qr) , R2 = query(t[p].rs,mid+1,r,ql,qr) ;
	return {R1.first+R2.first,R1.second+R2.second} ;
}
int siz[N] , val[N] ;
void dfs( int x )
{
	siz[x] = 1 ;
	if( ls[x] ) {
		rt[ls[x]] = Insert( rt[x] , 1 , n , x , 0 ) ;
		dfs(ls[x]) ;
	}
	if( rs[x] ) {
		rt[rs[x]] = Insert( rt[x] , 1 , n , x , 1 ) ;
		dfs(rs[x]) ;
	}
	siz[x] += siz[ls[x]] + siz[rs[x]] ;
}
void get_val( int x )
{
	if( ls[x] ) {
		val[ls[x]] = val[x] ;
		get_val(ls[x]) ;
	}
	if( rs[x] ) {
		val[rs[x]] = val[x]+siz[ls[x]]+1 ;
		get_val(rs[x]) ;
	}
}
struct node
{
	int l , r , v ;
	friend bool operator < ( node a , node b ) {
		return a.l<b.l ;
	}
};
struct np
{
	int l , r , v ;
}tmp[N] ;
int len ;
set<node> s ;
auto Split( int x ) // 分裂 x-1,x ,返回 x 段迭代器 
{
	auto it = s.lower_bound({x,0,0}) ;
	if( it != s.end() && it->l == x ) return it ;
	it -- ;
	if( it->r < x ) return s.end() ;
	int l = it->l , r = it->r , v = it->v ;
	s.erase(it) ;
	s.insert({l,x-1,v}) ;
	return s.insert({x,r,v}).first ;
}
void Assign( int l , int r , int v ) 
{
	auto itr = Split(r+1) , itl = Split(l) ;//顺序不能换
	s.erase( itl , itr ) ;
	s.insert((node){l,r,v}) ;
}
int Max ;
void Ask( int x )
{
	int ans = val[x] , v ;
	auto it = s.lower_bound({x,0,0}) ;
	if( it->l==x ) v = it->v ;
	else v = (--it)->v ;
	if( v==-1 ) ans += 1 ;
	else if( v==0 ) ans += siz[ls[x]]+1 ;
	else ans += siz[ls[x]]+siz[rs[x]]+1 ;
//	printf("%d\n" , ans ) ;
	len = 0 ;
	for(auto it = s.begin() ; it != s.end() ; it ++ ) {
		int l = it->l , r = it->r , v = it->v ;
		tmp[++len] = {l,r,v} ;
		PII R = query(rt[x],1,n,l,r) ;
//		printf("query rt %d , l=%d , r=%d\n" , x , R.first , R.second ) ;
		if( v==-1 ) ans += R.first ;
		if( v==1 ) ans -= R.second ;
	}
	s.clear() ;
	int nl = tmp[1].l , nv = tmp[1].v , nr = tmp[1].r ;
	for(int i = 2 ; i <= len+1 ; i ++ ) { // 合并一下 
		if( tmp[i].v==nv && i != len+1 ) nr = tmp[i].r ;
		else {
			s.insert({nl,nr,nv}) ;
			nl = tmp[i].l , nr = tmp[i].r , nv = tmp[i].v ;
		}
	}
	printf("%d\n" , ans ) ;
}
namespace subtask4
{
	int dfn[N] , tim , ed[N] , v[N] , nam[N] ;
	void dfs( int x )
	{
		dfn[x] = ++tim ;
		if( ls[x] ) dfs(ls[x]) ;
		if( rs[x] ) dfs(rs[x]) ;
		ed[x] = tim ;
	}
	struct BIT
	{
		int t[N] ;
		inline int lowbit( int x ) { return x&-x ; }
		void add( int p , int x ) {
			for( ; p <= n ; p += lowbit(p) ) t[p] += x ;
		}
		int ask( int p ) {
			int res = 0 ;
			for( ; p ; p -= lowbit(p) ) res += t[p] ;
			return res ;
		}
		void Add( int l , int r , int x ) 
		{
			add(l,x) ; 
			if( r < n ) add(r+1,-x) ;
		}
	} T ;
	void Rem( int x )
	{
		if( v[x]==-1 ) {
			if( ls[x] ) T.Add(dfn[ls[x]],ed[ls[x]],-1) ;
			if( rs[x] ) T.Add(dfn[rs[x]],ed[rs[x]],-(1+siz[ls[x]])) ;
		}
		else if( v[x]==0 ) {
			if( rs[x] ) T.Add(dfn[rs[x]],ed[rs[x]],-(1+siz[ls[x]]) ) ;
		}
		else {
			if( rs[x] ) T.Add(dfn[rs[x]],ed[rs[x]],-siz[ls[x]]) ;
		}
	}
	void Add( int x )
	{
		if( v[x]==-1 ) {
			if( ls[x] ) T.Add(dfn[ls[x]],ed[ls[x]],1) ;
			if( rs[x] ) T.Add(dfn[rs[x]],ed[rs[x]],1+siz[ls[x]]) ;
		}
		else if( v[x]==0 ) {
			if( rs[x] ) T.Add(dfn[rs[x]],ed[rs[x]],1+siz[ls[x]]) ;
		}
		else {
			if( rs[x] ) T.Add(dfn[rs[x]],ed[rs[x]],siz[ls[x]]) ;
		}
	}
	void solve() //单点修改 
	{
		dfs(1) ;
		for(int i = 1 ; i <= n ; i ++ ) {
			v[i] = -1 , Add(i) ;
		}
		for(int i = 1 ; i <= Q ; i ++ ) {
			if( op[i] == 1 ) {
				Rem(l[i]) ;
				v[l[i]] = id[i] ;
				Add(l[i]) ;
			}
			else {
				int ans = 0 ;
				int x = id[i] ;
				if( v[x]==-1 ) ans = 1 ;
				else if( v[x]==0 ) ans = siz[ls[x]]+1 ;
				else ans = siz[ls[x]]+siz[rs[x]]+1 ;
				printf("%d\n" , ans+T.ask(dfn[x]) ) ;
			}
		}
	}
}

int main()
{
	scanf("%d%d" , &n , &Q ) ;
	for(int i = 1 ; i <= n ; i ++ ) {
		scanf("%d%d" , &ls[i] , &rs[i] ) ;
	}
	rt[1] = build() ;
	dfs(1) ;
	get_val(1) ;
//	cout << val[1] << ' ' << val[2] << endl ;
	s.insert({1,n,-1}) ;
	bool fg2 = 0 ;
	for(int i = 1 ; i <= Q ; i ++ ) {
		scanf("%d" , &op[i] ) ;
		if( op[i] == 1 ) {
			scanf("%d%d%d" , &l[i] , &r[i] , &id[i] ) ;
			if( l[i]!=r[i] ) fg2 = 1 ;
		}
		else {
			scanf("%d" , &id[i] ) ; 
		}
	}
	if( !fg2 ) {
		subtask4::solve() ;
		return 0 ;
	}
	for(int i = 1 ; i <= Q ; i ++ ) {
		if( op[i] == 1 ) {
			Assign(l[i],r[i],id[i]) ;
		}
		else {
			Ask(id[i]) ;
		}
	}
 	return 0 ;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用 PyTorch-BigGraph 构建和部署大规模图嵌入的完整教程

当涉及到图数据时&#xff0c;复杂性是不可避免的。无论是社交网络中的庞大互联关系、像 Freebase 这样的知识图谱&#xff0c;还是推荐引擎中海量的数据量&#xff0c;处理如此规模的图数据都充满挑战。 尤其是当目标是生成能够准确捕捉这些关系本质的嵌入表示时&#xff0c;…

如何使用Python代码实现给GPU预加热

如何使用Python代码实现给GPU预加热 一、引言二、使用深度学习框架进行预加热2.1 TensorFlow预加热2.2 PyTorch预加热三、使用CUDA进行预加热四、预加热的效果评估与优化五、结论与展望在高性能计算和深度学习领域,GPU(图形处理器)已经成为不可或缺的加速工具。然而,在实际…

Leecode刷题C语言之统计不是特殊数字的数字数量

执行结果:通过 执行用时和内存消耗如下&#xff1a; bool isPrime(int n){if(n<2){return false;}for(int i2;i*i<n;i){if(n%i0){return false;}}return true; } int nonSpecialCount(int l, int r) {int psqrt(l);int q sqrt(r);int len r-l1;for(int i p; i <q;…

影响电阻可靠性的因素

一、影响电阻可靠性的因素&#xff1a; 影响电阻可靠性的因素有温度系数、额定功率&#xff0c;最大工作电压、固有噪声和电压系数 &#xff08;一&#xff09;温度系数 电阻的温度系数表示当温度改变1摄氏度时&#xff0c;电阻阻值的相对变化&#xff0c;单位为ppm/C.电阻温度…

Typora-PicGo-OSS对象存储

Typora-PicGo-对象存储OSS 问题描述&#xff1a; 上次做完Gitee图床配置后&#xff0c;今天发现图床突然不能使用了&#xff0c;直到我查找到Gitee仓库变成私有后才发现做的图床被封禁了当前仓库因涉嫌外链滥用(RAW)&#xff0c;不支持设置为公开仓库&#xff0c;就导致我的笔…

ESP-KeyBoard:基于 ESP32-S3 的三模客制化机械键盘

概述 在这个充满挑战与机遇的数字化时代&#xff0c;键盘已经成为我们日常学习、工作、娱乐生活必不可少的设备。而在众多键盘中&#xff0c;机械键盘&#xff0c;以其独特的触感、清脆的敲击音和经久耐用的特性&#xff0c;已经成为众多游戏玩家和电子工程师的首选。本文将为…

nohup java -jar supporterSys.jar --spring.profiles.active=prod

文章目录 1、ps -ef | grep java2、kill 13713、ps -ef | grep java4、nohup java -jar supporterSys.jar --spring.profiles.activeprod &5、ps -ef | grep java1. 启动方式进程 1371进程 19994 2. 主要区别3. 可能的原因4. 建议 1、ps -ef | grep java rootshipper:~# p…

大公司如何实现打印机共享的?如何对打印机进行管控或者工号登录后进行打印?异地打印机共享的如何实现可以帮助用户在不同地理位置使用同一台打印机完成打印任务?

大公司如何实现打印机共享的&#xff1f;如何对打印机进行管控或者工号登录后进行打印&#xff1f;异地打印机共享的如何实现可以帮助用户在不同地理位置使用同一台打印机完成打印任务&#xff1f; 如果在局域网内&#xff0c;可以不需要进行二次开发&#xff0c;通过对打印机进…

数字反向输出

数字反向输出 C语言代码C 代码Java代码Python代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 小明听到广播里的数字后&#xff0c;总喜欢反着念给妈妈听。请聪明的你将小明听到的数字反向输出。 输入 输入为一个整型的四位数n 输出 …

Vue页面不显示也不报错是怎么回事?如何解决?

在使用Vue.js进行前端开发时&#xff0c;有时会遇到一种令人困惑的情况:页面既不显示任何内容&#xff0c;控制台也不报错。这种情况往往让开发者摸不着头脑&#xff0c;但不必过分担心&#xff0c;通过一系列的排查和调试步骤&#xff0c;我们可以找到问题的根源并解决它。 本…

利用 GitHub 和 Hexo 搭建个人博客【保姆教程】

利用 GitHub 和 Hexo 搭建个人博客 利用 GitHub 和 Hexo 搭建个人博客一、前言二、准备工作&#xff08;一&#xff09;安装 Node.js 和 Git&#xff08;二&#xff09;注册 GitHub 账号 三、安装 Hexo&#xff08;一&#xff09;创建博客目录&#xff08;二&#xff09;安装 H…

C#开发基础之借用dotnet CLI命令行参数的设计了解命令行构建用法

前言 在C#开发中&#xff0c;命令行参数是一种重要的机制&#xff0c;用于在程序启动时向应用程序传递配置或指令。无论是构建CLI工具还是配置化启动的桌面程序&#xff0c;掌握命令行参数的用法可以帮助我们设计更灵活的应用程序。 本文将详细介绍C#中命令行参数的基本用法、…

【单元测试】【Android】JUnit 4 和 JUnit 5 的差异记录

背景 Jetbrain IDE 支持生成 Test 类&#xff0c;其中选择JUnit5 和 JUnit&#xff0c;但是感觉这不是标准的单元测试&#xff0c;因为接口命名吧。 差异对比 两者生成的单测API名称同原API&#xff0c;没加test前缀的。使用差异主要表现在&#xff1a; setUp &#xff06; …

网页中调用系统的EXE文件,如打开QQ

遇到一个实际的问题&#xff0c;需要在网页中打开本地的某个工业软件。 通过点击exe文件就可以调用到程序。 比如双击qq的exe就可以启动qq的程序。 那么问题就变成了如何加载exe程序呢&#xff1f; 可以通过Java的 Process process Runtime.getRuntime().exec(command);通过…

FME教程:实现按属性字段合并图斑,同时合并属性字段值,对合并的属性值同步进行去重处理的案例思路方法

目录 一、实现效果 二、实现过程 1.读取数据 2.融合图斑 3.合并属性字段值&#xff0c;并去重 4.属性字段值排序、整理 5.输出成果 6.模板的使用 三、总结 今天介绍使用FME实现按属性合并图斑&#xff0c;同时合并属性字段值&#xff0c;并对合并的属性值同步进行去重…

ant-design-vue中table组件多列排序

antD中table组件多列排序 使用前注意实现效果图实现的功能点及相关代码1. 默认按某几个字段排序2. 点击排序按钮可同时对多个字段进行排序3. 点击重置按钮可恢复默认排序状态。 功能实现完整的关键代码 使用前注意 先要确认你使用的antD版本是否支持多列排序&#xff0c;我这里…

【LeetCode热题100】栈

这道题一共记录了关于栈的5道题目&#xff1a;删除字符串中所有相邻重复项、比较含退格的字符串、基本计算器II、字符串解码、验证栈序列。 class Solution { public:string removeDuplicates(string s) {string ret;for(auto c : s){if(ret.size() 0 || c ! ret.back()) ret …

IText创建加盖公章的pdf文件并生成压缩文件

第一、前言 此前已在文章&#xff1a;Java使用IText根据pdf模板创建pdf文件介绍了Itex的基本使用技巧&#xff0c;本篇以一个案例为基础&#xff0c;主要介绍IText根据pdf模板填充生成pdf文件&#xff0c;并生成压缩文件。 第二、案例 以下面pdf模板为例&#xff0c;生成一个p…

C语言——数组逐元素操作练习

定义一个能容纳10个元素的整形数组a&#xff0c;从键盘读取9个整数存放到前9个数组元素中。 一. 从键盘读取一个整数n和位置p(0<p<8)&#xff0c;插入n到数组a中&#xff0c;插入位置&#xff1a;下标p。要求插入点及后续的数组元素都要后移动。 代码如下&#xff1a; …

“iOS profile文件与私钥证书文件不匹配”总结打ipa包出现的问题

目录 文件和证书未加载或特殊字符问题 证书过期或Profile文件错误 确认开发者证书和私钥是否匹配 创建证书选择错误问题 申请苹果 AppId时勾选服务不全问题 ​总结 在上线ios平台的时候&#xff0c;在Hbuilder中打包遇见了问题&#xff0c;生成ipa文件时候&#xff0c;一…