3495: PA2010 Riddle

链接

分析:

  每个点要么建首都,要么不建,并且一个点建了,会导致一些点不能建。所以可以考虑2-sat。

  但是如果在每个郡里两两连边,边数是n^2的。

  考虑用前缀优化。

  S[i]表示对于当前郡,前i个点中是否存在一个首都,A[i]表示i这个点是否建首都。

  1、那么有A[i]=1,则S[i]=1,同样有它的逆否命题:S[i]=0,则A[i]=0。

  2、根据前缀的性质有S[i-1]=1,则S[i]=1,逆否命题:S[i]=0,则S[i-1]=0。

  3、由于每个郡只能有一个首都,所以A[i]=1,则S[i-1]=0,逆否命题:S[i-1]=1,则A[i]=0。

  4、还有满足每条边两边至少一个首都,u=0,则v=1,逆否命题:v=0,则u=1

代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cctype>
#include<set>
#include<queue>
#include<vector>
#include<map>
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = ;
struct Edge{ int to, nxt; } e[N << ];
int head[N], dfn[N], low[N], bel[N], sk[N], top, Index, tot, En;
bool vis[N]; inline void add_edge(int u,int v) {
++En; e[En].to = v, e[En].nxt = head[u]; head[u] = En;
}
void tarjan(int u) {
low[u] = dfn[u] = ++Index;
sk[++top] = u; vis[u] = ;
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if (!dfn[v]) {
tarjan(v);
low[u] = min(low[u], low[v]);
}
if (vis[v]) low[u] = min(low[u], dfn[v]);
}
if (low[u] == dfn[u]) {
++tot;
do {
vis[sk[top]] = ;
bel[sk[top]] = tot;
top --;
} while (sk[top + ] != u);
}
}
int main() {
int n = read(), m = read(), k = read();
for (int u, v, i = ; i <= m; ++i) {
u = read(), v = read();
add_edge(u + n, v);add_edge(v + n, u);
}
for (int i = ; i <= n; ++i) // A[i]=1,S[i]=1
add_edge(i, i + * n), add_edge(i + * n, i + n);
for (int cnt, now, last, i = ; i <= k; ++i) {
cnt = read(), last = read();
for (int j = ; j <= cnt; ++j) {
now = read();
add_edge(last + * n, now + * n);add_edge(now + * n, last + * n); // S[i-1]=1,S[i]=1
add_edge(now, last + * n); add_edge(last + * n, now + n); // A[i]=1,S[i-1]=0
last = now;
}
}
for (int i = ; i <= (n << ); ++i) if (!dfn[i]) tarjan(i);
for (int i = ; i <= n; ++i) {
if (bel[i] == bel[i + n] || bel[i + * n] == bel[i + * n]) {
puts("NIE"); return ;
}
}
puts("TAK");
return ;
}

