【HDU 3663】 Power Stations
【题目链接】
http://acm.hdu.edu.cn/showproblem.php?pid=3663
【算法】
先建图,然后用Dancing Links求解精确覆盖,即可
【代码】
- #include<bits/stdc++.h>
- using namespace std;
- #define MAXN 500000
- int i,j,k,l,m,cnt,N,M,D,u,v;
- bool g[][];
- struct Time
- {
- int s,e;
- } ans[],a[];
- struct info
- {
- int l,r,pos;
- } R[MAXN];
- struct DancingLinks
- {
- int n,m,step,size;
- int U[MAXN],D[MAXN],L[MAXN],R[MAXN],Row[MAXN],Col[MAXN];
- int H[MAXN],S[MAXN];
- int ans[MAXN];
- inline void init(int _n,int _m)
- {
- int i;
- n = _n;
- m = _m;
- for (i = ; i <= m; i++)
- {
- S[i] = ;
- U[i] = D[i] = i;
- L[i] = i - ;
- R[i] = i + ;
- }
- L[] = m; R[m] = ;
- size = m;
- for (i = ; i <= n; i++) H[i] = -;
- }
- inline void link(int r,int c)
- {
- size++;
- Row[size] = r;
- Col[size] = c;
- S[c]++;
- D[size] = D[c];
- U[D[c]] = size;
- U[size] = c;
- D[c] = size;
- if (H[r] < ) L[size] = R[size] = H[r] = size;
- else
- {
- R[size] = R[H[r]];
- L[R[H[r]]] = size;
- L[size] = H[r];
- R[H[r]] = size;
- }
- }
- inline void Remove(int c)
- {
- int i,j;
- R[L[c]] = R[c];
- L[R[c]] = L[c];
- for (i = D[c]; i != c; i = D[i])
- {
- for (j = R[i]; j != i; j = R[j])
- {
- D[U[j]] = D[j];
- U[D[j]] = U[j];
- S[Col[j]]--;
- }
- }
- }
- inline void Resume(int c)
- {
- int i,j;
- for (i = U[c]; i != c; i = U[i])
- {
- for (j = L[i]; j != i; j = L[j])
- {
- D[U[j]] = j;
- U[D[j]] = j;
- S[Col[j]]++;
- }
- }
- L[R[c]] = c;
- R[L[c]] = c;
- }
- inline bool solve(int dep)
- {
- int i,j,c;
- if (R[] == )
- {
- step = dep;
- return true;
- }
- c = R[];
- for (i = R[]; i != ; i = R[i])
- {
- if (S[i] < S[c])
- c = i;
- }
- Remove(c);
- for (i = D[c]; i != c; i = D[i])
- {
- ans[dep] = Row[i];
- for (j = R[i]; j != i; j = R[j])
- Remove(Col[j]);
- if (solve(dep+)) return true;
- for (j = L[i]; j != i; j = L[j])
- Resume(Col[j]);
- }
- Resume(c);
- return false;
- }
- } DLX;
- int main()
- {
- while (scanf("%d%d%d",&N,&M,&D) != EOF)
- {
- cnt = ;
- memset(g,false,sizeof(g));
- DLX.init(N*,N*D+N);
- for (i = ; i <= M; i++)
- {
- scanf("%d%d",&u,&v);
- g[u][v] = g[v][u] = true;
- }
- for (i = ; i <= N; i++) g[i][i] = true;
- for (i = ; i <= N; i++) scanf("%d%d",&a[i].s,&a[i].e);
- for (i = ; i <= N; i++)
- {
- for (j = a[i].s; j <= a[i].e; j++)
- {
- for (k = j; k <= a[i].e; k++)
- {
- DLX.link(cnt,i);
- R[cnt] = (info){j,k,i};
- for (l = ; l <= N; l++)
- {
- if (g[i][l])
- {
- for (m = j; m <= k; m++)
- {
- DLX.link(cnt,N+(l-)*D+m);
- }
- }
- }
- cnt++;
- }
- }
- DLX.link(cnt,i);
- R[cnt] = (info){,,i};
- cnt++;
- }
- if (!DLX.solve()) printf("No solution\n");
- else
- {
- memset(ans,,sizeof(ans));
- for (i = ; i < DLX.step; i++)
- {
- ans[R[DLX.ans[i]].pos].s = R[DLX.ans[i]].l;
- ans[R[DLX.ans[i]].pos].e = R[DLX.ans[i]].r;
- }
- for (i = ; i <= N; i++) printf("%d %d\n",ans[i].s,ans[i].e);
- }
- printf("\n");
- }
- return ;
- }
【HDU 3663】 Power Stations的更多相关文章
- 【数位dp】【HDU 3555】【HDU 2089】数位DP入门题
[HDU 3555]原题直通车: 代码: // 31MS 900K 909 B G++ #include<iostream> #include<cstdio> #includ ...
- 【HDU 5647】DZY Loves Connecting(树DP)
pid=5647">[HDU 5647]DZY Loves Connecting(树DP) DZY Loves Connecting Time Limit: 4000/2000 MS ...
- -【线性基】【BZOJ 2460】【BZOJ 2115】【HDU 3949】
[把三道我做过的线性基题目放在一起总结一下,代码都挺简单,主要就是贪心思想和异或的高斯消元] [然后把网上的讲解归纳一下] 1.线性基: 若干数的线性基是一组数a1,a2,a3...an,其中ax的最 ...
- 【HDU 2196】 Computer(树的直径)
[HDU 2196] Computer(树的直径) 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 这题可以用树形DP解决,自然也可以用最直观的方法解 ...
- 【HDU 2196】 Computer (树形DP)
[HDU 2196] Computer 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 刘汝佳<算法竞赛入门经典>P282页留下了这个问题 ...
- 【HDU 5145】 NPY and girls(组合+莫队)
pid=5145">[HDU 5145] NPY and girls(组合+莫队) NPY and girls Time Limit: 8000/4000 MS (Java/Other ...
- 【HDU 5015】233 Matrix
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5015 [算法] 矩阵乘法 [代码] #include<bits/stdc++.h> u ...
- 【HDU 2157】 How Many Ways??
[题目链接] 点击打开链接 [算法] 设A[i][j]为走一条边,从i走到j的方案数 C[i][j]为走两条边,从i走到j的方案数,显然有 : C = A * A = A^2 C'[i][j]为走三条 ...
- 【HDU 1005】 Number Sequence
[题目链接] 点击打开链接 [算法] 矩阵乘法快速幂,即可 [代码] #include<bits/stdc++.h> using namespace std; int a,b,n; str ...
随机推荐
- javascript部分知识点
1:script放置位置: a:<title></title>之后 b:<body>之后 c:<body>中的<div></div&g ...
- redis在linux下安装以及扩展
安装过redis后发现回头忘了,今天重新安装记录下 首先 我是在home下创建redis文件 mkdir redis 然后直接用wget安装 wget http://download.redis ...
- Asp.Mvc 常用
url转义 var address = "http://www.cnblog.com"; var a22 = Uri.EscapeDataString(address); var ...
- swift--Xcode7 使用Alamofire框架发送HTTP请求报错
控制台打印的错误信息: Application Transport Security has blocked a cleartext HTTP (http://) resource load sinc ...
- Luogu 2951 捉迷藏Hide and Seek
P2951 [USACO09OPEN]捉迷藏Hide and Seek 题目描述 Bessie is playing hide and seek (a game in which a number o ...
- Linux 实用指令(4)
目录 实用指令 1.指定运行级别 2.切换到指定运行级别的指令 3.帮助指令 3.1man获得帮助信息 3.2help指令 4.文件目录类 4.1pwd指令 4.2 ls指令 4.3 cd指令 4.4 ...
- 【Codeforces 1114B】Yet Another Array Partitioning Task
[链接] 我是链接,点我呀:) [题意] 让你把数组分成k个连续的部分 使得每个部分最大的m个数字的和最大 [题解] 把原数组降序排序 然后选取前m*k个数字打标记 然后对于原数组 一直贪心地取 直到 ...
- 【codeforces 797C】Minimal string
[题目链接]:http://codeforces.com/contest/797/problem/C [题意] 一开始,给你一个字符串s:两个空字符串t和u; 你有两种合法操作; 1.将s的开头字符加 ...
- hdu 2242双联通分量+树形dp
/*先求出双联通缩点,然后进行树形dp*/ #include<stdio.h> #include<string.h> #include<math.h> #defin ...
- 巧克力棒&&新年的巧克力棒
巧克力棒 题目描述 LYK 找到了一根巧克力棒,但是这根巧克力棒太长了,LYK 无法一口吞进去.具体地,这根巧克力棒长为 n,它想将这根巧克力棒折成 n 段长为 1 的巧克力棒,然后慢慢享用.它打算每 ...