ZOJ 3209 Treasure Map 精确覆盖
2015-12-10 19:56
489 查看
题目链接
精确覆盖的模板题, 把每一个格子当成一列就可以。
S忘记初始化TLE N次, 哭晕在厕所......
精确覆盖的模板题, 把每一个格子当成一列就可以。
S忘记初始化TLE N次, 哭晕在厕所......
#include<bits/stdc++.h> using namespace std; #define pb(x) push_back(x) #define ll long long #define mk(x, y) make_pair(x, y) #define lson l, m, rt<<1 #define mem(a) memset(a, 0, sizeof(a)) #define rson m+1, r, rt<<1|1 #define mem1(a) memset(a, -1, sizeof(a)) #define mem2(a) memset(a, 0x3f, sizeof(a)) #define rep(i, a, n) for(int i = a; i<n; i++) #define ull unsigned long long typedef pair<int, int> pll; const double PI = acos(-1.0); const double eps = 1e-8; const int mod = 1e9+7; const int inf = 1061109567; const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} }; const int maxn = 10205; const int maxNode = 520005; struct DLX { int L[maxNode], R[maxNode], U[maxNode], D[maxNode], row[maxNode], col[maxNode]; int S[maxn], H[maxn], deep, sz, n, m, num; 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 resume(int c) { for(int i = U[c]; i!=c; i = U[i]) for(int j = L[i]; j!=i; j = L[j]) { S[col[j]]++; D[U[j]] = j; U[D[j]] = j; } R[L[c]] = c; L[R[c]] = c; } void dfs(int d) { if(d>=deep) return ; if(R[0] == 0) { deep = min(d, deep); return ; } int c = R[0]; for(int i = R[0]; i!=0; i = R[i]) if(S[c]>S[i]) c = i; remove(c); for(int i = D[c]; i!=c; i = D[i]) { for(int j = R[i]; j!=i; j = R[j]) remove(col[j]); dfs(d+1); for(int j = L[i]; j!=i; j = L[j]) resume(col[j]); } resume(c); return ; } void add(int r, int c) { sz++; col[sz] = c; S[c]++; U[sz] = U[c]; D[sz] = c; D[U[c]] = sz; U[c] = sz; if(~H[r]) { R[sz] = H[r]; L[sz] = L[H[r]]; L[R[sz]] = sz; R[L[sz]] = sz; } else { H[r] = L[sz] = R[sz] = sz; } } void init(){ mem1(H); for(int i = 0; i<=n; i++) { R[i] = i+1; L[i] = i-1; D[i] = U[i] = i; } R = 0; L[0] = n; mem(S); sz = n; deep = inf; } void solve() { scanf("%d%d%d", &n, &m, &num); n *= m; init(); int x1, y1, x2, y2; int cnt = 1; while(num--) { scanf("%d%d%d%d", &x1, &y1, &x2, &y2); for(int i = x1+1; i<=x2; i++) { for(int j = y1+1; j<=y2; j++) { add(cnt, (i-1)*m+j); } } cnt++; } dfs(0); if(deep == inf) { puts("-1"); } else { printf("%d\n", deep); } } }dlx; int main() { int t; cin>>t; while(t--) { dlx.solve(); } }
相关文章推荐
- 【转】何经华:我在职场30年
- 深入分析JavaWeb Item14 -- jsp九大内置对象
- UVa-679 小球下落
- java操作当前日期的年月日
- 【Codeforces Round 335 (Div 2)E】【计算几何-凸包 线性规划 三分凸包上最优点】Freelancer's Dreams 二维属性 充最少的钱变得满足要求 [计算几何-凸包模
- a人左扶手,b人右扶手,c人双扶手,z人不用扶手,求最多几人一起观看电影。
- 安装Samba,实现Ubuntu12.04和win7的文件共享
- Django学习笔记<三>
- ObjectAnimator 安卓属性动画简单入门
- ACM:回溯,八皇后问题,素数环
- ios开发常用
- 64位windows7 C#.net引用VC++ com组件错误80040154的解决方法
- CodeForces 455B A Lot of Games 字典树 博弈
- Xcode 7 缺少 *.dylib库的解决方法
- 解决Unity 中WWW加载 AssetBundle---中文路径
- 论文笔记3《基于信息增益和最小距离分类的决策树改进算法》
- 《需求分析与系统设计》读书笔记1
- Android Hybird App开发
- 郑也夫的创新基础
- Android的网络与通信