ICPC 2019-2020 North-Western Russia Regional Contest
文章目录
A - Accurate Movement
签到
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int const MAXN = 2e5 + 10;
int n, m, T;
int main() {
int a, b, c;
cin >> a >> b >> c;
if (c == b)
cout << 1;
else if ((c - b) % (b - a))
cout << 2 * ((c - b) / (b - a)) + 3;
else
cout << 2 * ((c - b) / (b - a)) + 1;
return 0;
}
B - Bad Treap
题意:
给出笛卡尔树的定义,现在要求给出 n 个点对 ( x , sin( x ) ),使得笛卡尔树的高度尽可能大
题解:
题意就是要找到一个长度为n的递增序列,且sin(ai)也是递增的
考虑到如果sinx极小,那么sin2x sin3x…一直到sinnx都是很小的,所以只需要找到一个最最最接近于0的sin值,然后输出这个点的倍数即可,因为不能超过2^32,所以向左偏1e9
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
typedef long long LL;
struct node {
double sin;
int x;
} a[N];
bool cmp(node a, node b) {
return a.sin < b.sin; }
int main() {
int cnt = 0;
for (int i = 1; i <= 1e5; i++) {
if(sin(i)>0)
a[cnt].x = i, a[cnt++].sin = sin(i);
}
sort(a, a + cnt, cmp);
int n;
cin >> n;
for (int i = 0; i < n;i++){
cout << (LL)a[0].x * i -100000000<< endl;
} return 0;
}
E - Equidistant
题意: 给出n个点的树,然后上面有m个特殊点,要求求出一个点,使得这个点到所有的m个点的距离都相同
题解: bfs,先将每个特殊点都入队,然后每次到一个数,都看是否有别的点先到达,只有同时到达或者第一次到达才把这个点入队,还要标记一下每个点同时被多少点到达,最后看是否存在一个点同时被m个特殊点到达即可
#include <bits/stdc++.h>
#define int long long
using namespace std;
inline int read() {
int s = 0, w = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-') w = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar();
return s * w;
}
int const MAXN = 3e5 + 10, MAXM = MAXN * 3;
int n, m, T, vis[MAXN], dis[MAXN];
int idx, e[MAXM], h[MAXN], ne[MAXM], num[MAXN], inque[MAXN];
queue<int> q