首页 > 其他分享 >AGC061E 做题记录

AGC061E 做题记录

时间:2024-11-06 20:42:09浏览次数:1  
标签:ch 记录 ll st AGC061E dis sim define

link

一个高级 trick。考虑 \(+1\) 操作,他会把最低连续一段 \(1\) 改成 \(0\),把原来第一个 \(0\) 改成 \(1\)。注意到此时最低若干位全被覆盖为了 \(0\),所以可以考虑从高位到低位划分子问题。

具体的,对于第 \(k\) 位,\(+1\) 操作对其有影响,当且仅当这一位原来是 \(1\) 且 \(0\sim k - 1\) 位向该位进了 \(1\)。

当进了 \(1\) 后,此时 \(0\sim k - 1\) 位上全部都是 \(0\),划分为子问题。

设 \(f_{i, p, q, S}\) 表示考虑了 \(0\sim i - 1\) 位,将 \(st\) 变为 \(ed\) 并且使用的 XOR 操作集合为 \(S\) 的答案,其中若 \(p = 0\) 则 \(st\) 为起始数字,否则 \(st = 0\) 且操作中没有向下一位进 \(1\);若 \(q = 0\) 则 \(ed\) 为目标数字,否则 \(ed = 0\) 且操作中恰好一次向下一位进了 \(1\)。

转移可以考虑第 \(i - 1\) 位的变化,若 \(q\) 次进位后 \(st\) 和 \(ed\) 在 \(0\sim i - 1\) 位恰好匹配了,那么 \(f_{i, p, q, S} \gets f_{i - 1, p, q, S}\)。

否则 \(0\sim i - 2\) 位可能经过了多次向第 \(i - 1\) 位进 \(1\) 的操作,每进一次 \(0\sim i - 2\) 位都会清零,所以整个转移应为 \(f_{i, p, q, S_1 \oplus S_2 \oplus \dots \oplus S_k} \gets f_{i - 1, p, 1, S_1} + f_{i - 1, 1, 1, S_2} + \dots + f_{i - 1, 1, q, S_k}\),可以最短路解决,注意判断一下转移路径的合法性。

时间复杂度 \(\mathcal O(2^{2n} \log V)\)。

点击查看代码
#include <bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define mkp make_pair
#define pir pair <ll, ll>
#define pb emplace_back
#define i128 __int128
using namespace std;
const ll inf = 1e18, M = 40;
template <class T>
void rd(T &x) {
	char ch; ll f = 0;
	while(!isdigit(ch = getchar()))
		if(ch == '-') f = 1;
	x = ch - '0';
	while(isdigit(ch = getchar()))
		x = (x << 1) + (x << 3) + ch - '0';
	if(f) x = -x;
}
ll n, st, ed, w, a[15], b[15], f[41][2][2][1 << 8], dis[1 << 8];
ll _xor[1 << 8], sum[1 << 8], vis[1 << 8];
void chkmin(ll &x, const ll y) { x = x < y? x : y; }
int main() {
	rd(n), rd(st), rd(ed), rd(w);
	for(ll i = 1; i <= n; i++) rd(a[i]), rd(b[i]);
	memset(f, 0x3f, sizeof f);
	for(ll S = 0; S < (1 << n); S++) {
		for(ll i = 1; i <= n; i++)
			if(S & (1 << i - 1))
				_xor[S] ^= a[i], sum[S] += b[i];
		f[0][0][0][S] = f[0][1][0][S] = sum[S];
		f[0][0][1][S] = f[0][1][1][S] = sum[S] + w;
	}
	for(ll i = 1; i <= M; i++) {
		for(ll p = 0; p < 2; p++) {
			for(ll S = 0; S < (1 << n); S++) {
				if((((p? 0 : st) ^ ed ^ _xor[S]) >> i - 1) & 1 ^ 1)
					chkmin(f[i][p][0][S], f[i - 1][p][0][S]);
				if((((p? 0 : st) ^ _xor[S]) >> i - 1) & 1)
					chkmin(f[i][p][1][S], f[i - 1][p][1][S]);
			}
			memset(vis, 0, sizeof vis);
			for(ll S = 0; S < (1 << n); S++)
				if((((p? 0 : st) ^ _xor[S]) >> i - 1) & 1 ^ 1)
					dis[S] = f[i - 1][p][1][S];
				else dis[S] = inf;
			for(ll o = 0; o < (1 << n); o++) {
				ll S = -1;
				for(ll T = 0; T < (1 << n); T++)
					if(!vis[T] && (S == -1
					 || dis[S] > dis[T])) S = T;
				vis[S] = 1;
				for(ll T = 0; T < (1 << n); T++)
					if((_xor[T] >> i - 1) & 1)
						chkmin(dis[S ^ T], dis[S] + f[i - 1][1][1][T]);
			}
			for(ll S = 0; S < (1 << n); S++)
				for(ll T = 0; T < (1 << n); T++) {
					if(((_xor[T] ^ ed) >> i - 1) & 1)
						chkmin(f[i][p][0][S ^ T], dis[S] + f[i - 1][1][0][T]);
					if((_xor[T] >> i - 1) & 1 ^ 1)
						chkmin(f[i][p][1][S ^ T], dis[S] + f[i - 1][1][1][T]);
				}
		}
	} ll ans = inf;
	for(ll S = 0; S < (1 << n); S++)
		ans = min(ans, f[M][0][0][S]);
	if(ans >= inf) ans = -1;
	printf("%lld", ans); 
	return 0;
}

