~~~题面~~~

题解:

  首先观察到,如果没有x的话,这就是一个2-sat问题。

  建图方式:对于限制d1 c1 d2 c2,其中d1, d2分别代表比赛编号,c1, c2代表出场的赛车。

  1,如果d1不能选c1,那么该限制是不会起到作用的,所以不连边。

  2,否则如果d2不能选c2,那么意味这d1-c1不能被选,所以连d1-c1 --- > d1-c2的边,表示必须取d1-c2。

  3,否则都可以选,所以连d1-c1 ---> d2-c2 , d1-c2 ---> d2-c1.

  跑tarjan求强连通分量即可。

  

  那么有x应该怎么做?

  观察到对于一组数据,x最多有8场,所以3^8枚举每场x的比赛是abc中的哪种(不选哪辆车),然后在跑2-sat即可。

  这里输出方案可以不用反向建边+拓扑排序,因为栈是后进先出,所以先出栈的点刚好是反向建边+拓扑排序后先遇到的点,因此只需要记录每个点所在的联通块编号,然后对于每场比赛选择联通块编号小的方案输出即可。

  题目数据极水,A了也不一定是正确代码,请特别注意检查代码正确性。(如果你发现我有哪里错了也可以告诉我QAQ)

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define R register int
  4. #define AC 300100
  5. #define ac 1000000
  6.  
  7. int n, d, timer, all, m;
  8. int s[AC], dfn[AC], low[ac], belong[ac], d1[AC], c1[AC], d2[AC], c2[AC];
  9. int sta[AC], top;
  10. int Head[AC], Next[ac], date[ac], tot;
  11. char ss[AC];
  12. bool flag, z[AC];
  13.  
  14. inline int read()
  15. {
  16. int x = ;char c = getchar();
  17. while(c > '' || c < '') c = getchar();
  18. while(c >= '' && c <= '') x = * x + c - '', c = getchar();
  19. return x;
  20. }
  21.  
  22. inline void upmin(int &a, int b)
  23. {
  24. if(b < a) a = b;
  25. }
  26.  
  27. inline void add(int f, int w)
  28. {
  29. date[++tot] = w, Next[tot] = Head[f], Head[f] = tot;
  30. //printf("%d ---> %d\n", f, w);
  31. }
  32.  
  33. void tarjan(int x)
  34. {
  35. int now;
  36. dfn[x] = low[x] = ++ timer, sta[++top] = x, z[x] = true;
  37. for(R i = Head[x]; i; i = Next[i])
  38. {
  39. now = date[i];
  40. if(!dfn[now])
  41. {
  42. tarjan(now);
  43. upmin(low[x], low[now]);
  44. }
  45. else if(z[now]) upmin(low[x], low[now]);//已经出栈的无需考虑
  46. }
  47. if(low[x] == dfn[x])
  48. {
  49. ++all;
  50. while()
  51. {
  52. now = sta[top--], belong[now] = all, z[now] = false;//标记出栈
  53. if(now == x) break;
  54. }
  55. }
  56. }
  57.  
  58. void init()
  59. {
  60. tot = all = timer = ;
  61. memset(Head, , sizeof(Head));
  62. memset(dfn, , sizeof(dfn));
  63. memset(z, , sizeof(z));
  64. }
  65.  
  66. inline int get(int x, int color)
  67. {
  68. if(s[x] == color) return ;//不合法
  69. if(s[x] == ) return x * + color - ;
  70. else if(s[x] == ) return x * + ((color == ) ? : );
  71. else return x * + color - ;
  72. }
  73.  
  74. void build()
  75. {
  76. init();
  77. for(R i = ; i <= m; i ++)
  78. {
  79. int x = get(d1[i], c1[i]), y = get(d2[i], c2[i]);
  80. if(x)
  81. {
  82. if(y) add(x, y), add(y ^ , x ^ );
  83. else add(x, x ^ );
  84. }
  85. }
  86. int b = n * + ;
  87. for(R i = ; i <= b; i ++)
  88. if(!dfn[i]) tarjan(i);
  89. for(R i = ; i <= b; i += )//error !!!到b
  90. if(belong[i] == belong[i ^ ]) return ;
  91. for(R i = ; i <= n; i ++)
  92. {
  93. int x = i * ;
  94. if(s[i] == ) putchar(belong[x] < belong[x ^ ] ? 'B' : 'C');
  95. else if(s[i] == ) putchar(belong[x] < belong[x ^ ] ? 'A' : 'C');
  96. else putchar(belong[x] < belong[x ^ ] ? 'A' : 'B');
  97. }
  98. flag = true;
  99. }
  100.  
  101. void pre()
  102. {
  103. char ch;
  104. n = read(), d = read();
  105. scanf("%s", ss + );
  106. for(R i = ; i <= n; i ++)
  107. if(ss[i] != 'x') s[i] = ss[i] - 'a' + ;
  108. m = read();
  109. for(R i = ; i <= m; i ++)
  110. {
  111. d1[i] = read(), cin >> ch, c1[i] = ch - 'A' + ;
  112. d2[i] = read(), cin >> ch, c2[i] = ch - 'A' + ;
  113. }
  114. }
  115.  
  116. void dfs(int x)
  117. {
  118. if(flag) return ;
  119. if(x > n)
  120. {
  121. build();
  122. return ;
  123. }
  124. if(!s[x])
  125. {
  126. s[x] = , dfs(x + );
  127. s[x] = , dfs(x + );
  128. s[x] = , dfs(x + );
  129. s[x] = ;
  130. }
  131. else dfs(x + );
  132. }
  133.  
  134. int main()
  135. {
  136. freopen("in.in","r",stdin);
  137. pre();
  138. dfs();
  139. if(!flag) printf("-1");
  140. fclose(stdin);
  141. return ;
  142. }

