CF1784E

news/2025/10/14 20:37:57/文章来源:https://www.cnblogs.com/spdarkle/p/19141961

对 DP 套 DP 的理解又加深了一分。

注意到,当局比分只有 \(0:0,0:1,1:0,1:1\) 四种情况,不妨将其压在一起考虑。

如何判断优劣?相当于从初始比分 \(0:0\),初始下标 \(i=1\) 开始发生 \(s\) 后续的一系列事件。

解决无限循环的状态,找到每个进程有多少种本质不同的状态,并在完整进行一个循环后在状态间进行建图,就可以知道进行若干个循环后走到的点了

而从 \(0:0\) 开始,无限循环,最终必然走到一个环,我们只关心这个环的胜局减去负局的局数。

考虑这一张图是什么东西,四个初始比分,经历确定的一轮后会各自达到一个比分,也就是每个点的出边有且只有一条,那就是一个基环树森林,而我们只关心从 \(0:0\) 出发走到的那个环。

如何求环的边权和?由于DP过程中涉及到填写问号,暴力的想法就是记录下每个初始状态走到当前这一步走到了哪个点以及胜局减负局数,最后暴力建图判断,这很爆炸。

能否减少?注意到点数很少,因此可以枚举环上的点有哪些,只记录环上点的出边的边权和,这样就压缩到了一维状态

因此,\(2^4\) 枚举环上的点有哪些,并记录其边权和,然后暴力DP。

最后判断这个实际的环与我枚举的环有什么差异即可。

