题目链接

BZOJ3495

题解

每个城市都有选和不选两种情况,很容易考虑到2-sat
边的限制就很好设置了,主要是每个郡只有一个首都的限制
我们不可能两两之间连边,这样复杂度就爆炸了

于是乎就有了一个非常厉害的方法:
前缀后缀和
我们令\(1\)表示选,\(0\)表示不选,维护一个郡的前缀和、后缀和
一个点如果作为首都,那么它和它对应前缀后缀和的位置一定为\(1\),且之前的位置一定为\(0\)
然后再加上一些前缀后缀和固有的限制

就可以\(A\)啦
这样的建图太神了

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define mp(a,b) make_pair<int,int>(a,b)
#define cls(s) memset(s,0,sizeof(s))
#define cp pair<int,int>
#define LL long long int
using namespace std;
const int maxn = 6000005,maxv = 1000005,maxm = 15000005,INF = 1000000000;
inline int read(){int out = 0,flag = 1; char c = getchar();while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}return out * flag;
}
int n,m,K,N,pre[maxv][2],sa[maxv][2],p[maxv][2];
int dfn[maxn],low[maxn],Scc[maxn],st[maxn],top,scci,cnt;
int h[maxn],ne;
struct EDGE{int to,nxt;}ed[maxm];
inline void build(int u,int v){ed[++ne] = (EDGE){v,h[u]}; h[u] = ne;
}
void dfs(int u){dfn[u] = low[u] = ++cnt;st[++top] = u;Redge(u){if (!dfn[to = ed[k].to]){dfs(to);low[u] = min(low[u],low[to]);}else if (!Scc[to]) low[u] = min(low[u],dfn[to]);}if (dfn[u] == low[u]){scci++;do{Scc[st[top]] = scci;}while (st[top--] != u);}
}
int main(){n = read(); m = read(); K = read();REP(i,n) p[i][0] = ++N,p[i][1] = ++N;int a,b;while (m--){a = read(); b = read();build(p[a][0],p[b][1]);build(p[b][0],p[a][1]);}int x,u;while (K--){x = read();REP(i,x){pre[i][0] = ++N,pre[i][1] = ++N;sa[i][0] = ++N,sa[i][1] = ++N;}REP(i,x){u = read();build(p[u][1],pre[i][1]); build(pre[i][0],p[u][0]);build(p[u][1],sa[i][1]); build(sa[i][0],p[u][0]);if (i < x){build(p[u][1],sa[i + 1][0]); build(sa[i + 1][1],p[u][0]);build(pre[i][1],pre[i + 1][1]); build(pre[i + 1][0],pre[i][0]);}else build(pre[i][0],pre[i][1]);if (i > 1){build(p[u][1],pre[i - 1][0]); build(pre[i - 1][1],p[u][0]);build(sa[i][1],sa[i - 1][1]); build(sa[i - 1][0],sa[i][0]);}else build(sa[i][0],sa[i][1]);}}for (int i = 1; i <= N; i++) if (!dfn[i]) dfs(i);for (int i = 1; i <= N; i += 2)if (Scc[i] == Scc[i + 1]){puts("NIE");return 0;}puts("TAK");return 0;
}

转载于:https://www.cnblogs.com/Mychael/p/9091629.html

