2-sat+二分。。。

每次二分答案然后连边2-sat。。。边要开到n*n

样例水得跟没有一样。。。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N = ;
  4. struct edge {
  5. int nxt, to;
  6. } e[N * N << ];
  7. int n, cnt = , top, Time, cot;
  8. int dfn[N], low[N], vis[N], st[N], early[N], late[N], head[N], belong[N];
  9. void link(int u, int v)
  10. {
  11. e[++cnt].nxt = head[u];
  12. head[u] = cnt;
  13. e[cnt].to = v;
  14. }
  15. void tarjan(int u)
  16. {
  17. st[++top] = u; dfn[u] = low[u] = ++Time; vis[u] = ;
  18. for(int i = head[u]; i; i = e[i].nxt)
  19. {
  20. if(!dfn[e[i].to])
  21. {
  22. tarjan(e[i].to);
  23. low[u] = min(low[u], low[e[i].to]);
  24. }
  25. else if(vis[e[i].to]) low[u] = min(low[u], dfn[e[i].to]);
  26. }
  27. if(dfn[u] == low[u])
  28. {
  29. ++cot; int x = ;
  30. while(x != u)
  31. {
  32. x = st[top--];
  33. belong[x] = cot;
  34. vis[x] = ;
  35. }
  36. }
  37. }
  38. bool judge(int t)
  39. {
  40. memset(head, , sizeof(head));
  41. memset(dfn, , sizeof(dfn));
  42. memset(low, , sizeof(low));
  43. memset(belong, , sizeof(belong));
  44. cnt = ; top = Time = cot = ;
  45. for(int i = ; i <= n; ++i)
  46. for(int j = ; j <= n; ++j) if(i != j)
  47. {
  48. int x = i << , y = j << ;
  49. if(late[i] - late[j] >= && late[i] - late[j] < t)
  50. link(x, y - ), link(y, x - );
  51. if(late[i] - early[j] >= && late[i] - early[j] < t)
  52. link(x, y), link(y - , x - );
  53. if(early[i] - late[j] >= && early[i] - late[j] < t)
  54. link(x - , y - ), link(y, x);
  55. if(early[i] - early[j] >= && early[i] - early[j] < t)
  56. link(x - , y), link(y - , x);
  57. }
  58. for(int i = ; i <= * n; ++i) if(!dfn[i]) tarjan(i);
  59. for(int i = ; i <= n; ++i) if(belong[i * ] == belong[i * - ]) return false;
  60. return true;
  61. }
  62. int main()
  63. {
  64. while(scanf("%d", &n) != EOF)
  65. {
  66. int l = , r = , ans = ;
  67. for(int i = ; i <= n; ++i) scanf("%d%d", &early[i], &late[i]), r = max(r, late[i]);
  68. while(r - l > )
  69. {
  70. int mid = (l + r) >> ;
  71. if(judge(mid)) ans = l = mid; else r = mid;
  72. }
  73. printf("%d\n", ans);
  74. }
  75. return ;
  76. }

la3211的更多相关文章

  1. LA3211 Now or later

    题目大意:n架飞机,每架可选择两个着落时间.安排一个着陆时间表,使得着陆间隔的最小值最大.(转自http://blog.csdn.net/u013514182/article/details/4233 ...

  2. LA3211 飞机调度 Now or later-二分法&TwoSet

    https://vjudge.net/problem/UVALive-3211 As you must have experienced, instead of landing immediately ...

  3. 【LA3211 训练指南】飞机调度 【2-sat】

    题意 有n嫁飞机需要着陆.每架飞机都可以选择“早着陆”和“晚着陆”两种方式之一,且必须选择一种.第i架飞机的早着陆时间为Ei,晚着陆时间为Li,不得在其他时间着陆.你的任务是为这些飞机安排着陆方式,使 ...

  4. 【UVALive - 3211】Now or later (二分+2-SAT)

    题意: 有n架飞机需要着陆.每架飞机有两种选择,早着陆或者晚着陆,二选其一.现在为了保证飞机的着陆安全,要求两架着陆的飞机的时间间隔的最小值达到最大. 分析: 最小值最大问题我们想到二分答案.对于猜测 ...

随机推荐

  1. 01Hypertext Preprocessor

    Hypertext Preprocessor PHP即Hypertext Preprocessor是一种被广泛使用的开放源代码多用途动态交互性站点的强有力的服务器端脚本语言尤其适用于 Web开发人员可 ...

  2. 荷兰国旗问题、快排以及BFPRT算法

    荷兰国旗问题 给定一个数组arr,和一个数num,请把小于num的数放数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边.要求额外空间复杂度O(1),时间复杂度O(N). 这个问题 ...

  3. 'dict' object is not callable

    今天学py的map函数时,由于在上面定义了一个dict类型的变量(取的名是map),所以编译后报了这么一个错,哎,以后学py命名要小心了

  4. 手机端--tap PC端--click

    区别: tap为jq mobile 的方法 1.click与tap都会触发点击事件,但是在手机web端,click会有200-300ms的延迟,所以一般用tap代替click作为点击事件.single ...

  5. PAT 1122 Hamiltonian Cycle

    The "Hamilton cycle problem" is to find a simple cycle that contains every vertex in a gra ...

  6. idea 编译级别的设置

    File->Settings Project Structure

  7. 阿里云服务器Ubuntu 16.04 3安装mysql

    .更新系统 apt-get update [注意:要在root用户下] .安装mysql-server apt-get install mysql-serverapt-get install mysq ...

  8. nyoj 31 5个数求最值

    5个数求最值 时间限制:1000 ms  |  内存限制:65535 KB 难度:1   描述 设计一个从5个整数中取最小数和最大数的程序   输入 输入只有一组测试数据,为五个不大于1万的正整数 输 ...

  9. [luoguP1854] 花店橱窗布置(DP)

    传送门 f[i][j] 表示前 i 盆花,放到前 j 个花盆中的最优解 pre[i][j] 记录前驱 代码 #include <cstdio> #include <cstring&g ...

  10. JS动态添加div,然后在div中添加元素

    需求: 组织部中有个这样的需求,根据年份动态显示该年份下的定性指标! 我的做法: 先是放一个空的div,让后根据指标的数据,动态的往div中添加元素. 代码: 空的div,存放定性指标 <div ...