首页 > 其他分享 >GMOJ 8101. 【2024年SD省队集训Day8】 正交向量

GMOJ 8101. 【2024年SD省队集训Day8】 正交向量

时间:2024-08-08 19:49:11浏览次数:15  
标签:8101 Day8 int pow3 钦定 一位 2024 nS 位是

效率

时间复杂度:\(O(Tn\times 3^9\times 9)\)。

没有任何卡常,能在 \(1.08\)s 内过 hack.txt,而 CHJ 的代码在同样情况下跑了 \(39\)s,LZY 要用 \(34\)s,PWX 要用 \(75\)s。

但是在 GMOJ 上要用 \(770\)ms,是目前比较劣的解。

思路

以下关于数字的第几位都是从 \(0\) 开始,从最低位到最高位编号,例如数据中 \(a_i\) 的最大值最高位是第 \(8\) 位。用 & 表示位运算中的与。

极小正交子集中,所有数的 & 是 \(0\),每一个数都至少有一个二进制位是集合中唯一一个该位是 \(0\) 的。

比如 3 5 6 中,\(3\) 的第 \(2\) 位是 \(0\),\(5\) 的第 \(1\) 位是 \(0\),\(6\) 的第 \(0\) 位是 \(0\)。

这是因为,如果有一个数,它没有这样的一位,那么把它去掉其余数的 & 仍然是 \(0\)。

那么钦定一些数没有这样的一位,也就相当于钦定 & 的某一位有至少一个数这一位是 \(0\)。

设钦定的数集合为 \(X\),那么它的容斥系数是 \((-1)^{|X|}\)。

设 \(f_{i,S}\) 表示现在处理了前 \(i\) 个数,现在的状态是 \(S\),的结果,其中 \(S\) 的第 \(j\) 位对应选了的数的 & 在二进制下的第 \(j\) 位,意义如下:

  • 0:当前 & 的第 \(j\) 位是 \(1\)。
  • 1:当前 & 的第 \(j\) 位是 \(0\),钦定有至少两个数这一位是 \(0\),但现在只有一个数这一位是 \(0\),这意味着,还要再加多一个这一位是 \(0\) 的数才满足钦定。
  • 2:当前 & 的第 \(j\) 位是 \(0\),且满足约束条件,这有两种情况:钦定有至少两个数这一位是 \(0\),且已经满足条件;不钦定有几个数这一位是 \(0\)。

把 \(f_{i-1,S}\) 转移给 \(f_{i}\),还是分三种情况:

  • 不选 \(a_{i}\):转移到 \(f_{i,S}\)。
  • 选 \(a_{i}\),且钦定它在集合 \(X\) 里:枚举 \(a_i\) 的每一位,如果是 \(0\),就可以用来改变 \(S\) 的对应位:如果 \(S\) 的这一位是 \(0\),就改为 \(1\),因为没满足钦定条件;如果 \(S\) 的这一位是 \(1\) 或者 \(2\),就改为 \(2\),因为已经满足了钦定条件。转移的时候要乘 \(-1\) 的容斥系数。
  • 选 \(a_{i}\),且不钦定它在集合 \(X\) 里:同样地枚举 \(a_{i}\) 的每一位,如果是 \(0\),就可以改变 \(S\) 的对应位:把这一位改成 \(2\),因为这一位已经满足了条件。容斥系数为 \(1\)。

这样子,状态数是 \(3^9\) 个,因为 \(a_{i}\) 最多有 \(9\) 位,总的时间复杂度是 \(O(Tn\times 3^9 \times 9)\)。

代码

点击开 D
const int N=105,A=512,L=12,TOT=19683,moder=998244353;
int T,n,a[N]={},pow3[L]={1},f[N][TOT]={};
int main()
{
	usefile("ov");
	int i,S,j,nS;
	for(i=1;i<L;++i) pow3[i]=pow3[i-1]*3;
	read(T);
	loop : --T;
	read(n);
	for(i=0;i<n;++i)
		read(a[i]);
	memset(f,0,(n+2)*sizeof(f[0]));
	f[0][0]=1;
	for(i=0;i<n;++i)
		for(S=0;S<pow3[9];++S)
			if(f[i][S]) {
				// 不选
				Add(f[i+1][S],f[i][S]);
				// 钦定为 X
				for(j=0,nS=S;j<9;++j)
					if(a[i]>>j&1) ;
					else if(S/pow3[j]%3==2) ;
					else nS+=pow3[j];
				Sub(f[i+1][nS],f[i][S]);
				// 钦定不为 X
				for(j=0,nS=S;j<9;++j)
					if(a[i]>>j&1) ;
					else nS=nS+(2-S/pow3[j]%3)*pow3[j];
				Add(f[i+1][nS],f[i][S]);
			}
	printf("%lld\n",f[n][pow3[9]-1]);
	if(T) goto loop;
	return 0;
}

