洛谷P3513 [POI2011]KON-Conspiracy

题目描述

Byteotia的领土被占领了,国王Byteasar正在打算组织秘密抵抗运动。

国王需要选一些人来进行这场运动,而这些人被分为两部分:一部分成为同谋者活动在被占领区域,另一部分是后勤组织在未被占领的领土上运转。

但是这里出现了一个问题:

1、后勤组织里的任意两人都必须是熟人,以促进合作和提高工作效率。

2、同谋者的团体中任意两人都不能是熟人。

3、每一部分都至少要有一个人。国王想知道有多少种分配方案满足以上条件,当然也有可能不存在合理方案。

现在国王将这个问题交由你来解决!

分析

如果没有输出方案数,那么这一道题就是一个裸的\(2-SAT\)问题

我们将一个点拆成两个点

其中编号为\(1-n\)的代表后勤,编号为\(n+1-2n\)的代表同谋

如果\(i\)和\(j\)是熟人,那么我们从\(i+n\)到\(j\)建一条边

如果\(i\)和\(j\)不是熟人,那么我们从\(i\)到\(j+n\)建一条边

我们按照正常的流程跑一个\(Tarjan\)就可以了

方案数为\(0\)的情况比较好求,即出现\(shuyu[i]=shuyu[i+n]\)的情况

对于有解的情况,我们要分类讨论

首先我们将所有的点分成两个集合,一个集合为后勤,另一个集合为同谋

对于后勤中的某个点,如果他和同谋中的某个点是熟人,那么我们就不能将该点加入同谋的集合

同样地,对于同谋中的某个点,如果他和后勤中的某个点不是熟人,那么我们就不能将该点加入后勤的集合

我们将这样的点称为冲突点

我们对于每一个点,都找出它的所有冲突点

一个显然的结论是,我们不能从一个集合移动两个点到达另一个集合

这样必定会产生冲突

因为如果我们将后勤集合中的两个点扔到同谋集合,那么同谋集合会出现熟人,反之亦然

因此,我们每次最多只能改变一个点的位置

因此,对于冲突点的数量大于\(2\)的节点,我们不去考虑它

如果某一个节点的冲突点的数量为\(1\),那么我们可以把该节点的冲突点拿到当前节所在的集合

前提是该节点的冲突点的冲突点的数量为\(0\)

如果节点的冲突点的数量为\(0\),那么我们可以将其扔到另一个集合中

同时,如果处在不同集合的两个点的冲突数量都为\(0\),我们可以将这两个点交换,我们用乘法原理解决即可