#include<bits/stdc++.h>
using namespace std;
#define N 2050
#define int long long 
const int p=998244353;
int n,m,f[N][N],g[N][N],ans[3];
#define pr pair<int,int>
#define mk make_pair
int out[N],tim[N];
pr to[N][2];
char s[N];
vector<int>cir[N];
signed main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);for(int i=0;i<(1<<8);++i){for(int j=0;j<4;++j)out[j]=(i>>j+j)&3,tim[j]=0;int x=0,now=0;while(!tim[x]){tim[x]=++now;x=out[x];}int t=tim[x];int stu=0;for(int j=0;j<4;++j)if(tim[j]>=t)stu|=1<<j;cir[stu].push_back(i);}string str;cin>>str;n=str.size();str=" "+str;int nows=(n+1>>1)*4,start=(1<<2)|(2<<4)|(3<<6);for(int circ=0;circ<(1<<4);++circ){for(int i=0;i<(1<<8);++i){for(int j:{0,1}){int ni=0,nv=0;for(int x=0;x<4;++x){int t=(i>>x+x)&3;if(!j){if(t&1)nv+=(circ>>x)&1,t=0;else t|=1;}else {if(t&2)nv-=(circ>>x)&1,t=0;else t^=2;}ni|=t<<x+x;}to[i][j]=mk(ni,nv);}}int cnt=__builtin_popcount(circ);int up=nows+(n+1>>1)*cnt,down=nows-(n+1>>1)*cnt;for(int i=0;i<(1<<8);++i)for(int s=down;s<=up;++s)f[i][s]=g[i][s]=0;f[start][nows]=1;// cout<<nows<<" "<<start<<" "<<down<<' '<<up<<"\n";for(int step=1;step<=n;++step){for(int i=0;i<(1<<8);++i){for(int j:{0,1}){if(j==0&&str[step]=='b')continue;if(j==1&&str[step]=='a')continue;for(int s=down;s<=up;++s)if(f[i][s]){// cout<<"trans "<<to[i][j].first<<" "<<s+to[i][j].second<<"\n";g[to[i][j].first][s+to[i][j].second]+=f[i][s];}}}for(int i=0;i<(1<<8);++i)for(int s=down;s<=up;++s)f[i][s]=g[i][s]%p,g[i][s]=0;}for(auto i:cir[circ]){for(int s=down;s<=up;++s)if(f[i][s]){// cout<<circ<<" "<<i<<"\n";ans[s<nows?2:(s==nows?1:0)]+=f[i][s];}}}cout<<(ans[0]%p+p)%p<<"\n"<<(ans[1]%p+p)%p<<"\n"<<(ans[2]%p+p)%p<<"\n";
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/937071.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nSwitch 存档自动备份系统模块 - autoSAVE

autoSAVE 是switch大气层系统上使用的系统模块, 个人开发, 纯c语言编写, 执行效率高, 系统资源占用比较低. 主要解决日常有存档备份需求但不具备联网条件的痛点.下载地址 更新日志主要功能开袋即食, 无需配置 动态保留…

2025/10/14

2025/10/141.学习算法 2.学习离散数学 3.学习数据结构

CSP-S模拟31 笔记

CSP-S模拟31 笔记T1 远征 \(O(nV)\) DP。先鸽。 T2 传送 题目描述 给定 \(n\) 点 \(m\) 边无向无自环图 \(G\) , \(q\)次询问,每次询问给定点 \(x\) , \(y\) ,求点 \(x\) , \(y\) 在图 $G^′ $ 上的距离。 图 \(G^′…

java基础7-字符串

1.API(Application Programming Interface)应用程序编程接口 Java API:指的就是JDK中提供的各种功能的java类 2.String:字符串的内容是不会发生改变的,它的对象在创建之后不能被更改 创建String对象的两种方式:直…

乐云具身活动体验

Day -1 很早就看到这个活动的宣传了,“具身智能”、“上手实操”、“无需经验,只需热情”的宣传其实挺心动的,但考虑到之后国庆回来可能会很忙,而且最近事情已经够多了,于是忍痛放弃。但在报名截止前一天,林学长…

【技术解决方案】联邦学习中遇到的Non-IID问题——隐语SecretFlow

打开链接点亮社区Star,照亮技术的前进之路。每一个点赞,都是社区技术大佬前进的动力Github 地址: https://github.com/secretflow一、引言 本文针对联邦学习中遇到的Non-IID问题进行探讨,介绍Non-IID产生的原因,分…

10.14 闲话:KTT

10.14 闲话:KTT Part.1 基本算法 引入这样一个问题(其实这并不是板子,但是笔者认为这是此算法的另一种理解方式): luogu P5693 EI 的第六分块区间加,区间最大子段和。这东西有个十分重要的性质,所有加的数都是正…

题解:P10104 [GDKOI2023 提高组] 异或图

题意:给定一张 \(n\) 个点 \(m\) 条边的无向图和一个长度为 \(n\) 的数组 \(a_1, a_2, \cdots , a_n\) 以及一个整数 \(C\),你需要求出有多少个长度为 \(n\) 的数组 \(b\) 满足:\(0 ≤ b_i ≤ a_i,\forall 1 ≤ i ≤…

2025 年筛网厂家推荐榜:聚焦场景适配与高效需求,锰钢筛网/聚氨酯筛网/合金焊接筛网/自清洁筛网/防堵筛网厂家滨州沃森网业成优选

随着矿业、建筑建材、化工、粮食加工等行业的生产效率升级,以及对物料筛选精度、设备耐用性要求的提升,筛网作为核心辅助设备,已从单一功能向 “场景化定制”“高性能适配” 方向发展。2025 年,筛网市场规模预计持…

P7076 [CSP-S2020] 动物园

题目描述 动物园里饲养了很多动物,饲养员小 A 会根据饲养动物的情况,按照《饲养指南》购买不同种类的饲料,并将购买清单发给采购员小 B。 具体而言,动物世界里存在 2k 种不同的动物,它们被编号为 0∼2k−1。动物园…

汽车价格战全面熄火了?不卷价格该卷什么? - 教程

汽车价格战全面熄火了?不卷价格该卷什么? - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

redis-4.0.11-1.ky10.sw_64.rpm安装教程(申威麒麟V10 64位系统详细步骤)

redis-4.0.11-1.ky10.sw_64.rpm安装教程(申威麒麟V10 64位系统详细步骤)​ 对 ​银河麒麟操作系统V10 64位(版本标识ky10.sw_64)​​ 的 ​Redis 4.0.11​ 软件包(文件名:redis-4.0.11-1.ky10.sw_64.rpm)的 ​超…

P10067 [CCO 2023] Real Mountains

思维训练懒得写代码了,感觉这种题还是思维为重。 我们显然需要考察两个东西:最终序列会变成啥样。 每次是如何一步一步变成最终序列的。我们先想第一个问题,显然,最终的 \(p\) 一定会是最大的那个 \(a_x\) 的 \(x\…

先辈题解

首先我们先观察到 $ 114514 $ 中只有三种数,$ 1 \(,\) 4 \(,\) 5 $,这给了我们一个思路,直接枚举这三个数代表的字母是什么,字母共有 $ 26 $ 种,所以我们的复杂度是 $ O(26^3n) $的。 code: void dfs(int s1,in…

详细介绍:并发编程原理与实战(三十三)AQS框架下手写简易可重入锁的实战解析

详细介绍:并发编程原理与实战(三十三)AQS框架下手写简易可重入锁的实战解析2025-10-14 20:13 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow…

U-Boot启动探秘:从汇编到命令行的奇幻之旅 - 指南

U-Boot启动探秘:从汇编到命令行的奇幻之旅 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

实用指南:【Lsky-Pro开源图床】Lsky-Pro+cpolar:云端素材库的远程协作方案

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

双指针的初步了解

双引用的初步了解 10.14今天在力扣上刷题,第一次了解到了双引用的概念,如图对于这个题,我一开始的思路是从0到size-1一步步遍历,如果找到值为val的,就删去,然后让计数器加1,最后输出计数器。但是不知道为什么总…

倍增并查集学习笔记

学完板子即可开始水紫题倍增并查集,可以在 \(O(m log^2 n)\) 的时间复杂度内求解 \(m\) 个诸如此类的合并问题: \[\forall \,\,\,\,\, 0 \leq i \leq k \, , \, merge(x+i,y+i) \]就真的是倍增和并查集的结合体,而不…

两数相加-leetcode

题目描述 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外…