51Nod-1484-猜数游戏
2016-09-27 21:01
197 查看
ACM模版
迭代器的陷阱——迭代器失效。
如果用迭代器删除指定位置的元素,那么该操作返回的是一个迭代器,并且此迭代器指向删除元素的下一个元素;如果是删除某范围内的元素时,返回值也是一个迭代器,指向最后一个被删除元素的下一个元素。
描述
题解
算法思路很容易想,就是区间交和区间并问题,然而我却坑死在了迭代器的陷阱上!!!迭代器的陷阱——迭代器失效。
如果用迭代器删除指定位置的元素,那么该操作返回的是一个迭代器,并且此迭代器指向删除元素的下一个元素;如果是删除某范围内的元素时,返回值也是一个迭代器,指向最后一个被删除元素的下一个元素。
代码
#include <iostream> #include <algorithm> #include <cstdio> #include <vector> #include <cmath> using namespace std; const int MAXH = 55; typedef long long ll; int h, q; ll res = 0; int vis[MAXH]; vector<pair<ll, ll> > route[MAXH]; vector<pair<ll, ll> >::iterator it; void pri(int i) { if (i == 1) { cout << "Game cheated!\n"; } else if (i == 2) { cout << "Data not sufficient!\n"; } else { if (res == 0) { cout << "Game cheated!\n"; } else { cout << res << '\n'; } } res = -1; } void dfs(ll L, ll R, int high) { vector<pair<ll, ll> >::iterator it_; if (high == h) { for (it_ = route[high].begin(); it_ != route[high].end(); it_++) { if ((*it_).first >= L && (*it_).second <= R) { if ((*it_).first != (*it_).second || res > 0) { pri(2); } else if (res != -1) { res = (*it_).first; } } else if ((*it_).first < L && (*it_).second <= R) { if ((*it_).second != L || res > 0) { pri(2); } else if (res != -1) { res = L; } } else if ((*it_).first >= L && (*it_).second > R) { if (R != (*it_).first || res > 0) { pri(2); } else if (res != -1) { res = R; } } else if ((*it_).first < L && (*it_).second > R) { if (L != R || res > 0) { pri(2); } else if (res != -1) { res = L; } } } return ; } for (it_ = route[high].begin(); it_ != route[high].end(); it_++) { if ((*it_).first >= L && (*it_).second <= R && !res) { dfs((*it_).first * 2, (*it_).second * 2 + 1, high + 1); } else if ((*it_).first < L && (*it_).second <= R && (*it_).second >= L && !res) { dfs(L * 2, (*it_).second * 2 + 1, high + 1); } else if ((*it_).first >= L && (*it_).first <= R && (*it_).second > R && !res) { dfs((*it_).first * 2, R * 2 + 1, high + 1); } else if ((*it_).first < L && (*it_).second > R && !res) { dfs(L * 2, R * 2 + 1, high + 1); } } } int main(int argc, const char * argv[]) { // freopen("/Users/zyj/Desktop/input.txt", "r", stdin); cin >> h >> q; int i, ans; ll L, R; for (int j = 0; j < q; j++) { scanf("%d%lld%lld%d", &i, &L, &R, &ans); if (ans) { if (!vis[i]) { route[i].push_back({L, R}); } else { for (it = route[i].begin(); it != route[i].end(); ) { if ((*it).second < L || (*it).first > R) { it = route[i].erase(it); } else { if ((*it).first < L) { (*it).first = L; } if ((*it).second > R) { (*it).second = R; } it++; } } if (route[i].empty()) { pri(1); return 0; } } } else { if (!vis[i]) { if (L != pow(2, i - 1)) { route[i].push_back({pow(2, i - 1), L - 1}); } if (R != pow(2, i) - 1) { route[i].push_back({R + 1, pow(2, i) - 1}); } if (route[i].empty()) { pri(1); return 0; } } else { if (route[i].empty()) { pri(1); return 0; } for (it = route[i].begin(); it != route[i].end(); ) { if ((*it).first >= L && (*it).second <= R) { it = route[i].erase(it); if (route[i].empty()) { pri(1); return 0; } } else { if ((*it).first < L && (*it).second > R) { ll r = (*it).second; (*it).second = L - 1; route[i].push_back({R + 1, r}); it = route[i].begin(); } else { if ((*it).first <= R && (*it).second > R) { (*it).first = R + 1; } if ((*it).second >= L && (*it).first < L) { (*it).second = L - 1; } it++; } } } } } vis[i] = 1; } for (int j = 1; j <= h; j++) { if (!vis[j]) { route[j].push_back({pow(2, j - 1), pow(2, j) - 1}); } } dfs(1, 1, 1); if (res != -1) { pri(3); } return 0; }
参考
《STL iterator简介》相关文章推荐
- 51Nod 1536 不一样的猜数游戏
- 51nod 1536 不一样的猜数游戏
- 51nod 1536 不一样的猜数游戏
- 51Nod-1536-不一样的猜数游戏
- 51NOD 1536 不一样的猜数游戏 数论
- 51nod 1536不一样的猜数游戏 O(n)素数筛选法。同Codeforces 576A Vasya and Petya's Game。
- 51nod 1536 不一样的猜数游戏 (找规律+素数筛)
- 51nod 1536 不一样的猜数游戏
- 51nod 1536不一样的猜数游戏 思路:O(n)素数筛选法。同Codeforces 576A Vasya and Petya's Game。
- 51nod 1536不一样的猜数游戏(找规律)
- 51nod-1390 游戏得分
- 51Nod 1831 小C的游戏
- 51nod 1534 棋子游戏
- 51nod 1068 Bash游戏 V3
- 51Nod - 1069 Nim游戏
- 51NOD 1459 迷宫游戏
- 51nod 1066 Bash游戏
- 51nod 1066 Bash游戏 (博弈论)
- 51Nod 1067 Bash游戏 V2 找规律
- 【C代码练习3】猜数游戏