CF1582F Korney Korneevich and XOR

Link.

CodeforcesF1
CodeforcesF2
LuoguF1
LuoguF2

Description.

有一个长度为 n 的序列,求每个严格递增子序列异或值的并。

F1 : n105,V500
F2 : n106,V5000

Solution.

F1 有手就行,直接做,做完了。
大概就是记 dpi 表示当前 值为 i 的点的结束位置最小值。
每次枚举一遍值域就行了,总复杂度 O(nV) 可以过 F1。


F2 以 值建图。
这张图有 O(nV) 条边,有 O(V2) 个点。
而且是一个分层图,从第一层出发走问能否走到某层的指定顶点。
我们考虑 O(V2) 的做法,尝试让 O(nV) 个冗余状态消失。
考虑一个点,它第一遍被更新肯定是最优的,也就是说,只要一个点被更新过,那它状态就确定了。
那我们考虑只让每个点被更新一次,这样复杂度就真了。
我们考虑那些 O(nV) 的边其实有性质,都是 (a,qwq)(at,t) 的边。
所以如果对 (a,?) 已经向 (at,t) 更新过了,那剩下所有边都不需要了。
而且这个边还具有单调性,也就是说每次被更新的肯定是一个后缀(因为 tqwq)。
所以每次更新的肯定是一段区间,然后就可以判断这段区间有没有被覆盖来转移。
均摊一下发现每个点只会被更新 1 次,总更新失败次数 O(n) 次。
然后总复杂度就是 O(V2+n)

考虑一下具体实现。
反过来考虑,考虑一个点更新它的所有出边,因为优美的性质集中在目标点。
相当于我们可以预处理出 (a,qwq) 可以更新到哪些点。
如果它已经被更新了那我们直接可以不管它了。
而且如果当前有一个 (a,qwq)(a,qaq)qwqqaq(a,qaq) 是无意义的。
本质上来说我们可以把某个指定点的每一层给压起来。
然后只需要记录当前这个点的所有层可以转移到哪些点就行了。

Coding.

点击查看代码
//Coded by STUPID_JUSTlN {{{
//Gened on 2021.10.24 18:05:02
//是啊,你就是那只鬼了,所以被你碰到以后,就轮到我变成鬼了
#include<bits/stdc++.h>
using namespace std;typedef long long ll;
template<typename T>inline void read(T &x)
{
	x=0;char c=getchar(),f=0;
	for(;c<48||c>57;c=getchar()) if(!(c^45)) f=1;
	for(;c>=48&&c<=57;c=getchar()) x=(x<<1)+(x<<3)+(c^48);
	f?x=-x:x;
}
template<typename T,typename...L>inline void read(T &x,L&...l) {read(x),read(l...);}//}}}
int n,a[1000005],go[5005][8195],cn[8195],rs[8195],rst;
char dp[8195][5005],v[5005][8195];//走权为 i 的边能到 j
inline void adde(int i,int j) {go[i][++cn[i]]=j;}
int main()
{
	read(n),dp[0][0]=1;for(int i=1;i<=5000;i++) adde(i,i),v[i][i]=1;
	for(int k;n-->0;)
	{
		read(k);
		for(int i=1;i<=cn[k];i++)
		{
			int tw=go[k][i];dp[tw][k]=1;
			for(int j=k+1;j<=5000;j++) if(v[j][tw^j]) break;
				else v[j][tw^j]=1,adde(j,tw^j);
		}cn[k]=0;
	}
	for(int i=0;i<8192;i++) for(int j=0;j<=5000;j++) if(dp[i][j]) {rs[++rst]=i;break;}
	printf("%d\n",rst);for(int i=1;i<=rst;i++) printf("%d%c",rs[i],i==rst?'\n':' ');
	return 0;
}
posted @   Peal_Frog  阅读(240)  评论(1编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示

目录导航