首页 > 其他分享 >CSP 模拟 26

CSP 模拟 26

时间:2024-08-22 19:04:14浏览次数:12  
标签:std 26 ch int cnt long mx CSP 模拟

T1 博弈

博弈策略是显然的,只有当所有数的数量全是偶数是,才是后手必胜,考虑随机异或哈希,找一遍后直接统计。

T2 跳跃

容易想到的是一个 \(\mathcal{O}(nk)\) 的 dp,但是带了 \(k\),比较难处理。
可以这样考虑,最后一定是到了一个位置 \(x\),以 \(x\) 为右端点,在它的区间最大左端点之间反复横跳。
设 \(f_i\) 表示向右第一次调到 \(i\) 位置的最小跳跃次数,\(d_i\) 表示此时的最大权值。因为这样的设计,所以不会有 \(f_i\) 由 \(j\ge i\) 转移而来,因此没有后效性。
预处理出每个位置向左最大的左端点,转移就是枚举 \(j<i\),计算它反复横跳多少次才能跳到 \(i\),细节比较多,要注意奇偶和负数,挺多特判。

点击查看代码
#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=1005,inf=2e9;
std::pair<int,int> f[N];
int n,a[N],s[N],mx[N],L[N],k;
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);
	int T=read();
	while(T--){
		n=read();k=read();int min=0,pos=0;
		for(int i=1;i<=n;++i){
			a[i]=read(),s[i]=s[i-1]+a[i],f[i]={inf,0},L[i]=pos,mx[i]=s[i]-s[pos];
			if(min>s[i])pos=i,min=s[i];
		}
		for(int i=1;i<=n;++i)if(s[i]>=0)f[i]={1,s[i]};
		for(int i=2;i<=n;++i){
			for(int j=1;j<i;++j){
				if(f[j].first>=k||f[j].first>f[i].first)continue;
				if(f[j].second+mx[j]>=0&&f[j].second+mx[j]+(s[i]-s[L[j]])>=0){
					int cnt=f[j].first+2,val=f[j].second+mx[j]+s[i]-s[L[j]];
					if((f[i].first==cnt&&f[i].second<val)||f[i].first>cnt)f[i]={cnt,val};
				}else if(mx[j]>0){
					int cnt=(std::abs(s[i]-s[L[j]])-f[j].second-1)/mx[j]+1;
					if((cnt&1)==0)cnt++;
					int val=f[j].second+cnt*mx[j]+s[i]-s[L[j]];cnt=f[j].first+cnt+1;
					if((f[i].first==cnt&&f[i].second<val)||f[i].first>cnt)f[i]={cnt,val};
				}
			}
		}int ans=0;
		for(int i=1;i<=n;++i)if(k>=f[i].first)ans=std::max(ans,f[i].second+(k-f[i].first)*mx[i]);
		std::cout<<ans<<'\n';
	}
}

T3 大陆

给树分块方式的板子,从底往上分块一定没问题,考虑递归处理问题。
维护一个栈,这个栈中保存的是还未进行分块的节点,当进入一个节点 \(u\) 时,将他入栈,记一下当前栈的大小为 \(now\),考虑对于 \(u\) 的子节点 \(v\),当搜索完 \(v\) 的子树后,如果当前栈的大小减去 \(now\) 大于等于 \(B\),直接将他们分块,省会是节点 \(u\),弹栈直到栈的大小等于 \(now\),处理完所有子节点之后,将 \(u\) 入栈。最后栈中会剩下一些节点,他们属于最后一个块。

  • 来仔细思考这个过程,首先,每次解决完子节点 \(v\) 后,子节点最多会往栈里贡献 \(B-1\) 个点,所以对于这样分出的一个块他的大小最大是 \(2B-1\) 的,同理最后最多剩下 \(B\) 个节点未分块,将他们并入最后一个块,保证了块的大小是小于等于 \(3B-1\) 的。
点击查看代码
#include<bits/stdc++.h>
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=1e5+10;
int n,s[N],top,B,cnt,rt[N],bl[N];
std::vector<int> e[N],ans[N];
inline void dfs(int u,int fa){
	int zc=top;
	for(int v:e[u]){
		if(v==fa)continue;
		dfs(v,u);
		if(top-zc>=B){
			rt[++cnt]=u;
			while(top>zc)bl[s[top--]]=cnt;
		}
	}
	s[++top]=u;
}
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(),B=read();for(int i=2,u,v;i<=n;++i)u=read(),v=read(),e[u].emplace_back(v),e[v].emplace_back(u);dfs(1,0);
	if(!cnt)rt[++cnt]=1;while(top)rt[cnt]=s[top],bl[s[top--]]=cnt;
	std::cout<<cnt<<'\n';for(int i=1;i<=n;++i)std::cout<<bl[i]<<' ';std::cout<<'\n';for(int i=1;i<=cnt;++i)std::cout<<rt[i]<<' ';std::cout<<'\n';
}