代码

  1. #define fastcall __attribute__((optimize("-O3")))
  2. #pragma GCC optimize(2)
  3. #pragma GCC optimize(3)
  4. #pragma GCC optimize("Ofast")
  5. #pragma GCC optimize("inline")
  6. #pragma GCC optimize("-fgcse")
  7. #pragma GCC optimize("-fgcse-lm")
  8. #pragma GCC optimize("-fipa-sra")
  9. #pragma GCC optimize("-ftree-pre")
  10. #pragma GCC optimize("-ftree-vrp")
  11. #pragma GCC optimize("-fpeephole2")
  12. #pragma GCC optimize("-ffast-math")
  13. #pragma GCC optimize("-fsched-spec")
  14. #pragma GCC optimize("unroll-loops")
  15. #pragma GCC optimize("-falign-jumps")
  16. #pragma GCC optimize("-falign-loops")
  17. #pragma GCC optimize("-falign-labels")
  18. #pragma GCC optimize("-fdevirtualize")
  19. #pragma GCC optimize("-fcaller-saves")
  20. #pragma GCC optimize("-fcrossjumping")
  21. #pragma GCC optimize("-fthread-jumps")
  22. #pragma GCC optimize("-funroll-loops")
  23. #pragma GCC optimize("-freorder-blocks")
  24. #pragma GCC optimize("-fschedule-insns")
  25. #pragma GCC optimize("inline-functions")
  26. #pragma GCC optimize("-ftree-tail-merge")
  27. #pragma GCC optimize("-fschedule-insns2")
  28. #pragma GCC optimize("-fstrict-aliasing")
  29. #pragma GCC optimize("-falign-functions")
  30. #pragma GCC optimize("-fcse-follow-jumps")
  31. #pragma GCC optimize("-fsched-interblock")
  32. #pragma GCC optimize("-fpartial-inlining")
  33. #pragma GCC optimize("no-stack-protector")
  34. #pragma GCC optimize("-freorder-functions")
  35. #pragma GCC optimize("-findirect-inlining")
  36. #pragma GCC optimize("-fhoist-adjacent-loads")
  37. #pragma GCC optimize("-frerun-cse-after-loop")
  38. #pragma GCC optimize("inline-small-functions")
  39. #pragma GCC optimize("-finline-small-functions")
  40. #pragma GCC optimize("-ftree-switch-conversion")
  41. #pragma GCC optimize("-foptimize-sibling-calls")
  42. #pragma GCC optimize("-fexpensive-optimizations")
  43. #pragma GCC optimize("inline-functions-called-once")
  44. #pragma GCC optimize("-fdelete-null-pointer-checks")
  45. #include<cstdio>
  46. #include<cstring>
  47. #include<cmath>
  48. #include<algorithm>
  49. using namespace std;
  50. const int maxn=5e3+5;
  51. inline int read(){
  52. int x=0,f=1;
  53. char ch=getchar();
  54. while(ch<'0' || ch>'9'){
  55. if(ch=='-') f=-1;
  56. ch=getchar();
  57. }
  58. while(ch>='0' && ch<='9'){
  59. x=(x<<1)+(x<<3)+(ch^48);
  60. ch=getchar();
  61. }
  62. return x*f;
  63. }
  64. struct asd{
  65. int to,next;
  66. }b[maxn*maxn];
  67. int head[maxn],tot=1;
  68. void ad(int aa,int bb){
  69. b[tot].to=bb;
  70. b[tot].next=head[aa];
  71. head[aa]=tot++;
  72. }
  73. int dfn[maxn],low[maxn],dfnc,sta[maxn],top,shuyu[maxn],js;
  74. bool vis[maxn][maxn];
  75. void tar(int xx){
  76. dfn[xx]=low[xx]=++dfnc;
  77. sta[++top]=xx;
  78. for(int i=head[xx];i!=-1;i=b[i].next){
  79. int u=b[i].to;
  80. if(!dfn[u]){
  81. tar(u);
  82. low[xx]=min(low[xx],low[u]);
  83. } else if(!shuyu[u]){
  84. low[xx]=min(low[xx],dfn[u]);
  85. }
  86. }
  87. if(low[xx]==dfn[xx]){
  88. js++;
  89. while(1){
  90. int y=sta[top--];
  91. shuyu[y]=js;
  92. if(y==xx) break;
  93. }
  94. }
  95. }
  96. int hq[maxn],tm[maxn],jlhq,jltm,ctd[maxn],mat[maxn];
  97. bool istm[maxn];
  98. int main(){
  99. memset(head,-1,sizeof(head));
  100. int n;
  101. n=read();
  102. for(int i=1;i<=n;i++){
  103. int t;
  104. t=read();
  105. for(int j=1;j<=t;j++){
  106. int aa;
  107. aa=read();
  108. vis[i][aa]=1;
  109. }
  110. }
  111. for(int i=1;i<=n;i++){
  112. for(int j=1;j<=n;j++){
  113. if(i==j) continue;
  114. if(vis[i][j]) ad(i+n,j);
  115. else ad(i,j+n);
  116. }
  117. }
  118. for(int i=1;i<=n*2;i++){
  119. if(!dfn[i]) tar(i);
  120. }
  121. for(int i=1;i<=n;i++){
  122. if(shuyu[i]==shuyu[i+n]){
  123. printf("0\n");
  124. exit(0);
  125. } else if(shuyu[i]<shuyu[n+i]){
  126. hq[++jlhq]=i;
  127. } else {
  128. tm[++jltm]=i;
  129. istm[i]=1;
  130. }
  131. }
  132. int ans=(jlhq&&jltm),tmp1=0,tmp2=0;
  133. for(int i=1;i<=jlhq;i++){
  134. for(int j=1;j<=jltm;j++){
  135. if(vis[hq[i]][tm[j]]){
  136. ++ctd[hq[i]];
  137. mat[hq[i]]=tm[j];
  138. }
  139. }
  140. }
  141. for(int i=1;i<=jltm;i++){
  142. for(int j=1;j<=jlhq;j++){
  143. if(!vis[tm[i]][hq[j]]){
  144. ++ctd[tm[i]];
  145. mat[tm[i]]=hq[j];
  146. }
  147. }
  148. }
  149. for(int i=1;i<=n;i++){
  150. if(ctd[i]==1){
  151. if(ctd[mat[i]]==0) ans++;
  152. }
  153. }
  154. for(int i=1;i<=n;i++){
  155. if(ctd[i]==0){
  156. if((istm[i] && jltm>1) || (!istm[i] && jlhq>1)) ans++;
  157. if(istm[i]) tmp1++;
  158. else tmp2++;
  159. }
  160. }
  161. printf("%d\n",ans+tmp1*tmp2);
  162. return 0;
  163. }