标签:8101,Day8,int,pow3,钦定,一位,2024,nS,位是
From: https://www.cnblogs.com/fydj/p/-/GMOJ8101

相关文章

  • 2024北京集训trick合集
    atcoderARC092F给定一张\(n\)个点\(m\)条边的有向图,判断每一条边反向后是否改变图中强连通分量的数量。数据范围:\(n\le1000\\\\m\le200000\)先跑一遍tarjan,然后问题转化为判断每个直接相连的两点在不经过其连边的情况下是否互通。对每个点dfs维护前缀和后缀能否回......
  • 2024睿抗机器人开发者大赛(RAICOM) CAIP编程技能赛 国一
    最后91分,国一。前几题都AK了,最后一题先是输出0,得了个1分。花了一个小时都没解决这题,难受ing,其实到最后差不多要改对了(降落那一部分没时间改),但是没时间了,hhhh。拿到国一,简直圆梦啦!!!本科拿的国三,差0.02秒就是国二,从此内心蒙上阴影。哭死ing研一终于拿了个编程比赛的国一,也算......
  • 2024年深圳市工业设计发展扶持计划申报时间
    为了进一步提升深圳市工业设计水平,加快工业设计与制造业的深度融合,2024年深圳市工业设计发展扶持计划现已全面启动。该计划旨在通过资金支持、政策优惠等多种方式,鼓励和支持工业设计企业及个人进行技术创新和产品开发,以增强深圳工业设计在全球市场的竞争力。对于符合条件的企业......
  • 2024年苏州市跨国公司地区总部和功能性机构申报临近截止时间
    苏州市跨国公司地区总部和功能性机构申报的截止时间已经迫在眉睫——8月12日。对于尚未提交申报材料的企业,现在是时候加快步伐,把握这最后的申报机会了。项目介绍苏州市一直致力于吸引和培育跨国公司地区总部及功能性机构,以推动外资总部经济的发展。截至目前,苏州已成功吸引了......
  • 2024年度勘察设计注册工程师资格考试报考条件
    2024年度勘察设计注册工程师资格考试报考条件一.注册土木工程师(岩土)资格考试条件(一)参加注册土木工程师(岩土)基础考试,应具备下列条件之一:⑴取得本专业或相近专业大学本科及以上学历或学位。⑵取得本专业或相近专业大学专科学历,从事岩土工程专业工作满1年。⑶取得其他工科专......
  • 2024年TI杯E题-三子棋游戏装置方案分享-jdk123团队-第一弹赛题的选择与前期方案的准备
    赛前准备本来我们团队前几个月的准备都在小车上,赛前也完成了STM32,树莓派4B,Openmv等几款常见主控板来对小车完成基本的模块封装控制。我们团队的大部分精力以及预算都准备在了小车上面。赛题选择由于在赛题公布的的那一天,我们发现H题,自动行驶小车,要求指定使用TI板子,此时......
  • 2024-08-07 多校联合暑假训练赛第四场 补题+分析
    A.小盒子题意+思路:题意其实概括的不是非常准确简要题意:圆盒有n个格子,格子自带ai个棋子.是否通过任意起点通过顺时针-1,-2,...,-n的操作使得圆盒中所有所有的棋子都为0思路:贪心对于所有棋子通过顺时针操作的时候每一次都是(1+n)*n/2次是一个等差公式所以......
  • 2024-8-7 算法学习
    P6136【模板】普通平衡树(数据加强版)题意:1,插入一个数;2,删除一个数3,查询一个数的排名4,查询第x个数5,查询x的前驱和后继重点在于分裂split和合并merge操作:1:分裂为X[0,x],Y[x+1,n],后rt=merge(X,x,Y)2:分裂为X[0,x-1],Y[x,x],Z[x+1,n]后Y=merge(Y.l,Y.r),后rt=merge(X,Y,Z);3......
  • VB.NET钢琴MIDI简谱播放器代码QZQ2024-8-7
    ImportsSystem.Runtime.InteropServicesPublicClassForm1'义WindowsAPI函数<DllImport(“winmm.dll”)>PrivateSharedFunctionmidiOutGetNumDevs()AsIntegerEndFunction<DllImport("winmm.dll")>PrivateSharedFunctionmidiOutGet......
  • 20240808题解
    话说T2写了个动态树结果考场调不出来,这下大炮打蚊子了。森林(forest)题面:符合条件的森林中深度相同的点度数相同,\(1\lei\len\),求点数为\(i\)的符合条件的森林的种类数。题解:将森林中每一个根节点连到同一个节点上变成一棵树。令\(f(i)\)表示符合条件的树的种类数,那么\(f(i......