T4 排列

平衡树,

标签:std,26,ch,int,cnt,long,mx,CSP,模拟
From: https://www.cnblogs.com/Ishar-zdl/p/18374535

相关文章

  • 模拟退火算法的理论基础
    模拟退火算法是一种基于概率的,可以有效避免陷入局部极小并最终趋于全局最优的串行结构的优化算法。通常用于解决:可行解过多、传统算法运算时间过长、筹款组合方案过多和NP-hard等问题目录一、模拟退火的思想与提出1.基本思想2.贪心算法失效--陷入局部最优3.模拟退火如何解决解决......
  • 暑假集训csp提高模拟27
    赛时rank17,T1100,T20,T30,T470T2一眼OSU的拓展版,懒得打了。T4写了一个奇怪的做法,轻轻松松拿70?T3读假题了,然后间接导致了我与STL和pbds斗智斗勇。题可能不算很难但是我糖线性只因用bitset记录每个数在二进制下的每一位,从高位到低位贪心即可。如果可以的数小于m个,那么就......
  • 『模拟赛』暑假集训CSP提高模拟27 || The End
    《$Never\;Over$》好久没推歌了。Idon'tknowwhattosayIdon'tknowwhattodoIjustwannagorightbacktoyouLikeacloudintheskyMytearsfallforyouIwouldpaintmylifeWhitejusttomakeyoublueCausebabyyouknowweshouldbetogethe......
  • csp模拟27-金箱子(题解)
    题目链接(显然还没有找到原题)虽说我现在才学会期望dp显得不太好,但没办法,谁让我比较菜~~,之前模拟赛已经考过几道类似的题了,但都一笔带过了,这次算是正式学习了一下这类题,于是就有了这篇题解。首先看到k次方首先想到的就是我们在进行dp转移的时候不太方便,这个时候很自然的想到二项......
  • 创新实践:流媒体服务器如何推动WebRTC支持H.265及JS硬软解码(MSE硬解、WASM软解)
    为了实现这一全面的解决方案,我们投入了近半年的时间进行调研与研发。我们的主要目标是:让流媒体服务器能够直接传输H.265编码的视频,而无需将其转码为H.264,从而使Chrome浏览器能够无缝解码并播放H.265视频。值得注意的是,目前市场上许多软硬件产品仍采用将H.265转码为H.264的方式来......
  • 创新实践:流媒体服务器如何推动WebRTC支持H.265及JS硬软解码(MSE硬解、WASM软解)
    为了实现这一全面的解决方案,我们投入了近半年的时间进行调研与研发。我们的主要目标是:让流媒体服务器能够直接传输H.265编码的视频,而无需将其转码为H.264,从而使Chrome浏览器能够无缝解码并播放H.265视频。值得注意的是,目前市场上许多软硬件产品仍采用将H.265转码为H.264的......
  • 集合及数据结构第八节(上)————栈(Stack)、栈的模拟实现和应用
    系列文章目录集合及数据结构第八节(上)————栈(Stack)、栈的模拟实现和应用栈(Stack)、栈的模拟实现和应用(上)栈的概念栈的使用栈的模拟实现栈的应用场景栈、虚拟机栈、栈帧的概念区分文章目录系列文章目录集合及数据结构第八节(上)————栈(Stack)、栈的模拟实现和应用......
  • 集合及数据结构第七节————LinkedList的模拟实现与使用
    系列文章目录集合及数据结构第七节————LinkedList的模拟实现与使用LinkedList的模拟实现与使用无头双向链表实现什么是LinkedListLinkedList的使用LinkedList的遍历ArrayList和LinkedList的区别文章目录系列文章目录集合及数据结构第七节————LinkedList的模......
  • 暑假集训CSP提高模拟27
    暑假集训CSP提高模拟27组题人:@KafuuChinocpp\(T1\)P236.线性只因\(100pts\)诈骗题。部分分正解记\(opt\)表示待选集合,统计\(opt\)中这一位为\(1\)的数并加入临时集合\(tmp\)。若\(tmp\)大小\(\gem\)则加上这一位的贡献并将\(opt\)赋成\(tmp\)......
  • CSP防爆
    今日模拟赛T3把ac.inac.out愣是写成ac.txtac.txt自己在IDE里测大样例用的是.txt,提交没改过来100->0啊啊啊啊啊啊啊啊啊啊啊啊T6见祖宗0<=x<=1e9还要求和爆int但我没看见.....(100->90啊啊啊啊啊啊啊啊啊啊啊啊430->340经验考试绝不开多个页面,容易看错内存不紧......