【HDOJ】Power Stations
DLX。针对每个城市,每个城市可充电的区间构成一个plan。每个决策由N*D个时间及N个精确覆盖构成。
- /* 3663 */
- #include <iostream>
- #include <string>
- #include <map>
- #include <queue>
- #include <set>
- #include <stack>
- #include <vector>
- #include <deque>
- #include <algorithm>
- #include <cstdio>
- #include <cmath>
- #include <ctime>
- #include <cstring>
- #include <climits>
- #include <cctype>
- #include <cassert>
- #include <functional>
- #include <iterator>
- #include <iomanip>
- using namespace std;
- //#pragma comment(linker,"/STACK:102400000,1024000")
- #define sti set<int>
- #define stpii set<pair<int, int> >
- #define mpii map<int,int>
- #define vi vector<int>
- #define pii pair<int,int>
- #define vpii vector<pair<int,int> >
- #define rep(i, a, n) for (int i=a;i<n;++i)
- #define per(i, a, n) for (int i=n-1;i>=a;--i)
- #define clr clear
- #define pb push_back
- #define mp make_pair
- #define fir first
- #define sec second
- #define all(x) (x).begin(),(x).end()
- #define SZ(x) ((int)(x).size())
- #define lson l, mid, rt<<1
- #define rson mid+1, r, rt<<1|1
- const int maxn = ;
- const int maxe = ;
- int B[maxn];
- int S[maxn], E[maxn];
- int ut[maxn], vt[maxn];
- int N, M, D;
- int adj[maxn][maxn];
- int arr[maxn];
- typedef struct {
- static const int maxc = *+;
- static const int maxr = *+;
- static const int maxn = ***+;
- int n, sz;
- int S[maxc];
- int row[maxn], col[maxn];
- int L[maxn], R[maxn], U[maxn], D[maxn];
- int bound;
- int ansd, ans[maxr];
- void init(int bound_, int n_) {
- bound = bound_;
- n = n_;
- rep(i, , n+) {
- L[i] = i - ;
- R[i] = i + ;
- U[i] = i;
- D[i] = i;
- col[i] = i;
- }
- L[] = n;
- R[n] = ;
- sz = n + ;
- memset(S, , sizeof(S));
- }
- void addRow(int r, vi columns) {
- int first = sz;
- int size = SZ(columns);
- rep(i, , size) {
- int c = columns[i];
- L[sz] = sz - ;
- R[sz] = sz + ;
- D[sz] = c;
- U[sz] = U[c];
- D[U[c]] = sz;
- U[c] = sz;
- row[sz] = r;
- col[sz] = c;
- ++S[c];
- ++sz;
- }
- L[first] = sz - ;
- R[sz - ] = first;
- }
- void remove(int c) {
- L[R[c]] = L[c];
- R[L[c]] = R[c];
- for (int i=D[c]; i!=c; i=D[i]) {
- for (int j=R[i]; j!=i; j=R[j]) {
- U[D[j]] = U[j];
- D[U[j]] = D[j];
- --S[col[j]];
- }
- }
- }
- void restore(int c) {
- L[R[c]] = c;
- R[L[c]] = c;
- for (int i=D[c]; i!=c; i=D[i]) {
- for (int j=R[i]; j!=i; j=R[j]) {
- U[D[j]] = j;
- D[U[j]] = j;
- ++S[col[j]];
- }
- }
- }
- bool dfs(int d) {
- if (R[]== || R[]>bound) {
- ansd = d;
- return true;
- }
- int c = R[];
- for (int i=R[]; i!=&&i<=bound; i=R[i]) {
- if (S[i] < S[c])
- c = i;
- }
- remove(c);
- for (int i=D[c]; i!=c; i=D[i]) {
- ans[d] = row[i];
- for (int j=R[i]; j!=i; j=R[j]) {
- remove(col[j]);
- }
- if (dfs(d + )) return true;
- for (int j=L[i]; j!=i; j=L[j]) {
- restore(col[j]);
- }
- }
- restore(c);
- return false;
- }
- } DLX;
- DLX solver;
- int encode(int index, int s, int e) {
- return (index<<) + (s<<)+e;
- }
- void decode(int code, int& index, int& s, int& e) {
- e = code & ;
- code >>= ;
- s = code & ;
- code >>= ;
- index = code;
- }
- void solve() {
- int nd = N*D;
- solver.init(nd, nd+N);
- B[] = ;
- rep(i, , N+)
- B[i] = B[i-]+D;
- rep(i, , N+) {
- int s = S[i];
- int e = E[i];
- int m = ;
- rep(j, , N+) {
- if (adj[i][j])
- arr[m++] = j;
- }
- rep(ss, s, e+) {
- rep(ee, ss, e+) {
- vi columns;
- rep(k, , m) {
- int v = arr[k];
- rep(j, ss, ee+)
- columns.pb(B[v] + j);
- }
- columns.pb(nd + i);
- solver.addRow(encode(i, ss, ee), columns);
- }
- }
- }
- bool flag = solver.dfs();
- if (flag) {
- memset(ut, , sizeof(ut));
- memset(vt, , sizeof(vt));
- int s, e, index;
- rep(i, , solver.ansd) {
- decode(solver.ans[i], index, s, e);
- ut[index] = s;
- vt[index] = e;
- }
- rep(i, , N+)
- printf("%d %d\n", ut[i], vt[i]);
- } else {
- puts("No solution");
- }
- putchar('\n');
- }
- int main() {
- ios::sync_with_stdio(false);
- #ifndef ONLINE_JUDGE
- freopen("data.in", "r", stdin);
- freopen("data.out", "w", stdout);
- #endif
- int u, v;
- while (scanf("%d %d %d",&N,&M,&D)!=EOF) {
- memset(adj, false, sizeof(adj));
- rep(i, , M) {
- scanf("%d %d", &u, &v);
- adj[u][v] = adj[v][u] = true;
- }
- rep(i, , N+)
- adj[i][i] = true;
- rep(i, , N+) {
- scanf("%d %d", &S[i], &E[i]);
- }
- solve();
- }
- #ifndef ONLINE_JUDGE
- printf("time = %d.\n", (int)clock());
- #endif
- return ;
- }
【HDOJ】Power Stations的更多相关文章
- 【SPOJ】Power Modulo Inverted(拓展BSGS)
[SPOJ]Power Modulo Inverted(拓展BSGS) 题面 洛谷 求最小的\(y\) 满足 \[k\equiv x^y(mod\ z)\] 题解 拓展\(BSGS\)模板题 #inc ...
- 【CF913G】Power Substring 数论+原根
[CF913G]Power Substring 题意:T组询问,每次给定一个数a,让你求一个k,满足$2^k$的10进制的后$min(100,length(k))$位包含a作为它的子串.你只需要输出一 ...
- 【HDU 3663】 Power Stations
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3663 [算法] 先建图,然后用Dancing Links求解精确覆盖,即可 [代码] #inclu ...
- 【POJ2406】 Power Strings (KMP)
Power Strings Description Given two strings a and b we define a*b to be their concatenation. For exa ...
- 【POJ2406】【KMP】Power Strings
Description Given two strings a and b we define a*b to be their concatenation. For example, if a = & ...
- 【hash】Power Strings
[题意]: 给出s串出来,能否找到一个前缀 ,通过多次前缀进行拼接.构成s串.如果有多个,请输出最多次数那个. 如:aaaa 可以用1个a,进行4次拼接 可以用2个a,进行2次拼接 可以用4个a,进行 ...
- 【HDOJ】3208 Integer’s Power
1. 题目描述定义如下函数$f(x)$:对于任意整数$y$,找到满足$x^k = y$同时$x$最小并的$k$值.所求为区间$[a, b]$的数代入$f$的累加和,即\[\sum_{x=a}^{b} ...
- 【HDOJ】4729 An Easy Problem for Elfness
其实是求树上的路径间的数据第K大的题目.果断主席树 + LCA.初始流量是这条路径上的最小值.若a<=b,显然直接为s->t建立pipe可以使流量最优:否则,对[0, 10**4]二分得到 ...
- 【HDOJ】4426 Palindromic Substring
综合性很强的一道题目,结合manacher,后缀数组,哈希,RMQ,二分可解.基本思路是通过manacher可以找到所有可能的回文串,哈希去重,后缀数组二分找数目.最后暴力求解.需要注意kth需要为_ ...
随机推荐
- html表单-双向绑定
潜水多年.一直是只看不评不写多年,每每看到各位大牛分享的经典文章都是默默的收藏,对大牛技术分享技术表示感谢,这么多年从博客园学到了很多. 这段时间项目告一段落. 正好这段时间相对清闲,我也整理一些常用 ...
- 从V$SQL_PLAN中FORMAT执行计划
10G版本 select sql_id from v$sqlarea where sql_text like'%xxx%'; select * from v$sql_plan where sql_i ...
- oracle 12 C启动问题
启动时出现以下报错信息: SQL> startup; ORA-48146: missing read, write, or exec permission on directory during ...
- as3判断XML是否合法
XML是否合法 在我认为 XML的标签成对 并且根标签外边没有其他东西 以下是合法的 <?xml version="1.0" encoding="utf-8&quo ...
- (poj)3020 Antenna Placement 匹配
题目链接 : http://poj.org/problem?id=3020 Description The Global Aerial Research Centre has been allotte ...
- bzoj 1096: [ZJOI2007]仓库建设
dp是很好想的了,关键是数据太大,普通dp肯定超时,所以一定有用某种优化,dp优化也就那么几种,这道题用的是斜率优化,先写出普通的状态转移方程: dp[i] = min{ dp[j] + Σ ( p ...
- 树莓派实现TimeMachine以及samba服务
最近一段时间感觉用移动硬盘备份Mac电脑很不方便,因为要把移动硬盘拿出来,还要插上电脑备份,看了一下AirPort,但是价钱太贵,况且只能用于Mac备份并不能用于其他的Samba服务等,感觉不太划算, ...
- trigger
trigger() 方法触发被选元素的指定事件 <html><head><script type="text/javascript" src=&quo ...
- vi/vim正则表达式
http://www.cnblogs.com/penseur/archive/2011/02/25/1964522.html 毋庸多言,在vim中正则表达式得到了十分广泛的应用. 最常用的 / 和 : ...
- 通过xib文件创建和连接UIView
使用Xcode写程序,时间长了,对于界面上的元素,很多时候不想手写代码进行构建,但是有些UIView里面的子控件,又不能通过xib直接进行构造,要是总使用UIViewController来结合xib进 ...