【题目链接】

http://acm.hdu.edu.cn/showproblem.php?pid=3663

【算法】

先建图,然后用Dancing Links求解精确覆盖,即可

【代码】

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define MAXN 500000
  4.  
  5. int i,j,k,l,m,cnt,N,M,D,u,v;
  6. bool g[][];
  7. struct Time
  8. {
  9. int s,e;
  10. } ans[],a[];
  11. struct info
  12. {
  13. int l,r,pos;
  14. } R[MAXN];
  15.  
  16. struct DancingLinks
  17. {
  18. int n,m,step,size;
  19. int U[MAXN],D[MAXN],L[MAXN],R[MAXN],Row[MAXN],Col[MAXN];
  20. int H[MAXN],S[MAXN];
  21. int ans[MAXN];
  22. inline void init(int _n,int _m)
  23. {
  24. int i;
  25. n = _n;
  26. m = _m;
  27. for (i = ; i <= m; i++)
  28. {
  29. S[i] = ;
  30. U[i] = D[i] = i;
  31. L[i] = i - ;
  32. R[i] = i + ;
  33. }
  34. L[] = m; R[m] = ;
  35. size = m;
  36. for (i = ; i <= n; i++) H[i] = -;
  37. }
  38. inline void link(int r,int c)
  39. {
  40. size++;
  41. Row[size] = r;
  42. Col[size] = c;
  43. S[c]++;
  44. D[size] = D[c];
  45. U[D[c]] = size;
  46. U[size] = c;
  47. D[c] = size;
  48. if (H[r] < ) L[size] = R[size] = H[r] = size;
  49. else
  50. {
  51. R[size] = R[H[r]];
  52. L[R[H[r]]] = size;
  53. L[size] = H[r];
  54. R[H[r]] = size;
  55. }
  56. }
  57. inline void Remove(int c)
  58. {
  59. int i,j;
  60. R[L[c]] = R[c];
  61. L[R[c]] = L[c];
  62. for (i = D[c]; i != c; i = D[i])
  63. {
  64. for (j = R[i]; j != i; j = R[j])
  65. {
  66. D[U[j]] = D[j];
  67. U[D[j]] = U[j];
  68. S[Col[j]]--;
  69. }
  70. }
  71. }
  72. inline void Resume(int c)
  73. {
  74. int i,j;
  75. for (i = U[c]; i != c; i = U[i])
  76. {
  77. for (j = L[i]; j != i; j = L[j])
  78. {
  79. D[U[j]] = j;
  80. U[D[j]] = j;
  81. S[Col[j]]++;
  82. }
  83. }
  84. L[R[c]] = c;
  85. R[L[c]] = c;
  86. }
  87. inline bool solve(int dep)
  88. {
  89. int i,j,c;
  90. if (R[] == )
  91. {
  92. step = dep;
  93. return true;
  94. }
  95. c = R[];
  96. for (i = R[]; i != ; i = R[i])
  97. {
  98. if (S[i] < S[c])
  99. c = i;
  100. }
  101. Remove(c);
  102. for (i = D[c]; i != c; i = D[i])
  103. {
  104. ans[dep] = Row[i];
  105. for (j = R[i]; j != i; j = R[j])
  106. Remove(Col[j]);
  107. if (solve(dep+)) return true;
  108. for (j = L[i]; j != i; j = L[j])
  109. Resume(Col[j]);
  110. }
  111. Resume(c);
  112. return false;
  113. }
  114. } DLX;
  115.  
  116. int main()
  117. {
  118.  
  119. while (scanf("%d%d%d",&N,&M,&D) != EOF)
  120. {
  121. cnt = ;
  122. memset(g,false,sizeof(g));
  123. DLX.init(N*,N*D+N);
  124. for (i = ; i <= M; i++)
  125. {
  126. scanf("%d%d",&u,&v);
  127. g[u][v] = g[v][u] = true;
  128. }
  129. for (i = ; i <= N; i++) g[i][i] = true;
  130. for (i = ; i <= N; i++) scanf("%d%d",&a[i].s,&a[i].e);
  131. for (i = ; i <= N; i++)
  132. {
  133. for (j = a[i].s; j <= a[i].e; j++)
  134. {
  135. for (k = j; k <= a[i].e; k++)
  136. {
  137. DLX.link(cnt,i);
  138. R[cnt] = (info){j,k,i};
  139. for (l = ; l <= N; l++)
  140. {
  141. if (g[i][l])
  142. {
  143. for (m = j; m <= k; m++)
  144. {
  145. DLX.link(cnt,N+(l-)*D+m);
  146. }
  147. }
  148. }
  149. cnt++;
  150. }
  151. }
  152. DLX.link(cnt,i);
  153. R[cnt] = (info){,,i};
  154. cnt++;
  155. }
  156. if (!DLX.solve()) printf("No solution\n");
  157. else
  158. {
  159. memset(ans,,sizeof(ans));
  160. for (i = ; i < DLX.step; i++)
  161. {
  162. ans[R[DLX.ans[i]].pos].s = R[DLX.ans[i]].l;
  163. ans[R[DLX.ans[i]].pos].e = R[DLX.ans[i]].r;
  164. }
  165. for (i = ; i <= N; i++) printf("%d %d\n",ans[i].s,ans[i].e);
  166. }
  167. printf("\n");
  168. }
  169.  
  170. return ;
  171.  
  172. }

