[USACO23JAN] Lights Off G题解

这篇具有很好参考价值的文章主要介绍了[USACO23JAN] Lights Off G题解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

洛谷[USACO23JAN] Lights Off G

题目大意

贝西想要睡觉,但是农场的灯一直开着,影响它睡觉。 贝西有两个长度为 n n n 01 01 01字符串,分别表示 n n n盏灯的序列和开关的序列。其中,表示灯的序列, 0 0 0表示关灯, 1 1 1表示开灯;表示开关的序列, 1 1 1表示可操控的, 0 0 0表示不可操控。

一次操作由下面几个步骤组成:

  • 将一个开关的状态变换,即由可操控变成不可操控;或者不可操控变成可操控
  • 对每一个可操控的开关,按下开关,对应的灯的状态将发生变换,开变成关,关变成开
  • 将开关循环移位,即开始的开关是 s 0 s 1 … s n − 1 s_0s_1\dots s_{n-1} s0s1sn1,循环移位后变成 s n − 1 s 0 … s n − 2 s_{n-1}s_0\dots s_{n-2} sn1s0sn2

求最小的操作次数,使得所有的灯都关掉。

t t t组数据。

1 ≤ t ≤ 2 × 1 0 5 , 2 ≤ n ≤ 20 1\leq t\leq 2\times 10^5,2\leq n\leq 20 1t2×105,2n20


题解

设灯的 01 01 01串为 a a a,开关的 01 01 01串为 b b b

首先,操作次数不会超过 3 n 3n 3n。先用最多 n n n次来将所有开关全部关闭,然后每连续两次,分别打开、关闭开关来把某个灯关掉。

因为操作一是需要设定的,而操作二和操作三是一定的,所以可以将两者分开处理。

对于操作二和操作三,就是 a = a ⊕ b a=a\oplus b a=ab,然后将 b b b循环移位,再进行 a = a ⊕ b a=a\oplus b a=ab,进行的次数与操作次数一致。

对于操作一,设 f i , j f_{i,j} fi,j表示前 i i i次是否能达到状态 j j j,那么 f i , j f_{i,j} fi,j可以由 f i − 1 , j ⊕ x f_{i-1,j\oplus x} fi1,jx转移得到,其中 x x x可取所有长度为 i i i的连续段。

这样做的话,总时间复杂度为 O ( n 2 ⋅ 2 n + n T ) O(n^2\cdot 2^n+nT) O(n22n+nT)。但因为常数较大,所以我们还需要进一步优化。

如果两个状态 x , y x,y x,y可以用过循环移动得到,那么显然 f i , x = f i , y f_{i,x}=f_{i,y} fi,x=fi,y,所以可以用最小的 j j j作为所有能通过循环移动得到 j j j的元素的代表 v j v_j vj。这样的话,能通过循环移动得到的 j j j只需计算一次。那么,固定 x x x移动 j j j,即可处理 j j j经过各个 x x x来更新 f i , j f_{i,j} fi,j的情况。

总时间复杂度为 O ( n ⋅ 2 n + n T ) O(n\cdot 2^n+nT) O(n2n+nT)文章来源地址https://www.toymoban.com/news/detail-537212.html

code

#include<bits/stdc++.h>
using namespace std;
int qt,n,v1,v2,v[1<<21];
bool f[65][1<<21];
char s[105],t[105];
int tn(int x){
	return (x>>1)|((x&1)<<n-1);
}
int gt(int x,int y){
	if(x==0) return 0;
	for(int i=1;i<=3*n;i++,y=tn(y)){
		x^=y;
		if(f[i][v[x]]) return i;
	}
}
int main()
{
	scanf("%d%d",&qt,&n);
	memset(v,-1,sizeof(v));
	for(int i=0;i<1<<n;i++){
		int p=i;
		while(v[p]==-1){
			v[p]=i;p=tn(p);
		}
	}
	f[0][0]=1;
	for(int i=1,x=0;i<=3*n;i++){
		x^=1<<(i-1)%n;
		for(int j=0;j<1<<n;j++){
			f[i][v[j]]|=f[i-1][v[j^x]];
		}
	}
	while(qt--){
		scanf("%s%s",s+1,t+1);
		v1=v2=0;
		for(int i=1;i<=n;i++){
			v1=v1<<1|(s[i]-'0');
			v2=v2<<1|(t[i]-'0');
		}
		printf("%d\n",gt(v1,v2));
	}
	return 0;
}