BZOJ3495 PA2010 Riddle 【2-sat】相关推荐

  1. 【American English】美式发音,英语发音,美国音音标列表及发音

    1 [American English]美式发音,英语发音,美国音音标列表及发音 2 [American English]美语的连读规则 3 [American English]美语口语中常见的 Go ...

  2. 【计算理论】计算理论总结 ( P 、NP 、NPC 总结 ) ★★

    文章目录 一.P 类 二.NP 类 三.NPC 类 ( NP 完全 ) 四.P .NP .NPC 三者关系 一.P 类 P\rm PP 类 : ★ 所有 能够被 确定性 单个带子图灵机 , 在 多项式 ...

  3. 【计算理论】计算复杂性 ( 多项式时间规约 | NP 完全 ★ | 布尔可满足性问题 ) ★

    文章目录 一.多项式时间规约 分析 二.NP 完全 ★ ( 计算理论最重要的概念 ) 一.多项式时间规约 分析 多项式时间规约概念 : [计算理论]计算复杂性 ( 多项式等价引入 | 多项式时间规约 ...

  4. 实战SSM_O2O商铺_41【前端展示】店铺列表页面Dao+Service+Controller层的实现

    文章目录 概述 Dao层 接口 映射文件 单元测试 Service层 接口方法 单元测试 Controller层 增加 ShopListController 单元测试 Github地址 概述 在完成了 ...

  5. 【Linux部署】NTP时间服务器搭建及Linux+Windows客户端使用(一篇学会使用NTP服务)

    1.什么是NTP 百度百科:网络时间协议,英文名称:Network Time Protocol(NTP)是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同 ...

  6. 【js实例】Array类型的9个数组方法,Date类型的41个日期方法,Function类型

    前文提要:[js实例]js中的5种基本数据类型和9种操作符 Array类型的9个数组方法 Array中有9个数组方法: 1.检测数组 2.转换方法 3.栈方法 4.队列方法 5.冲排序方法 6.操作方 ...

  7. 【Applied Algebra】可满足性模理论(Satisfiability Modulo Theories)入门

    [Applied Algebra]可满足性模理论(Satisfiability Modulo Theories)入门 摘要:SMT问题是在特定理论下判定一阶逻辑公式可满足性问题.它在很多领域,尤其是形 ...

  8. 【Typescript专题】之类型进阶

    [Typescript专题]之类型进阶 本篇文章是<Typescript 专题>第一篇,本篇文章主要聊一聊基本类型相关的扩展,毕竟随着文章的加深,我在阅读官方文档的时候经常会见到陌生的声明 ...

  9. 非此即彼的逻辑错误_Argument常见逻辑错误及描述 【出国英语】

    Argument常见逻辑错误及描述 [出国英语] 1.Loose generalizations 过于宽泛的概括 医学教育网 Drawing conclusions about groups of p ...

最新文章

  1. NOIP2018 集训(一)
  2. java 线程中断(转)
  3. css03层次选择器
  4. 科技日报头版显要位置报道国内多家企业投融资给力永中软件
  5. 编译Bitcoin BCH configure: error: libdb_cxx headers missing ,终于解决了
  6. Bob的烦恼II 逃离迷宫
  7. 打造“神犇”是教育的未来吗?
  8. hdfs haadmin使用,DataNode动态上下线,NameNode状态切换管理,数据块的balance,HA下hdfs-api变化(来自学习资料)...
  9. openwrt qca9886 ath10k只能连32台设备问题解决
  10. SI4463配置软件wds3
  11. 学plc还是学java_要学PLC想走PLC工程师之路的看看
  12. 图片服务器-存储图片技巧
  13. C语言乘方,平方根的使用
  14. 浏览器的储存方式有哪些
  15. 56 案例淘宝焦点图布局 网页布局总结
  16. freenom又行了-免费顶级域名白嫖一年,赶紧看看如何申请
  17. mysql学生表_课程表_选课表,连表查询
  18. 数据分析——用户流失分析
  19. SQL查询实现,记录排序编号
  20. win7 、IIS7.0 搭建ASP网站

热门文章

  1. Python Web笔记之高性能网络编程
  2. 【算法总结】积性函数相关
  3. supsplk 服务器被植入木马 挖矿 cpu使用 700%
  4. 终于明白上一篇的一顿误操作是什么了,是$,不是S !!!!!
  5. bcp生成excel文件优化方案
  6. 如何取得事件中鼠标坐标
  7. Spark源码分析之TaskSetManager分析
  8. html里球是哪个单词,html tag是什么意思
  9. (89)FPGA三分频设计,面试必问(十三)(第18天)
  10. (50)System Verilog类静态变量实例