3495: PA2010 Riddle的更多相关文章

  1. 3495: PA2010 Riddle 2-sat 前缀优化

    3495: PA2010 Riddle 2-sat 前缀优化 链接 bzoj 思路 不想说啥了,看hwim的吧,我去睡觉了zZ. 代码 /******************************* ...

  2. 【BZOJ】3495: PA2010 Riddle

    题意 \(n(1 \le n \le 1000000)\)个城市,\(k(1 \le k \le n)\)个国家,\(m(1 \le m \le 1000000)\)条边.要求每个国家有且仅有一个首都 ...

  3. BZOJ.3495.[PA2010]Riddle(2-SAT 前缀优化建图)

    题目链接 每个城市要么建首都要么不建,考虑2-SAT 这样一个国家内城市两两连边是很显然的,但是边数为O(n^2) 每个国家中仅有一个建首都,考虑新建前缀S[i]=1/0这2n个点表示当前国家的[1, ...

  4. 【刷题】BZOJ 3495 PA2010 Riddle

    Description 有n个城镇被分成了k个郡,有m条连接城镇的无向边. 要求给每个郡选择一个城镇作为首都,满足每条边至少有一个端点是首都. Input 第一行有三个整数,城镇数n(1<=n& ...

  5. 【BZOJ】3495: PA2010 Riddle 2-SAT算法

    [题意]有n个城镇被分成了k个郡,有m条连接城镇的无向边.要求给每个郡选择一个城镇作为首都,满足每条边至少有一个端点是首都.n,m,k<=10^6. [算法]2-SAT,前后缀优化建图 [题解] ...

  6. 【bzoj 3495】PA2010 Riddle

    Description 有n个城镇被分成了k个郡,有m条连接城镇的无向边.要求给每个郡选择一个城镇作为首都,满足每条边至少有一个端点是首都. Input 第一行有三个整数,城镇数n(1<=n&l ...

  7. BZOJ3495 : PA2010 Riddle

    2-SAT. 建立n个变量,其中第i个变量表示第i个城市是否是首都. 对于边(x,y),连边x->y',y->x'. 对于一个有y个城市的国家,新建2y个变量,分别表示前i个城市和后i个城 ...

  8. BZOJ3495 PA2010 Riddle 【2-sat】

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

  9. 【BZOJ3495】PA2010 Riddle

    题目大意 有\(n\)个城镇被分成了\(k\)个郡,有\(m\)条连接城镇的无向边.要求给每个郡选择一个城镇作为首都,满足每条边至少有一个端点是首都. 题目分析 每条边至少有一个端点是首都,每个郡至多 ...

随机推荐

  1. Sql_从查询的结果集中分组后取最后有效的数据成新的结果集小记(待优化)

    Dim sql As String = " SELECT xp.*, " sql = sql + " xf_owner.ownername, " sql = s ...

  2. 基于JVM(内存)和Tomcat性能调优

    一.总结前一天的学习 从“第三天”的性能测试一节中,我们得知了决定性能测试的几个重要指标,它们是: ü   吞吐量 ü   Responsetime ü   Cpuload ü   MemoryUsa ...

  3. 【Redis】命令学习笔记——列表(list)+集合(set)+有序集合(sorted set)(17+15+20个超全字典版)

    本篇基于redis 4.0.11版本,学习列表(list)和集合(set)和有序集合(sorted set)相关命令. 列表按照插入顺序排序,可重复,可以添加一个元素到列表的头部(左边)或者尾部(右边 ...

  4. MySQL · 数据恢复 · undrop-for-innodb

    Ref:https://www.aliyun.com/jiaocheng/1109809.html  摘要: 简介 undrop-for-innodb 是针对 innodb 的一套数据恢复工具,可以从 ...

  5. 15. DML, DDL, LOGON 触发器

    触发器可以理解为由特定事件触发的存储过程, 和存储过程.函数一样,触发器也支持CLR,目前SQL Server共支持以下几种触发器: 1. DML触发器, 表/视图级有效,可由DML语句 (INSER ...

  6. 使用keychain永久存储数据

    使用keychain永久存储数据 https://github.com/soffes/sskeychain keychain当然还是使用开源的好:),keychain是干啥用的?这个,baidu一下你 ...

  7. 剑指offer 11二进制中1的个数

    输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. java版本: public class Solution { public int NumberOf1(int n) { Strin ...

  8. IIS6与IIS7中的w3wp工作进程

    在IIS6中,每一个网站都有对应的应用程序池,在应用程序池有运行着网站的Application,在默认情况下,所有的网站的应用程序都会分配到默认的应用程序池当中,   当然,我们可以新建一个应用程序池 ...

  9. November 17th 2016 Week 47th Thursday

    Don't cry because it is over. Smile because it happened. 不要因为结束而哭泣:微笑吧,因为我们曾经拥有. My ex-girlfriend ha ...

  10. 021.15 IO流 其他流

    IO包中的其他类操作基本数据类型:DataInputStream与DataOutputStream操作字节数组:ByteArrayInputStream与ByteArrayOutputStream操作 ...