【HDU 3663】 Power Stations的更多相关文章

  1. 【数位dp】【HDU 3555】【HDU 2089】数位DP入门题

    [HDU  3555]原题直通车: 代码: // 31MS 900K 909 B G++ #include<iostream> #include<cstdio> #includ ...

  2. 【HDU 5647】DZY Loves Connecting(树DP)

    pid=5647">[HDU 5647]DZY Loves Connecting(树DP) DZY Loves Connecting Time Limit: 4000/2000 MS ...

  3. -【线性基】【BZOJ 2460】【BZOJ 2115】【HDU 3949】

    [把三道我做过的线性基题目放在一起总结一下,代码都挺简单,主要就是贪心思想和异或的高斯消元] [然后把网上的讲解归纳一下] 1.线性基: 若干数的线性基是一组数a1,a2,a3...an,其中ax的最 ...

  4. 【HDU 2196】 Computer(树的直径)

    [HDU 2196] Computer(树的直径) 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 这题可以用树形DP解决,自然也可以用最直观的方法解 ...

  5. 【HDU 2196】 Computer (树形DP)

    [HDU 2196] Computer 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 刘汝佳<算法竞赛入门经典>P282页留下了这个问题 ...

  6. 【HDU 5145】 NPY and girls(组合+莫队)

    pid=5145">[HDU 5145] NPY and girls(组合+莫队) NPY and girls Time Limit: 8000/4000 MS (Java/Other ...

  7. 【HDU 5015】233 Matrix

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5015 [算法] 矩阵乘法 [代码] #include<bits/stdc++.h> u ...

  8. 【HDU 2157】 How Many Ways??

    [题目链接] 点击打开链接 [算法] 设A[i][j]为走一条边,从i走到j的方案数 C[i][j]为走两条边,从i走到j的方案数,显然有 : C = A * A = A^2 C'[i][j]为走三条 ...

  9. 【HDU 1005】 Number Sequence

    [题目链接] 点击打开链接 [算法] 矩阵乘法快速幂,即可 [代码] #include<bits/stdc++.h> using namespace std; int a,b,n; str ...

随机推荐

  1. javascript部分知识点

    1:script放置位置: a:<title></title>之后 b:<body>之后 c:<body>中的<div></div&g ...

  2. redis在linux下安装以及扩展

    安装过redis后发现回头忘了,今天重新安装记录下 首先 我是在home下创建redis文件   mkdir  redis 然后直接用wget安装 wget http://download.redis ...

  3. Asp.Mvc 常用

    url转义 var address = "http://www.cnblog.com"; var a22 = Uri.EscapeDataString(address); var ...

  4. swift--Xcode7 使用Alamofire框架发送HTTP请求报错

    控制台打印的错误信息: Application Transport Security has blocked a cleartext HTTP (http://) resource load sinc ...

  5. Luogu 2951 捉迷藏Hide and Seek

    P2951 [USACO09OPEN]捉迷藏Hide and Seek 题目描述 Bessie is playing hide and seek (a game in which a number o ...

  6. Linux 实用指令(4)

    目录 实用指令 1.指定运行级别 2.切换到指定运行级别的指令 3.帮助指令 3.1man获得帮助信息 3.2help指令 4.文件目录类 4.1pwd指令 4.2 ls指令 4.3 cd指令 4.4 ...

  7. 【Codeforces 1114B】Yet Another Array Partitioning Task

    [链接] 我是链接,点我呀:) [题意] 让你把数组分成k个连续的部分 使得每个部分最大的m个数字的和最大 [题解] 把原数组降序排序 然后选取前m*k个数字打标记 然后对于原数组 一直贪心地取 直到 ...

  8. 【codeforces 797C】Minimal string

    [题目链接]:http://codeforces.com/contest/797/problem/C [题意] 一开始,给你一个字符串s:两个空字符串t和u; 你有两种合法操作; 1.将s的开头字符加 ...

  9. hdu 2242双联通分量+树形dp

    /*先求出双联通缩点,然后进行树形dp*/ #include<stdio.h> #include<string.h> #include<math.h> #defin ...

  10. 巧克力棒&&新年的巧克力棒

    巧克力棒 题目描述 LYK 找到了一根巧克力棒,但是这根巧克力棒太长了,LYK 无法一口吞进去.具体地,这根巧克力棒长为 n,它想将这根巧克力棒折成 n 段长为 1 的巧克力棒,然后慢慢享用.它打算每 ...