[NOI2017]游戏 2-sat的更多相关文章

  1. P3825 [NOI2017]游戏

    题目 P3825 [NOI2017]游戏 做法 \(x\)地图外的地图好做,模型:\((x,y)\)必须同时选\(x \rightarrow y,y^\prime \rightarrow x^\pri ...

  2. 【BZOJ4945】[Noi2017]游戏 2-SAT

    [BZOJ4945][Noi2017]游戏 题目描述 题解:2-SAT学艺不精啊! 这题一打眼看上去是个3-SAT?哎?3-SAT不是NPC吗?哎?这题x怎么只有8个?暴力走起! 因为x要么不是A要么 ...

  3. [Luogu P3825] [NOI2017] 游戏 (2-SAT)

    [Luogu P3825] [NOI2017] 游戏 (2-SAT) 题面 题面较长,略 分析 看到这些约束,应该想到这是类似2-SAT的问题.但是x地图很麻烦,因为k-SAT问题在k>2的时候 ...

  4. bzoj3825 NOI2017 游戏

    题目背景 狂野飙车是小 L 最喜欢的游戏.与其他业余玩家不同的是,小 L 在玩游戏之余,还精于研究游戏的设计,因此他有着与众不同的游戏策略. 题目描述 小 L 计划进行nn 场游戏,每场游戏使用一张地 ...

  5. [NOI2017]游戏(2-SAT)

    这是约半年前写的题解了,就搬过来吧 感觉这是NOI2017最水的一题(当然我还是不会2333),因为是一道裸的2-SAT.我就是看着这道题学的2-SAT 算法一:暴力枚举.对于abc二进制枚举,对于x ...

  6. NOI2017 [NOI2017]游戏 【2-sat】

    题目 题目背景 狂野飙车是小 L 最喜欢的游戏.与其他业余玩家不同的是,小 L 在玩游戏之余,还精于研究游戏的设计,因此他有着与众不同的游戏策略. 题目描述 小 L 计划进行nn 场游戏,每场游戏使用 ...

  7. bzoj 4945: [Noi2017]游戏

    Description Solution 首先我们发现一个位置如果不是 \('x'\),那么就只有两种选择 而 \('x'\) 的个数小于等于 \(8\),直接枚举是哪个就好了 然后就是 \(2-sa ...

  8. [NOI2017]游戏

    题目描述 http://www.lydsy.com/JudgeOnline/upload/Noi2017D2.pdf 题解 如果说没有x的话,那么每一局只能有两种选择,可以描述为是/非,每条限制也可以 ...

  9. 洛谷3825 [NOI2017]游戏 2-sat

    原文链接http://www.cnblogs.com/zhouzhendong/p/8146041.html 题目传送门 - 洛谷3825 题解 我们考虑到地图中x的个数很少,最多只有8个. 所以我们 ...

  10. Luogu3825 NOI2017 游戏 2-SAT

    传送门 第一眼看上去似乎是一个3-SAT问题 然而\(d \leq 8\)给我们的信息就是:暴力枚举 枚举\(x\)型地图变成\(a\)型地图还是\(b\)型地图(实际上不要枚举\(c\),因为\(a ...

随机推荐

  1. hive自定义函数(UDF)

    首先什么是UDF,UDF的全称为user-defined function,用户定义函数,为什么有它的存在呢?有的时候 你要写的查询无法轻松地使用Hive提供的内置函数来表示,通过写UDF,Hive就 ...

  2. spark-day1

    #!/usr/bin/python # -*- coding: utf_8 -*- from pyspark import SparkConf, SparkContext import os, tim ...

  3. 列表排序之NB三人组附加一个希尔排序

    NB三人组之 快速排序 def partition(li, left, right): tmp = li[left] while left < right: while left < ri ...

  4. struts2架构网站漏洞修复详情与利用漏洞修复方案

    struts2从开发出来到现在,很多互联网企业,公司,平台都在使用apache struts2系统来开发网站,以及应用系统,这几年来因为使用较多,被攻击者挖掘出来的struts2漏洞也越来越,从最一开 ...

  5. C中 snprintf()函数的作用

    函数原型:int snprintf(char* dest_str,size_t size,const char* format,...); 函数功能:先将可变参数 “…” 按照format的格式格式化 ...

  6. 008---re正则模块

    re正则模块 字符串的匹配规则 匹配模式 re.match() re.search() re.findall() re.split() re.sub() 元字符 print('------------ ...

  7. HyperLedger Fabric 1.4 架构(6.2)

    6.2.1 架构演进       Fabric架构经历了0.6版本到1.0版本的演进,架构上进行了重大改进,从0.6版本的结构简单演进到可扩展.多通道的设计,在架构上有了质的飞跃:从1.0版本以后,架 ...

  8. MVC4+EF 列表数据不能绑定

    最新准备使用.net 的mvc+Ef来写个项目,开始一切顺利,到了数据绑定时出现了问题. 我的mvc视图引擎是Razor,后台提取数据的是Linq来处理,发现不管怎么样都不能绑定列表数据,可以将后台的 ...

  9. PHP.46-TP框架商城应用实例-后台21-权限管理-权限和角色的关系

    权限和角色的关系 权限功能 角色功能 权限与角色的关联要通过权限-角色表进行{多对多} /********* 角色-权限表 *********/ drop if exists p39_role_pri ...

  10. 关于springboot 连接mysql 数据库报错问题

    springboot连接MySQL运行报错: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more ...