2017 ACM/ICPC Asia Regional Qingdao Online 记录
题目链接 Qingdao
Problem C
AC自动机还不会,暂时暴力水过。
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i) #define dec(i, a, b) for (int i(a); i >= (b); --i) const int N = 1e5 + 10; string s[N]; int T; int n; int ans; int main(){ std::ios::sync_with_stdio(false); cin >> T; while (T--){ cin >> n; int id; int maxv = 0; for(int i = 1; i <= n; i++) { cin >> s[i]; if (s[i].size() > maxv) { maxv = s[i].size(); id = i; } } ans = 1; rep(i, 1, n) if (s[id].find(s[i]) == -1){ ans = 0; break;} if (ans) cout << s[id] << endl; else cout << "No" << endl; } return 0; }
Problem J
考虑直接用队列保存待判断的元素(出队or not)
然后直接用链表模拟就可以了。
为什么比赛的时候我不会做呢
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i) #define dec(i, a, b) for (int i(a); i >= (b); --i) #define MP make_pair #define fi first #define se second typedef long long LL; const int N = 1e5 + 10; struct node{ int x, l, r; } a[N]; int T; int n, ans; queue <int> q; int main(){ scanf("%d", &T); while (T--){ scanf("%d", &n); rep(i, 1, n){ a[i].l = i - 1; scanf("%d", &a[i].x); a[i].r = i + 1; } a[0].r = 1; a[n + 1].l = n; a[0].x = 0; a[n + 1].x = 1e8; while (!q.empty()) q.pop(); rep(i, 1, n) q.push(i); while (!q.empty()){ int now = q.front(); q.pop(); int suc = a[now].r; int pre = a[now].l; if (a[now].x > a[suc].x){ q.push(pre); a[pre].r = a[suc].r; a[a[suc].r].l = pre; a[suc].l = pre; } } ans = 0; int now = a[0].r; while (now <= n){ ++ans; now = a[now].r; } printf("%d\n", ans); now = a[0].r; while (now <= n){ printf("%d ", a[now].x); now = a[now].r; } putchar(10); } return 0; }
Problem K
签到
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i) #define dec(i, a, b) for (int i(a); i >= (b); --i) #define MP make_pair #define fi first #define se second typedef long long LL; LL a[1001000], b[1001000]; LL n; int T; int main(){ for (LL i = 1; i <= 1000000; ++i) a[i] = i * i * i; rep(i, 1, 999999) b[i] = a[i + 1] - a[i]; scanf("%d", &T); while (T--){ scanf("%lld", &n); bool fl = false; rep(i, 1, 999999) if (b[i] == n){ fl = true; break; } if (fl) puts("YES"); else puts("NO"); } return 0; }