到了这里,关于[USACO23JAN] Lights Off G题解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 23.7.25 杭电暑期多校3部分题解

    题目大意 你有一个长度为 n n n 的序列,你每次可以向一个栈内放一个数,如果栈不为空并且栈顶的数大于你放的数,那么你放的数会变成栈顶的数再放入,问当栈的大小为 1 1 1 到 n n n 时分别有几种情况 解题思路 考虑dp, f i , j f_{i,j} f i , j ​ 表示放了 i i i 个数,最大的数

    2024年02月15日
    浏览(37)
  • 23.8.8 杭电暑期多校7部分题解

    题目大意 有两个玩家和一棵树,初始状态玩家一和玩家二分别在两个点 x ,   y x,space y x ,   y ,每次操作可以走一个与当前点有连边并且双方都没走到过的点,问最后是谁赢 解题思路 因为不能走走过的点,因此每个人走的路径一定是一条链 很明显当玩家一不选择往与玩家二

    2024年02月13日
    浏览(36)
  • 【算法题解】23. 「滑动窗口最大值」单调队列解法

    这是一道 困难 题 题目来自:https://leetcode.cn/problems/sliding-window-maximum/ 给你一个整数数组 nums ,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1: 示

    2023年04月11日
    浏览(54)
  • 【unity】URP的shader开发中支持多光源,_ADDITIONAL_LIGHTS_VERTEX 和 _ADDITIONAL_LIGHTS 区别

    项目里有一个其他同事实现的shader,美术那边希望能支持多个光源, 我一看代码里面, frag 函数里已经实现了   代码也加了:             #pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS 材质里加了这个keyword还是没起作用,   若宏控制注了有效。  一开始没搞明白

    2024年02月11日
    浏览(49)
  • 多光源渲染方案 - Many Lights Sampling

    目录 Importance Sampling(IS) Light BVH [2018~2019] 预构建 BVH 重建 BVH 基于 BVH node 的 IS Real-time Stochastic Lightcuts [2020] 莫顿序排序(Morton Order Softing) 构建 Light Tree 基于 Lightcuts 的 IS Cut Sharing ReSTIR( Re servoir S patio- T emporal I mportance R esampling)[2020] Resampled Importance Sampling (RIS) Weighted Res

    2024年02月08日
    浏览(54)
  • Windows Server 2022 中文版、英文版下载 (updated Jan 2023)

    Windows Server 2022 正式版,2023 年 1 月更新,持续更新中 … 请访问原文链接:https://sysin.org/blog/windows-server-2022/,查看最新版。原创作品,转载请保留出处。 作者主页:www.sysin.org 此次发布更新了什么?答:版本号,当然还有… 2021.09.01 更新,微软官方确认该版本为正式版:Wi

    2024年02月07日
    浏览(63)
  • Jan 2023-Prioritizing Samples in Reinforcement Learning with Reducible Loss

      本文 建议根据样本的可学习性进行抽样,而不是从经验回放中随机抽样 。如果有可能减少代理对该样本的损失,则认为该样本是可学习的。我们将可以减少样本损失的数量称为其可减少损失(ReLo)。这与Schaul等人[2016]的vanilla优先级不同,后者只是 对具有高损失的样本给予

    2024年02月05日
    浏览(56)
  • @echo off 的作用

    表示关闭批处理文件自身的回显,即执行此句之后的命令不会显示出来,只有输出结果会被显示 整体的理解就是 执行的命令不显示了,显示执行命令后的结果 其中, @  表示关闭命令回显功能,即命令执行时不在屏幕上输出命令本身,只输出命令的执行结果。 echo off  表示

    2024年02月06日
    浏览(36)
  • Off-CPU分析

    性能问题可以分为两种类型: On-CPU:线程花时间在CPU上运行的地方; Off-CPU:在I/O,锁,计数器,分页/交换上阻塞等待的时间 Off-CPU的分析是一种性能分析的方法,用于测量和研究Off-CPU的时间以及堆栈跟踪等上下文。它不同于CPU Profiling,后者仅当线程在On-CPU上执行时检查线

    2024年02月02日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包