LOJ#3101. 「JSOI2019」精准预测

设0是生,1是死,按2-sat连边那么第一种情况是\((t,x,1) \rightarrow (t + 1,y,1)\),\((t + 1,y, 0) \rightarrow (t,x,0)\)

第二种情况是\((t,x,0) \rightarrow (t,y,1)\),\((t,y,0) \rightarrow(t,x,1)\)

然后\((t,x,0)\)往\((t - 1,x,0)\)连边,\((t,x,1)\)往\((t + 1,x,1)\)连边

发现我们显然可以忽略出度只有一个的点,最后只剩下\(2m + 2n\)个点

然后这是一张DAG,因为生的图是一张DAG,死的图是一张DAG,剩下的只有从生连到死的边

于是我们要求从\((T + 1,x,0)\)走到的\((T + 1,y,1)\)的个数,然后减去

同时我们还要给每个点减去一定会死的人

用bitset优化一下即可。。。

  1. #include <bits/stdc++.h>
  2. #define fi first
  3. #define se second
  4. #define pii pair<int,int>
  5. #define mp make_pair
  6. #define pb push_back
  7. #define space putchar(' ')
  8. #define enter putchar('\n')
  9. #define eps 1e-10
  10. #define ba 47
  11. #define MAXN 50005
  12. //#define ivorysi
  13. using namespace std;
  14. typedef long long int64;
  15. typedef unsigned int u32;
  16. typedef double db;
  17. template<class T>
  18. void read(T &res) {
  19. res = 0;T f = 1;char c = getchar();
  20. while(c < '0' || c > '9') {
  21. if(c == '-') f = -1;
  22. c = getchar();
  23. }
  24. while(c >= '0' && c <= '9') {
  25. res = res * 10 +c - '0';
  26. c = getchar();
  27. }
  28. res *= f;
  29. }
  30. template<class T>
  31. void out(T x) {
  32. if(x < 0) {x = -x;putchar('-');}
  33. if(x >= 10) {
  34. out(x / 10);
  35. }
  36. putchar('0' + x % 10);
  37. }
  38. struct node {
  39. int to,next;
  40. }E[2000005];
  41. struct predict {
  42. int ty,t,x,y;
  43. }pre[100005];
  44. int T,N,M,Ncnt;
  45. vector<int> tim[2][MAXN],pos[2][MAXN];
  46. bitset<50005> reach[100005],all,res[50005];
  47. int head[300005],sumE,deg[300005],rec[300005],dead[300005],live[300005];
  48. vector<int> que,used;
  49. int pu[300005],ans[50005];
  50. void add(int u,int v) {
  51. if(!v || !u) return;
  52. E[++sumE].to = v;
  53. E[sumE].next = head[u];
  54. ++deg[v];++rec[v];
  55. head[u] = sumE;
  56. }
  57. int getid(int k,int x,int t) {
  58. if(k == 0) {
  59. int tar = upper_bound(tim[k][x].begin(),tim[k][x].end(),t) - tim[k][x].begin() - 1;
  60. if(tar < 0) return 0;
  61. return pos[k][x][tar];
  62. }
  63. else {
  64. int tar = lower_bound(tim[k][x].begin(),tim[k][x].end(),t) - tim[k][x].begin();
  65. return pos[k][x][tar];
  66. }
  67. }
  68. void Init() {
  69. read(T);read(N);read(M);
  70. Ncnt = 0;
  71. for(int i = 1 ; i <= N ; ++i) {tim[1][i].pb(T + 1);tim[0][i].pb(T + 1);}
  72. for(int i = 1 ; i <= M ; ++i) {
  73. read(pre[i].ty);read(pre[i].t);read(pre[i].x);read(pre[i].y);
  74. if(pre[i].ty == 0) {
  75. tim[1][pre[i].x].pb(pre[i].t);
  76. tim[0][pre[i].y].pb(pre[i].t + 1);
  77. }
  78. else {
  79. tim[0][pre[i].x].pb(pre[i].t);
  80. tim[0][pre[i].y].pb(pre[i].t);
  81. }
  82. }
  83. for(int i = 1 ; i <= N ; ++i) {
  84. for(int k = 0 ; k < 2 ; ++k) {
  85. sort(tim[k][i].begin(),tim[k][i].end());
  86. tim[k][i].erase(unique(tim[k][i].begin(),tim[k][i].end()),tim[k][i].end());
  87. for(int j = 0 ; j < tim[k][i].size() ; ++j) {
  88. pos[k][i].pb(++Ncnt);
  89. if(k == 1) dead[Ncnt] = i;
  90. if(k == 0 && j != 0) add(pos[k][i][j],pos[k][i][j - 1]);
  91. if(k == 1 && j != 0) add(pos[k][i][j - 1],pos[k][i][j]);
  92. }
  93. }
  94. live[pos[0][i].back()] = i;
  95. }
  96. for(int i = 1 ; i <= M ; ++i) {
  97. if(pre[i].ty == 0) {
  98. add(getid(1,pre[i].x,pre[i].t),getid(1,pre[i].y,pre[i].t + 1));
  99. add(getid(0,pre[i].y,pre[i].t + 1),getid(0,pre[i].x,pre[i].t));
  100. }
  101. else {
  102. add(getid(0,pre[i].x,pre[i].t),getid(1,pre[i].y,pre[i].t));
  103. add(getid(0,pre[i].y,pre[i].t),getid(1,pre[i].x,pre[i].t));
  104. }
  105. }
  106. }
  107. void Solve() {
  108. queue<int> Q;
  109. for(int i = 1 ; i <= Ncnt ; ++i) {
  110. if(!deg[i]) Q.push(i);
  111. }
  112. while(!Q.empty()) {
  113. int u = Q.front();Q.pop();que.pb(u);
  114. for(int i = head[u] ; i ; i = E[i].next) {
  115. int v = E[i].to;
  116. if(!--deg[v]) Q.push(v);
  117. }
  118. }
  119. for(int i = 0 ; i <= 100000 ; ++i) used.pb(i);
  120. all.reset();
  121. for(int j = que.size() - 1 ; j >= 0 ; --j) {
  122. int u = que[j];pu[u] = used.back();used.pop_back();
  123. reach[pu[u]].reset();
  124. if(dead[u]) reach[pu[u]][dead[u]] = 1;
  125. //cerr << "???" << endl;
  126. for(int i = head[u] ; i ; i = E[i].next) {
  127. int v = E[i].to;
  128. reach[pu[u]] |= reach[pu[v]];
  129. if(!--rec[v]) {
  130. used.pb(pu[v]);
  131. }
  132. }
  133. //cerr << "????" << endl;
  134. if(live[u]) {
  135. if(!reach[pu[u]][live[u]]) res[live[u]] = reach[pu[u]];
  136. else all[live[u]] = 1;
  137. }
  138. if(!rec[u]) used.pb(pu[u]);
  139. //cerr << "?????" << endl;
  140. }
  141. for(int i = 1 ; i <= N ; ++i) {
  142. if(!all[i]) {
  143. ans[i] = N - 1 - (res[i] | all).count();
  144. }
  145. out(ans[i]);space;
  146. }
  147. enter;
  148. }
  149. int main(){
  150. #ifdef ivorysi
  151. freopen("f1.in","r",stdin);
  152. #endif
  153. Init();
  154. Solve();
  155. }