标签:ch,记录,ll,st,AGC061E,dis,sim,define
From: https://www.cnblogs.com/Sktn0089/p/18530998

相关文章

  • Tesserast-OCR踩坑记录——训练一个能识别验证码的OCR模型
    前言公司项目的系统登录有一套验证码系统,之前想写一些自动化测试时总是会被这个验证码卡住,不能完全自动运行。去找开发同事关一下验证码,也是一开一关挺麻烦的,不能总麻烦人家。秉承着工作是自己的,麻烦到头来总要自己解决的原则,开始找方案。第一个是发现可以把验证码图片给AI去解......
  • AtCoder Beginner Contest 360 - VP记录
    A-AHealthyBreakfast高桥日常出境。头一次知道getchar()的返回值是int。点击查看代码#include<cstdio>usingnamespacestd;intmain(){ chars[3]={getchar(),getchar(),getchar()}; if(s[0]=='R'&&s[1]=='M')puts("Yes"); els......
  • Educational Codeforces Round 161 (Rated for Div. 2) - VP记录
    Preface先被A题硬控\(20\)分钟,有点不爽。又看到E题AC的人比D题多而去嗑E题去了,结果D题反而是我更能做的。将问题排序:根据你所需付出的努力,将能够最快解决的问题排在前面。(答题的次序为:以前做过的,容易的,不熟悉的,难的)——李博杰《骗分导论》\(\rmP_{114}\)所以......
  • 零基础‘自外网到内网’渗透过程详细记录(cc123靶场)——上
    一、网络环境示意图二、环境搭建首先将三个虚拟机使用VMware打开。接下来对虚拟机进行配置。首先配置虚拟机“护卫神主机大师(项目四)”。点击编辑虚拟机设置。发现存在两个网卡。打开虚拟网络编辑器。点击更改设置。点击添加网络。选择VM19后点击确定。根......
  • 0基础学Python——类的单例模式、反射函数、记录类的创建个数、迭代器、生成器及生成
    0基础学Python——类的单例模式、反射函数、记录类的创建个数、迭代器、生成器及生成器练习类的单例模式定义代码演示反射函数代码演示记录类的创建个数迭代器定义特点生成器定义特点写法生成器练习生成器生成1-无穷的数字生成器生成无穷个素数类的单例模式定义......
  • Python 日志分级记录到不同文件的实现
    Python日志分级记录到不同文件的实现介绍如何使用Python的logging模块,按INFO、WARNING和ERROR级别将日志记录到不同的文件中。通过封装CustomLogger类,方便在项目中直接调用,简化日志管理。1.实现目标分级日志记录:将INFO、WARNING、ERROR级别的日志分别记录到不......
  • ACM记录
    1.2024ICPCKunmingInvitationalContest\(\text{J.TheQuestforElDorado}\)还是普通dij,但是重写dis的形式为\((r,w)\),其中\(r\)表示最早第几张票到这个点,\(w\)表示此时这张票已经用掉的里程的最小值。dis之间的比较就是先比\(r\)再比\(w\)。在转移一条边\(......
  • ePWM相关记录
    此处记录TMS320F28xePWM模块相关理解。此处先介绍几个名词概念TBCTR(时基计数器):时基计数器保存当前的计数值,用于生成PWM信号周期。TBPRD(时基周期寄存器):这个寄存器存储PWM信号的周期值,计数器从0开始计数,直到TBPRD的值。TBPHS(时基相位寄存器):这个寄存器控制PWM信号的相位偏移,主......
  • bug解决记录:前端解密后的中文是问号的解决办法
     最近的项目中,遇到了这个问题,我们的容灾环境要进行演练,但是进行切换到容灾环境的时候,发现返回的中文都是?问号解决思路:1.先看下接口的请求头和响应头是不是指定了这个编码格式。排查出来发现都是有的2.看下解密和加密是否有指定编码格式设置字符byte[]bytes=srcData.getByt......
  • Cmake 实操 -- 使用文件操作命令添加源码文件并移除失效问题记录
    搜索文件使用file(GLOB_RECURSEfileListsearchDir/*.cpp)搜索searchDir目录下所有cpp文件,将路径保存到fileList中。GLOB_RECURSE:启用递归搜索。ps:searchDir不会被展开,如果searchDir中存在C/test/../test1,保存到fileList中的文件路径将仍然带有C/test/../test1,而不是C/test1......