首页 > 其他分享 >P9017 [USACO23JAN] Lights Off G 题解

P9017 [USACO23JAN] Lights Off G 题解

时间:2024-01-17 09:22:35浏览次数:26  
标签:状态 P9017 开关 int 题解 Lights 异或 操作 dp

一次操作相当于把 \(a\) 异或上 \(b\),修改开关的一位相当于将这一位异或上 \(1\)。

会发现一个很神奇的性质:初始开关对灯的影响和改变开关状态对灯的影响是独立的。而前者的影响是固定的,所以我们可以只考虑改变开关状态对灯的影响。假设一共需要 \(k\) 次操作能使所有灯关闭,如果我们在第 \(i\) 次操作的时候改变了开关 \(p\) 的状态,那么第 \(i+1\) 次的时候这个开关会影响到 \(p+1\)(因为要循环右移一位),第 \(i+2\) 次操作会影响到 \(p+2\)。所以如果在第 \(i\) 次操作改变一个开关的状态,那么相当于将长度为 \(m-i+1\) 的一段区间全部影响了(异或上 \(1\))。那么如果我们一共需要 \(k\) 次操作,那么我们可以分别修改长度为 \(1\) 到 \(k\) 的区间各一次。注意这里的区间指的不一定是连续的,也有可能是一段前缀加一段后缀(因为可能循环右移)。并且如果一个点被修改(异或)两次的话相当于不修改。

设 \(dp_{i,j}\) 表示 \(i\) 次操作(第 \(i\) 次操作指的是将一段长度为 \(i\) 的区间异或上 \(1\))之后能否达到 \(j\) 状态。那么转移方程为 \(dp_{i,j}=dp_{i,j} | dp_{i-1,j ^ k}\),其中 \(k\) 是长度为 \(i\) 的区间。时间复杂度 \(O(2^n\times n^2)\),可以通过。

还可以优化。如果一个状态是另一个状态通过循环右移得到的,那么这两个状态的 \(dp\) 值一定相同,可以只用记录一次。时间复杂度 \(O(2^n \times n)\)。

#include<bits/stdc++.h>
using namespace std;
const int N = 2e6 + 10;
int f[45][N],t,n,p[N];
char a[N],b[N];
int g(int x){return (x >> 1) + ((x & 1) << n - 1);}
signed main()
{
	cin >> t >> n;
	memset(p,-1,sizeof p);
	for(int i = 0;i < (1 << n);i++)
	{
		int x = i;
		while(p[x] == -1) p[x] = i,x = g(x); 
	}
	f[0][0] = 1;
	for(int i = 1,s = 0;i <= 2 * n;i++)
	{
		s ^= (1 << ((i - 1) % n));
		for(int j = 0;j < (1 << n);j++)
			f[i][p[j]] |= f[i - 1][p[j ^ s]];
	}
	while(t--)
	{
		cin >> a >> b;
		int A = 0,B = 0;
		for(int i = 0;i < n;i++)
			A |= ((a[i] - '0') << (n - i - 1)),
			B |= ((b[i] - '0') << (n - i - 1));
		if(A == 0){puts("0");continue;}
		for(int i = 1;;i++)
		{
			A ^= B,B = g(B);
			if(f[i][p[A]]){cout << i << endl;break;}
		}
	}
	return 0;
}

标签:状态,P9017,开关,int,题解,Lights,异或,操作,dp
From: https://www.cnblogs.com/Creeperl/p/17969053

相关文章

  • CF1876D Lexichromatography 题解
    Problem-D-CodeforcesLexichromatography-洛谷先注意读题:对于所有的值\(k\),在这个序列的任意子区间\([l,r]\)中,值为\(k\)且为红色的位置数减去值为\(k\)且为蓝色的位置数的绝对值不超过\(1\)注意是任意子区间这说明什么?说明如果只有第二个条件,我......
  • P2572 [SCOI2010] 序列操作 题解
    题解:序列操作比较综合的ds题,综合了线段树常见的几种操作:维护最大子段和、区间翻转、区间求和、区间覆盖。维护子段和常见的我们维护三类东西:前缀最长连续段、后缀最长连续段、当前区间上的最大子段和。在pushUp时,对于一个区间的前后缀最值首先等于左右子树的最长前后缀,......
  • P6054 题解
    blog。网络流——最小割。每个选手做某一套题的期望奖励固定,计算方式参考样例解释。这个假期望被去掉了。发现是典型的「\(m\)种强制选一」问题。考虑每个人都建一条链,跑最小割,每条链必定割\(\ge1\)条边,割哪条边就表示选哪套题。code,时间复杂度\(O(\text{能过})\)。......
  • 洛谷P10058 题解
    这种翻转的题明显已经做烂了好吧……首先显而易见,翻转偶数次对结果没有影响,只需要考虑奇数次翻转的情况。由于是整体移动的操作,可以抓住一个点来移动,然后还原出原来的序列。需要注意的是字符串是环形移动,因此如果当前点的位置大于字符串长度,要对字符串的长度进行取余操作。写......
  • Atcoder Beginner Contest 330 题解
    AtCoderBeginnerContest330题解A-CountingPasses签到voidShowball(){intn,l;cin>>n>>l;intcnt=0;for(inti=0;i<n;i++){intx;cin>>x;cnt+=(x>=l);}cout<<cnt<<endl;}B-Minimize......
  • CF1437F Emotional Fishermen 题解
    题意:有\((n\le5000)\)个渔民,每个渔民钓了一条重\(a_i\)的鱼,渔民按任意顺序展示他们的鱼。若当前渔民的鱼的重量为\(x\),之前展示过的鱼的最大重量\(y\)。一个排列满足条件当且仅当对于每个\(x\),满足\(2y\lex\)或\(2x\ley\)。问有多少个排列满足条件,对\(998244353......
  • ABC336 F Rotation Puzzle 题解
    QuestionABC336FRotationPuzzle给出一个\(H\timesW\)的矩阵,里面填有数字,有一种操作选定一个\((x,y)\)交换\((i+x,j+y)\)和\((H-i+x,W-j+y)\)对于每一个\(1\lei\leH-1,1\lej\leW-1\)问,是否能经过\(20\)次以内的操作使得,最后的矩形变成\((i,j)=((i-1)\t......
  • P1002题解
    思路设\(dp_{i,j}\)表示第\(i\)行\(j\)列卒走到这里有多少种方式。卒是可以向右和下走,所以到这个点只能从左或上来,不难得出转移公式:\(dp_{i,j}=dp_{i-1,j}+dp_{i,j-1}\)。如果马在这个点上或者说马能到这个点上,那么卒不能到这个点,也就是卒到这个点的方式为\(0\)。如......
  • P1003题解
    简单模拟题。思路枚举每一个地毯,因为后面的会覆盖前面的,所以从正序枚举。如果要求的点的坐标在当前地毯上,则将答案赋值为当前地毯编号。最后输出答案。那如果这个点没有地毯呢?答案初始设为\(-1\),这样没有地毯覆盖的话,答案不会改变,这样输出答案就会是\(-1\)。注意:记得赋初......
  • P10058题解
    怎么前三题都是思维题啊。思路总共有三个操作,先不看翻转操作。如果你右移\(x\)位之后,左移\(x\)位,那么就相当于没有操作。这个应该是很好理解的。我们根据上面的结论,能得出以下代码。if(op==">"){cin>>x;f+=x;}elseif(op=="<"){......