51Nod-1484-猜数游戏
来源:互联网 发布:知乎你见过最阴暗的事 编辑:程序博客网 时间:2024/04/30 06:03
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简介》
0 0
- 51Nod-1484-猜数游戏
- 51Nod-1536-不一样的猜数游戏
- 51nod 1536 不一样的猜数游戏
- 51NOD 1536 不一样的猜数游戏 数论
- 51nod 1536 不一样的猜数游戏
- 51Nod 1536 不一样的猜数游戏
- 51nod 1484-猜数游戏(区间交+区间并->map)
- 51nod 1536不一样的猜数游戏(找规律)
- 51nod 1536 不一样的猜数游戏 (找规律+素数筛)
- 51nod 硬币游戏
- 51 nod bash游戏
- 迷宫游戏 51Nod
- 51Nod 迷宫游戏
- 威佐夫游戏 51Nod
- 51Nod 逆序数
- 51 nod 数数字
- 51nod逆序数
- 51Nod 水仙花数
- Auto Control 002 自动控制原理 自动控制的数学模型
- 工程管理器make(二)
- VS中注释与取消注释的快捷键
- 如何使用Socket攻击网站
- CODEVS 3162 3163 3168 抄书问题1 2 3
- 51Nod-1484-猜数游戏
- PHPer之路
- 利用github pages快速搭建个人网站
- iOS Layer动画 二(Swift)
- 【编程语言】Python Tkinter模块安装 CentOS 7 下
- 博客迁移
- 第5周 项目3-括号的匹配
- C++ —— C++常量和变量
- C语言 编写登录系统