当前位置: 首页 > news >正文

P3876 [TJOI2010] 数字序列 - Link

题意

要求构造一个序列,包含 \(0,1,2,3\),相邻的两个数不能是 00,11,22,33,02,20,23,32,13,31,并且有 \(m\) 个限制,每个限制给出一些位置,要求这些位置上的数两两不同,问有没有解。
\(n\le10^5,m\le5000\)

思路

显然,当一个约束集合的大小 \(>4\) 时无解。
发现 \(3\) 旁边能放 \(0\)\(0\) 旁边能放 \(1,3\)\(1\) 旁边能放 \(0,2\)\(2\) 旁边能放 \(1\)。给数字重标号,那么问题变成了,判断是否有一个由 \(\set{1,2,3,4}\) 组成的序列,相邻两个元素相差 \(1\),有一些位置数不能相同。
把位置按照奇偶性分成两部分,令第一个数是 \(1\)\(3\),那么奇数位置的数都是 \(1\)\(3\),偶数位置的数都是 \(2\)\(4\)。把每个约束拆成很多个二元的约束,用 \(2-sat\) 解决。一个约束对 \((u,v)(u<v)\),如果 \(v-u\) 是奇数,那么祂们肯定不一样,否则转换为一些推导关系。相邻的两个数之间也有推导关系。

代码

// Problem: P3876 [TJOI2010] 数字序列
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3876
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include<bits/stdc++.h>
using namespace std;
namespace IO{template<typename T>inline void read(T&x){x=0;char c=getchar();bool f=0;while(!isdigit(c)) c=='-'?f=1:0,c=getchar();while(isdigit(c)) x=x*10+c-'0',c=getchar();f?x=-x:0;}template<typename T>inline void write(T x){if(x==0){putchar('0');return ;}x<0?x=-x,putchar('-'):0;short st[50],top=0;while(x) st[++top]=x%10,x/=10;while(top) putchar(st[top--]+'0');}inline void read(char&c){c=getchar();while(isspace(c)) c=getchar();}inline void write(char c){putchar(c);}inline void read(string&s){s.clear();char c;read(c);while(!isspace(c)&&~c) s+=c,c=getchar();}inline void write(string s){for(int i=0,len=s.size();i<len;i++) putchar(s[i]);}template<typename T>inline void write(T*x){while(*x) putchar(*(x++));}template<typename T,typename...T2> inline void read(T&x,T2&...y){read(x),read(y...);}template<typename T,typename...T2> inline void write(const T x,const T2...y){write(x),putchar(' '),write(y...),sizeof...(y)==1?putchar('\n'):0;}
}using namespace IO;
const int maxn=100010;
int n,m,p[maxn],cnt_scc,sy[maxn*2];
vector<int>e[maxn*2],f[maxn*2],vt;
bool flag[maxn*2];
int id_1(int u){return u*2-1;}
int id_2(int u){return u*2;}
void edge_add(int u,int v){e[u].push_back(v),f[v].push_back(u);}
void dfs1(int u){if(flag[u]) return ;flag[u]=1;for(int v:f[u]) dfs1(v);vt.push_back(u);
}
void dfs2(int u,int bh){if(sy[u]) return ;sy[u]=bh;for(int v:e[u]) dfs2(v,bh);
}
void qlt(){memset(flag,0,sizeof(flag));memset(sy,0,sizeof(sy));cnt_scc=0;for(int i=1;i<=n*2;i++) dfs1(i);while(!vt.empty()) dfs2(vt.back(),++cnt_scc),vt.pop_back();
}
void solve(){for(int i=1;i<=n*2;i++) e[i].clear(),f[i].clear();read(n,m);bool f=0;for(int i=1;i<=m;i++){int L;read(L);for(int j=1;j<=L;j++) read(p[j]);if(L>4){f=1;continue;}for(int a=1;a<=L;a++) for(int b=a+1;b<=L;b++){int u=p[a],v=p[b];if((u&1)!=(v&1)) continue;edge_add(id_1(u),id_2(v));edge_add(id_2(u),id_1(v));edge_add(id_1(v),id_2(u));edge_add(id_2(v),id_1(u));}}for(int i=1;i<n;i++){edge_add(id_2(i),id_1(i+1));edge_add(id_2(i+1),id_1(i));}if(f){write("No");return ;}qlt();for(int i=1;i<=n;i++) if(sy[id_1(i)]==sy[id_2(i)]){write("No");return ;}write("Yes");
}
signed main(){int T;read(T);while(T--) solve(),write("\n");return 0;
}
http://www.rkmt.cn/news/1396268.html

相关文章:

  • Agent Harness:AI智能体背后的稳定引擎,比大模型更关键!
  • 淘宝任务自动化终极指南:5分钟解放双手的免费淘金币脚本
  • 专业存档转换工具:实现《塞尔达传说:旷野之息》Switch与WiiU跨平台存档互通
  • Jmeter性能测试避坑指南:关于‘线程组顺序执行’和‘固定定时器’的那些常见误解
  • 从0到1手写一个Skill:我的竞品情报分析工作流实战教程
  • 企业新闻营销品效协同实现路径专业平台助力品牌与效果双提升
  • 不止于Cookie:手把手教你用Fiddler Hook住任意Header与AJAX请求(附常用代码片段)
  • 2026年度深圳劳动仲裁好评榜深度解读 - 资讯速览
  • 2026年权威的 山东青岛铝门窗、系统门窗品牌排行:5家实力品牌深度对比 - 奔跑123
  • ChatGPT Plus 值得买吗?2026 年 Free、Go、Plus、Pro 套餐完整对比
  • Unity Roguelike核心架构:地图生成、状态机与战斗反馈全解析
  • 构建多模型容灾策略时 Taotoken 的路由与稳定性价值
  • 用Python和rioxarray搞定MODIS数据:从下载到可视化,手把手教你分析科罗拉多州山火前后变化
  • 【Lovable外卖平台搭建实战指南】:从0到1落地高并发订单系统的关键7步
  • Unity高性能网格生成:模块化GridDescriptor与数据流优化
  • 近两年深圳劳动仲裁机构实力测评:技术效果口碑多维度对比 - 资讯速览
  • AMBA总线协议APB/AHB面试通关指南:从时序图到10个高频问题解析
  • 避坑指南:X99主板+E5洋垃圾装机,这些奇葩问题(如0xAb错误、点不亮)我全遇到了
  • 半监督图学习在金融反洗钱中的应用:从图嵌入到模型解释
  • 深圳劳动仲裁服务机构选择参考:多场景下的实操经验 - 资讯速览
  • 机器学习力场微调策略评估:从MACE模型到Cr-Sb2Te3热电材料应用
  • 莫尔自旋电子学:扭转二维磁性材料与机器学习加速设计
  • 医学影像AI可解释性:基于示例的XAI技术原理与应用
  • 基于交叉注意力的可解释AI:照亮帕金森病语音诊断黑盒模型
  • 多语言仇恨言论检测:从词嵌入到Transformer的混合策略与实战
  • 创想三维×联想:平板3D创意周边设计大赛第二期来袭
  • 【车位计数】基于matlab GUI图像处理技术检测并计数停车场内的可用停车位【含Matlab源码 15564期】
  • Rainbond v6.8.0 发布:两款 AI 能力助力开发者部署排障!
  • 2026背景调查公司哪家可靠?资深从业者拆解核心判定标准 - 资讯纵览
  • 【病害识别】基于matlab丝脉监测SVM稻叶病害识别【含Matlab源码 15568期】含报告