【LOJ】#3101. 「JSOI2019」精准预测的更多相关文章

  1. Loj #3102. 「JSOI2019」神经网络

    Loj #3102. 「JSOI2019」神经网络 题目背景 火星探险队发现,火星人的思维方式与人类非常不同,是因为他们拥有与人类很不一样的神经网络结构.为了更好地理解火星人的行为模式,JYY 对小镇 ...

  2. LOJ #3103. 「JSOI2019」节日庆典

    题意 给定字符串 \(S\) ,对于 \(S\) 的每个前缀 \(T\) 求 \(T\) 所有循环同构串的字典序最小的串,输出其起始下标.(如有多个输出最靠前的) \(|S| \le 3 \times ...

  3. 【LOJ】#3103. 「JSOI2019」节日庆典

    LOJ#3103. 「JSOI2019」节日庆典 能当最小位置的值一定是一个最小后缀,而有用的最小后缀不超过\(\log n\)个 为什么不超过\(\log n\)个,看了一下zsy的博客.. 假如\ ...

  4. 【LOJ】#3102. 「JSOI2019」神经网络

    LOJ#3102. 「JSOI2019」神经网络 首先我们容易发现就是把树拆成若干条链,然后要求这些链排在一个环上,同一棵树的链不相邻 把树拆成链可以用一个简单(但是需要复杂的分类讨论)的树背包实现 ...

  5. Loj #2192. 「SHOI2014」概率充电器

    Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  6. Loj #3096. 「SNOI2019」数论

    Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...

  7. Loj #3093. 「BJOI2019」光线

    Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...

  8. Loj #3089. 「BJOI2019」奥术神杖

    Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...

  9. Loj #2542. 「PKUWC2018」随机游走

    Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...

随机推荐

  1. 1626:【例 2】Hankson 的趣味题

    1626:[例 2]Hankson 的趣味题题解 [题目描述] Hanks 博士是 BT(Bio-Tech,生物技术)领域的知名专家,他的儿子名叫 Hankson.现在,刚刚放学回家的 Hankson ...

  2. 内存管理4-Autoreleasepool

    自动释放池是OC里面的一种内存回收机制,一般可以将一些临时变量添加到自动释放池中,统一回收释放,当自动释放池销毁时,池里面的所有对象都会调用一次release,也就是计数器会减1,但是自动释放池被销毁 ...

  3. spring-boot-starter-test

    1.约定 单元测试代码写在src/test/java目录下 单元测试类命名为*Test,前缀为要测试的类名 2. 使用mock方式单元测试 Spring测试框架提供MockMvc对象,可以在不需要客户 ...

  4. Hdu 5344

    Hdu5344 题意: 给你一个数组,求所有的 $ a_i + a_j $ 的异或值. 解法: 因为 $ (a_i+a_j) \bigoplus (a_j + a_i) = 0$ . 所以答案就是 $ ...

  5. 《梁宁·产品思维30讲》课程学习笔记(内含全套音频+ppt资料

    科技进步.产品迭代.公司演化.组织变迁……不变的是用户的情绪和人性. 那些信奉“用户驱动”的人,从普通人变成了行业大佬,建立了自己的世界.乔布斯.马化腾.马云.雷军.张小龙.周鸿祎.傅盛……这些改变世 ...

  6. mysql中的union操作(整理)

    mysql中的union操作(整理) 一.总结 一句话总结: union两侧的字段数和字段类型要是一样的 union可以接多个 orderby和排序可以在最后的union组合之后 1.union简单实 ...

  7. What do you do as a DevOps?

    https://ilhicas.com/2019/08/11/What-you-as-a-Devops.html Introduction In this post I'll just explain ...

  8. 2.5 Go语言基础之map

    Go语言中提供的映射关系容器为map, Go中内置类型,其内部使用散列表(hash)实现,为引用类型. 无序键值对(key-value)集合,通过key(类似索引)快速检索数据 必须初始化才能使用. ...

  9. set serveroutput on

    使用set serveroutput on 命令设置环境变量serveroutput为打开状态,从而使得pl/sql程序能够在SQL*plus中输出结果 使用函数dbms_output.put_lin ...

  10. Ideal 报错之 Class ** is never used 解决办法

    错误信息: 解决办法: file  ------setting ---------inspections----------Groovy--------------Unuse Declaration  ...