题目:http://codeforces.com/problemset/problem/620/C
文章末有一些测试数据仅供参考
题目大意:就是给你一个数字串,然后将分成几个部分,要求每个部分中必须有一对儿相等的数字,每个数字都属于某个部分,输出划分的部分数量以及对应区间。
很简单一道题,输入的数据都不用存的,输入一个检测一个就好了,用map打标记,用容器存一下要输出的区间端点值,最后挨个儿输出就好了
代码如下:
#include<iostream> #include<map> #include<vector> #include<cstdio> using namespace std; long long item; vector<int> V; int main() { int N; map<long long, bool> P; while (cin >> N) { P.clear(), V.clear(); V.push_back(1); for (int i = 1; i <= N; ++i) { scanf("%I64d", &item); if (P[item]) { V.push_back(i); if (i != N) //如果是最后一个的话就不用放后面的了 V.push_back(i + 1); P.clear(); } else P[item] = 1; } int size_ = V.size() / 2 * 2; //可能会出现奇数(有前无后) if (!size_) //5:1 2 3 4 5 这种输出为-1情况 { cout << -1 << endl; continue; } if (V[size_- 1] != N) V[size_-1] = N; cout << V.size() / 2 << endl; for (int i = 0; i < size_; i += 2) cout << V[i] << " " << V[i + 1] << endl; } }
测试数据:
Input:
10 1 2 1 3 8 3 77777777 63824 11111112 5 8 11111111 222222222 88888888 11111111 55555555 22222242 15254145 22222242
Output:
2 1 3 4 10 2 1 4 5 8
感谢您的阅读,祝您生活愉快~