标签:ted ima contest can break for red team 数组
(占坑)
签到题
模拟
题意:构造两个长为 \(n\) 的数组 \(a,b\),元素取值范围是 \([1,n]\),\(a\) 中的数互不相同,\(b\) 中至少有一对相同的数,给出一些形如 \((x,y)\) 的限制,要满足 \((a[x]<a[y])==(b[x]<b[y])\)。
取两个没有边相连的位置填上一对差值为 \(1\) 的数,然后其它的位置随便填,这样就构造出了 \(a\) 数组,\(b\) 数组再把那两个位置变成同一个数即可。
#include <cstdio>
#include <vector>
const int N = 100005;
int n, m, a[N], f[N], x;
std::vector<int> G[N];
int main() {
scanf("%d%d", &n, &m);
if (m == n * (n - 1) / 2) { puts("NO"); return 0; }
for (int i = 1, a, b; i <= m; ++i) {
scanf("%d%d", &a, &b), G[a].push_back(b), G[b].push_back(a);
}
for (int i = 1; i <= n; ++i) {
if (G[i].size() == n - 1) continue;
int m = G[i].size();
for (int j = 0; j < m; ++j) f[G[i][j]] = 1;
for (int j = 1; j <= n; ++j)
if (!f[j] && i != j) {
x = j, a[i] = 1, a[j] = 2; break;
}
break;
}
for (int i = 1, j = 2; i <= n; ++i)
if (!a[i]) a[i] = ++j;
puts("YES");
for (int i = 1; i <= n; ++i) printf("%d ", a[i]);
puts(""); a[x] = 1;
for (int i = 1; i <= n; ++i) printf("%d ", a[i]);
return 0;
}
题意:给出一个序列,找出两个位置 \(i,j\) 满足 \(i<j\) 且 \(a[i]<a[j]\),使得 \(a[i]·a[j]\) 最小。
对于正数,直接取它前面的最小值相乘更新即可;对于负数,维护一个递减的单调栈,插入负数 \(x\) 时把单调栈中小于 \(x\) 的数全弹掉,因为如果后面要用到这些数,则后面的数一定是小于等于 \(x\) 的,一个小于等于 \(x\) 的数乘负数 \(y\) 一定不如 \(x\) 乘负数 \(y\) 更优。
学会了用 \(unsigned\ int\) 自然溢出对 \(2^{32}\) 取模,以及不需要 \(\text{&} 4294967295\) !!!
#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
const int N = 2e7+5;
const long long INF = 9223372036854775807LL;
long long a[N], sta[N], top, T, n, l, r, mn, ans;
unsigned int b[N], x, y, z;
int main() {
scanf("%d", &T);
while (T--) {
mn = ans = INF, top = 0;
cin >> n >> l >> r >> x >> y >> z >> b[1] >> b[2];
for (int i = 3; i <= n; ++i) b[i] = b[i-2] * x + b[i-1] * y + z;
for (int i = 1; i <= n; ++i) {
a[i] = b[i] % (r - l + 1) + l;
if (a[i] >= 0) {
if (mn < a[i]) ans = std::min(ans, mn * a[i]);
mn = std::min(mn, a[i]);
continue;
}
mn = std::min(mn, a[i]);
while (top && sta[top] < a[i])
ans = std::min(ans, sta[top] * a[i]), --top;
sta[++top] = a[i];
}
if (ans == INF) puts("IMPOSSIBLE");
else cout << ans << endl;
}
return 0;
}
签到题
标签:ted ima contest can break for red team 数组
原文地址:https://www.cnblogs.com/fly-in-milkyway/p/10094649.html