HDU 4941 Magical Forest 离散化
2015-09-10 00:25
267 查看
题意: 一个n * m 的图, 某些点有苹果,每个苹果有价值, 然后现在交换某些行或者列, 或者查询某个点的苹果的价值(没有苹果就是0)。
还是比较好想的。。x[],y[]数组存当前状态下的各行各列存的是初始时的哪一行哪一列,交换的时候交换值就行了, 可能复杂就在离散化吧,不过实际上用map离散化也挺easy的样子。。虽然我用的最传统的vector、sort、 unique、resize然后upper_bound、、
题目给了12s实际上3s完全够了。。
还是比较好想的。。x[],y[]数组存当前状态下的各行各列存的是初始时的哪一行哪一列,交换的时候交换值就行了, 可能复杂就在离散化吧,不过实际上用map离散化也挺easy的样子。。虽然我用的最传统的vector、sort、 unique、resize然后upper_bound、、
题目给了12s实际上3s完全够了。。
#include <set> #include <map> #include <queue> #include <stack> #include <cmath> #include <string> #include <cctype> #include <cstdio> #include <vector> #include <cstdlib> #include <cstring> #include <iomanip> #include <sstream> #include <iostream> #include <algorithm> using namespace std; #define ls id<<1,l,mid #define rs id<<1|1,mid+1,r #define OFF(x) memset(x,-1,sizeof x) #define CLR(x) memset(x,0,sizeof x) #define MEM(x) memset(x,0x3f,sizeof x) typedef long long ll ; typedef pair<int,int> pii ; const int maxn = 3e5+50 ; const int inf = 0x3f3f3f3f ; const int MOD = 1e9+7 ; struct pnt{ int x, y ,c; pnt(int x, int y, int c):x(x),y(y),c(c){} }; int N, M, n, m, k, q, T; vector<pnt> fruit, query; vector<int> Vx, Vy; int mx[maxn], my[maxn]; map<pii, int> mp; void init() { sort(Vx.begin(), Vx.end()); sort(Vy.begin(), Vy.end()); Vx.resize(unique(Vx.begin(), Vx.end()) - Vx.begin()); Vy.resize(unique(Vy.begin(), Vy.end()) - Vy.begin()); for (pnt e : fruit) { int x = e.x, y = e.y; x = upper_bound(Vx.begin(), Vx.end(), x) - Vx.begin(); y = upper_bound(Vy.begin(), Vy.end(), y) - Vy.begin(); mp[pii(x,y)] = e.c; } n = Vx.size();m = Vy.size(); } inline int read() { char c = getchar(); while (!isdigit(c)) c = getchar(); int x = 0; while (isdigit(c)) { x = x * 10 + c - '0' ; c = getchar(); } return x; } int main () { #ifdef LOCAL freopen("C:\\Users\\Administrator\\Desktop\\in.txt","r",stdin); // freopen("C:\\Users\\Administrator\\Desktop\\out.txt","w",stdout); #endif scanf("%d", &T); int cas = 1; while (T--) { printf("Case #%d:\n",cas++); scanf("%d%d%d", &n, &m, &k); Vx.clear();Vy.clear(); fruit.clear();query.clear(); mp.clear(); Vx.push_back(n);Vy.push_back(m); Vx.push_back(0);Vy.push_back(0); int x, y, c; while (k--) { x = read(), y = read(), c = read(); Vx.push_back(x); Vy.push_back(y); fruit.push_back(pnt(x,y,c)); } q = read(); while (q--) { c = read(), x = read(), y = read(); if (c == 1) { Vx.push_back(x); Vx.push_back(y); } else if (c == 2) { Vy.push_back(x); Vy.push_back(y); } else { Vx.push_back(x); Vy.push_back(y); } query.push_back(pnt(x, y, c)); } init(); for (int i = 1; i <= n; i++) mx[i] = i; for (int i = 1; i <= m; i++) my[i] = i; for (pnt q : query) { int op = q.c; if (op == 3) { int x = upper_bound(Vx.begin(), Vx.end(), q.x) - Vx.begin(); int y = upper_bound(Vy.begin(), Vy.end(), q.y) - Vy.begin(); x = mx[x], y = my[y]; if (mp.count(pii(x,y))) printf("%d\n",mp[pii(x,y)]); else puts("0"); } else if (op == 1) { int x1 = upper_bound(Vx.begin(), Vx.end(), q.x) - Vx.begin(); int x2 = upper_bound(Vx.begin(), Vx.end(), q.y) - Vx.begin(); swap(mx[x1], mx[x2]); } else { int y1 = upper_bound(Vy.begin(), Vy.end(), q.x) - Vy.begin(); int y2 = upper_bound(Vy.begin(), Vy.end(), q.y) - Vy.begin(); swap(my[y1], my[y2]); } } } return 0; }
相关文章推荐
- HDU3449_Consumer
- hdu 5113 Black And White
- 【抽象代数】 07 - 因子分解和多项式环
- Quick-Cocos2d-x初学者游戏教程(二) -------------------- Quick内部的代码结构及相应的原理
- Oracle Analyze 命令 详解
- 条款20:宁以pass-by-reference-to-const替换pass-by-value(Prefer pass-by-reference-to-const to pass-by-value)
- blkio.weight使用感想
- 08R2-12R2基于访问权限的文件枚举
- 08R2-12R2基于访问权限的文件枚举
- 移动 app 测试工具 bugtags
- 45个实用的JavaScript技巧、窍门和最佳实践
- FZU 2156 Climb Stairs
- Quick-Cocos2d-x初学者游戏教程(一)--------------------Quick的一些基础知识
- 利用顺序表实现多项式相加
- 2015年9月9日
- Centos 安装配置iscsi
- 图片的异步加载(双缓存)+ViewHolder
- 黑马程序员 abstract class和interface的区别
- redis conf文件解释
- 利用顺序表实现集合的并运算