首页 > 其他分享 >P2203题解

P2203题解

时间:2023-09-09 11:22:41浏览次数:36  
标签:状态 int 题解 ++ P2203 变化 模拟

题意

给定一个环形 01 序列,每次变化时,对于每个位置,如果前一个值是 1 ,则当前值翻转。求变化 B 次后的序列。

思路

由于 B 的值很大,所以如果对每一次变化进行模拟,效率非常低下。

不难发现,每一次变化后的状态完全是由当前状态决定的,而 N 的范围很小,所以可能的状态总数 2^N 也不是很大,在模拟状态变化的过程中,必然会形成环,环的部分是不必重复模拟的,而是可以通过取模将绕圈的操作都去掉,最终将模拟的次数控制在状态数量之内。

模拟的时候可以用位运算来加速,而不必每个位置单独计算。

复杂度

时间

压缩状态 O(N) 。

状态数量 O(2^N) ,状态变化 O(1) ,总共 O(2^N) 。

计算目标状态 O(1) 。

解压状态 O(N) 。

总时间复杂度为 O(2^N) 。

附上代码:

 1 #include <betss/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 const int MaxN = 16;
 6 const int MaxL = 1 << 16;
 7 
 8 int l[MaxL], p[MaxL];
 9 int n, m, x;
10 long long b;
11 
12 int main() {
13   cin >> n >> b;
14   for (int i = 0; i < n; i++) {  // 压缩表示
15     cin >> x;
16     l[1] |= x << i;
17   }
18   for (m = 1; !p[l[m]]; m++) {                                           // 寻找循环节
19     p[l[m]] = m;                                                         // 记录位置
20     l[m + 1] = l[m] ^ (l[m] << 1 & ((1 << n) - 1)) ^ (l[m] >> (n - 1));  // n位循环左移取与
21   }
22 
23   if (++b >= m) {  // 超出循环节的部分取余
24     b = (b - p[l[m]]) % (m - p[l[m]]) + p[l[m]];
25   }
26   for (int i = 0; i < n; i++) {  // 拆分输出
27     cout << (l[b] >> i & 1) << endl;
28   }
29   return 0;
30 }
Code

 

标签:状态,int,题解,++,P2203,变化,模拟
From: https://www.cnblogs.com/mouseboy/p/17689086.html

相关文章

  • CF812B题解
    康了康唯一的题解,说没必要用DP,我就给出DP的解法。这其实是道水题,唯一的坑是有可能楼上没有开的灯,坑了我们机房的一堆人(WAontest4),剩下的就是DP。我们用a[n][0],表示第n层的第一个房间,用a[n][1],表示第n层的最后一个房间。这里提供一个收集型的写法。所以可得状态转移......
  • CF1690E题解
    ##主要题意:有$n$个礼物,要两两合并,然后除以$k$最后求和最大。##思路:先加入每个数除以$k$的商(单独组成$k$的个数),然后全部$\bmod\k$存入数组,排序,最后双指针一个前一个后求两个余数可以大于等于$k$的两个礼物。##代码:```cpp#include<bits/stdc++.h>usingname......
  • CF1690C题解
    ##主要题意:>有$n$个任务,必须在$s_i$到$t_i$之间完成,求每个任务最大可以完成多久(优先前面的最大)。##思路>就拿一个变量记录当前时间,然后贪心选择$a[i].t$和$a[i+1].t$中的最小值,(应为至少也要给下一个任务留$1$的时间),最后做减法,输出即可。##代码>```cpp>#incl......
  • pytest运行警告问题解决:DeprecationWarning: pkg_resources is deprecated as an API
    前言最近在运行pytest的时候,经常出现这个警告DeprecationWarning:pkg_resourcesisdeprecatedasanAPISeehttps://setuptools.pypa.io/en/latest/pkg_resources.htmlfrompkg_resourcesimportiter_entry_points从警告上看是方法被弃用,肯定是因为新版弃用了旧版的语法。......
  • luogu P1419 题解
    题目链接description给定一个长度为\(n\)的序列(值域为\([-10^4,10^4]\))和正整数\(st,ed\)。求一个区间,使得其长度\(\in[st,ed]\)且平均值最大,输出平均值。\(1\leqn\leq10^5\)solution这里给出一个复杂度线性的做法。求出前缀和数组\(s\),答案相当于\(\max\limit......
  • 【题解】CF1830A Copil Copac Draws Trees
    你考虑对于每一条边打上时间标记,然后在树上DFS的时候维护一下以\(u\)为根的答案即可,然后将答案合并,反正很简单,看代码就懂。code:#include<bits/stdc++.h>usingnamespacestd;constintNN=2e5+8;intt,n;structEdge{ intto,next,val;}edge[NN<<1];inthead[......
  • 【题解】CF1854E Game Bundles
    你考虑我们需要构造出一组解,显然地这样的解有很多很多种(\({60^{60}}\)显然是及其地大)。那关键是我们如何进行构造。我们很容易知道每个集合里面\(>30\)的数只有一个。所以我们可以在\([1,30]\)中随机\(a_i\),直到满足的组数恰好小于等于\(a_i\),添加的时候维护数组\(f_i......
  • 【题解】CF1854D Michael and Hotel
    交互题。考虑题意即为找到\(1\)所在内向基环树上的所有点。我们考虑我们怎么找到环上的点,我们考虑我们可以\(O(\logn)\)询问到一个环上的点,方法即为将\(k\)定为一个大数,然后二分点集。然后我们便可以在\(O(n\logn)\)的时间复杂度内找到所有环上的点(我们一会儿再讲怎......
  • 【题解】CF1854C Expected Destruction
    你考虑,我们如果没有重合就将元素删去的操作,我们就有答案:\(n\times(m+1)-\sum\limits_{i=1}^na_i\)但是,我们显然最后的答案是小于这个的,如果有两个数在\(i\)相撞,那么我们的答案就会减少\((m-i+1)\)我们设\(f_{i,j}\)表示两个数分别在\(i\)和\(j\)的概率\((i\leqj......
  • 【疑难解决】运行EasyRTSPSever组件提示程序无法启动问题解决
    RTSP协议以客户服务器方式工作,它是一个多媒体播放控制协议,用来使用户在播放从因特网下载的实时数据时能够进行控制,如:暂停/继续、后退、前进等。因此RTSP又称为“因特网录像机遥控协议”。我们的RTSP-Sever组件EasyRTSPSever就是一款比较便捷的组件。我们有开发者在测试EasyRTSPS......