洛谷P3513 [POI2011]KON-Conspiracy的更多相关文章

  1. [洛谷P3527] [POI2011]MET-Meteors

    洛谷题目链接:[POI2011]MET-Meteors 题意翻译 Byteotian Interstellar Union有N个成员国.现在它发现了一颗新的星球,这颗星球的轨道被分为M份(第M份和第1 ...

  2. BZOJ2212或洛谷3521 [POI2011]ROT-Tree Rotations

    BZOJ原题链接 洛谷原题链接 线段树合并裸题. 因为交换子树只会对子树内部的逆序对产生影响,所以我们计算交换前的逆序对个数和交换后的个数,取\(\min\)即可. 对每个叶子节点建一棵动态开点线段树 ...

  3. 洛谷P3515 [POI2011]Lightning Conductor(动态规划,决策单调性,单调队列)

    洛谷题目传送门 疯狂%%%几个月前就秒了此题的Tyher巨佬 借着这题总结一下决策单调性优化DP吧.蒟蒻觉得用数形结合的思想能够轻松地理解它. 首先,题目要我们求所有的\(p_i\),那么把式子变一下 ...

  4. 洛谷 P3527 [POI2011]MET-Meteors 解题报告

    P3527 [POI2011]MET-Meteors 题意翻译 \(\tt{Byteotian \ Interstellar \ Union}\)有\(N\)个成员国.现在它发现了一颗新的星球,这颗星 ...

  5. 洛谷 P3521 [POI2011]ROT-Tree Rotations 解题报告

    P3521 [POI2011]ROT-Tree Rotations 题意:递归给出给一棵\(n(1≤n≤200000)\)个叶子的二叉树,可以交换每个点的左右子树,要求前序遍历叶子的逆序对最少. 大体 ...

  6. 洛谷P3521 [POI2011]ROT-Tree Rotation [线段树合并]

    题目传送门 Tree Rotation 题目描述 Byteasar the gardener is growing a rare tree called Rotatus Informatikus. I ...

  7. 洛谷P3527 [POI2011]MET-Meteors [整体二分]

    题目传送门 Meteors 格式难调,题面就不妨放了. 分析: 一道整体二分的练手题. 就是一般的整体二分的套路,但是要注意,将修改和询问加入队列的时候要先加修改再加询问.另外,博主代码打得太丑,常数 ...

  8. [洛谷P3521][POI2011]ROT-Tree Rotations

    题目大意:给一棵$n(n\leqslant2\times10^5)$个叶子的二叉树,可以交换每个点的左右子树,要求前序遍历叶子的逆序对最少.输出最少的逆序对个数 题解:线段树合并,对于每个节点求出交换 ...

  9. 洛谷P3515 [POI2011]Lightning Conductor(决策单调性)

    题意 已知一个长度为n的序列a1,a2,...,an. 对于每个1<=i<=n,找到最小的非负整数p满足 对于任意的j, aj < = ai + p - sqrt(abs(i-j)) ...

随机推荐

  1. ShaderLab-坐标转换

    观察空间就是相机的空间 投影矩阵本质就是对x.y.z分量进行不同程度的缩放(z还做了平移),结果就是视锥体近切面远切面变成正方形.视锥体的中心在(0,0). (对于正交相机,这一步已经得到了立方体) ...

  2. 事件的event对象基本解释

    事件流: 描述的是在页面中接受事件的顺序主要分为两种: 事件冒泡.事件捕获 事件event对象:1. type 获取事件类型2. target获取事件目标3. stopPropagation() 阻止 ...

  3. git分支管理的策略和冲突问题

    目录 备注: 知识点 关于分支中的冲突 分支管理的策略 分支策略 备注: 本文参考于廖雪峰老师的博客Git教程.依照其博客进行学习和记录,感谢其无私分享,也欢迎各位查看原文. 知识点 git log ...

  4. java面试题NIO与OIO的区别

    面向流与面向缓冲 Java NIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的. Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方 ...

  5. Ethical Hacking - Web Penetration Testing(2)

    INFORMATION GATHERING IP address. Domain name Info. Technologies used. Other websites on the same se ...

  6. python-元类和使用元类实现简单的ORM

    元类 面向对象中,对象是类的实例,即对象是通过类创建出来的,在python中,一切皆对象,同样,类也是一个对象,叫做类对象,只是这个类对象拥有创建其子对象(实例对象)的能力.既然类是对象,那么类是通过 ...

  7. vue的自定义指令。directive

    在vue中有很多vue自带的指令,比如v-heml.v-for.v-if,v-on.v-bind.v-else.v-show. 但是这些指令还不够我们使用的.就有了directive这个对象. 这个使 ...

  8. 痞子衡嵌入式:16MB以上NOR Flash使用不当可能会造成软复位后i.MXRT无法正常启动

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT上使用16MB以上NOR Flash软复位无法正常启动问题的分析解决经验. 痞子衡这几天在支持一个i.MXRT1050客户项 ...

  9. 2020 年百度之星&#183;程序设计大赛 - 初赛三

    2020 年百度之星·程序设计大赛 - 初赛三解题思路及代码(Discount.Game.Permutation) 1.Discount Problem Description学皇来到了一个餐馆吃饭. ...

  10. 面试题之----禁掉cookie的session使用方案

    方式一:通过 url 传值,把session id附加到url上 缺点:整个站点中不能有纯静态页面,因为纯静态页面session id 将无法继续传到下一页面 方式二:通过隐藏表单,把session ...