Codeforces Round #111 (Div. 2)
Codeforces Round #111 (Div. 2)
AB略 C 看起来挺简单的一道题,看样例显然就是输出a[k/n]和a[k%n],于是WA了两遍… 其实这样是不对的,比如:
1 1 2 11 11 11 11 12 12 21 21 22 1 2 2 2 3 11 12 12 12 13 21 21 21 22 22 22 22 22 22 22 22 22 23 23 23 31 32 32 32 33
test3就是这种数据… 其实应该是a[k/n] a[(k - 重复数字区开始位置(21处))/重复数字个数],还要注意long long…
#include
#include
#include
#include
using namespace std;
int main()
{
long long n;
long long k;
int a[100005];
long long b[100005]; //重复段开始数字位置
long long c[100005]; //重复数字个数,存在开始位置
memset(b, 0, sizeof(b));
memset(c, 0, sizeof(c));
cin >> n >> k;
for (int i = 0; i < n; i++) cin >> a[i];
sort(a, a + n);
b[0] = 0;
for (int i = 1; i < n; i++)
{
if (a[i] == a[i-1]) b[i] = b[i-1];
else //重复段结束时处理
{
b[i] = i;
c[b[i-1]] = i - b[i-1];
}
}
c[b[n-1]] = n - b[n-1]; //处理最后的数字
--k;
long long start = b[k/n] * n;
long long count = c[b[k/n]];
cout << a[k/n] << " " << a[(k - start) / count] << endl;
//cout << a[k/n] << " " << a[k%n] << endl; 错误做法
return 0;
}
DE还没做,看起来D是个好题。
comments powered by Disqus