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;
}

浙公网安备 33010602011771号