T1交完之后直接没看,然后发觉WA了qwq。
传统艺能最后一题不会。
看了题解也没会(
C题:
sort一下,判一判。cnt和nval要记得赋初始值
#include<bits/stdc++.h>
using namespace std;
int a[123012];
int n;
int main() {
scanf("%d", &n);
for(int i=1;i<=n;++i)
scanf("%d", &a[i]);
sort(a+1, a+n+1);
int nval = 0, cnt = 0;
int ans = 0;
for(int i=1;i<=n;++i) {
if(a[i] != a[i-1]) {
if(cnt > nval)
ans += cnt - nval;
else if(cnt < nval)
ans += cnt;
nval = a[i], cnt = 1;
}
else
cnt++;
}
if(cnt > nval)
ans += cnt - nval;
else if(cnt < nval)
ans += cnt;
cout<<ans;
return 0;
}
D题:
两个方向分别DP一下就行
为了防止TLE,摸了个bitset出来
#include<bits/stdc++.h>
using namespace std;
char s[9010];
int n;
int tx, ty;
int num[9010], m;
bitset<17000>x, y;
int main() {
scanf("%s", s+1);
n = strlen(s + 1);
scanf("%d%d", &tx, &ty);
for(int i=1;i<=n;++i) {
if(s[i] == 'T') {
num[++m] = -123123;
}
else {
if(s[i-1] == 'F')
num[m]++;
else
num[++m]++;
}
}
if(num[1] > 0) {
x[8500 + num[1]] = 1;
y[8500] = 1;
int ndir = 1;
for(int i=2;i<=m;++i) {
if(num[i] < 0)
ndir ^= 1;
else {
if(ndir == 1)
x = (x << num[i]) | (x >> num[i]);
else
y = (y << num[i]) | (y >> num[i]);
}
}
}
else {
int ndir = 1;
x[8500] = 1;
y[8500] = 1;
for(int i=1;i<=m;++i) {
if(num[i] < 0)
ndir ^= 1;
else {
if(ndir == 1)
x = (x << num[i]) | (x >> num[i]);
else
y = (y << num[i]) | (y >> num[i]);
}
}
}
if(x[tx + 8500] == 1 && y[ty + 8500] == 1)
printf("Yes");
else
printf("No");
return 0;
}
E:
首先肯定得拉个Trie出来。
假装我们真的有个装了所有长度
L
L
L以内的01串的Trie。上面有些点里头有串,称其为关键点,显然一个关键点会把这个点的子树以及他到根的路径标记为不可用。
手玩一下发现,对于一个点,如果他底下没有关键点,且他头顶上没有关键点,那这棵子树就可用了。
搞个Trie,不难发现可用点满足“他父亲的左右儿子只有一个”。
根据上面那个条件搞出所有的可用的子树。
枚举一下再一个高度为h的子树里面选个什么点,然后把剩下的xor起来,就是他的sg函数。
手画了一下高度4以内的树,发觉这SG长得像lowbit。
然后打了个表,20以内的树,发觉他好像真的是个lowbit。
然后就过了。
#include<bits/stdc++.h>
using namespace std;
int fa[200010], rot = 1, cnt = 1;
int ls[200100], rs[200010];
int leng[200010];
int n;
long long L;
char ch[200010];
void insert(char *s) {
int len = strlen(s + 1), nloc = 1;
for(int i=1;i<=len;++i) {
if(s[i] == '0') {
if(!ls[nloc])
ls[nloc] = ++cnt, leng[cnt] = leng[nloc] + 1;
nloc = ls[nloc];
}
else {
if(!rs[nloc])
rs[nloc] = ++cnt, leng[cnt] = leng[nloc] + 1;
nloc = rs[nloc];
}
}
}
int sth[200010], scnt;
#define low(k) ((k) & (-k))
int main() {
cin>>n>>L;
for(int i=1;i<=n;++i) {
scanf("%s", ch+1);
insert(ch);
}
for(int i=1;i<=cnt;++i) {
if(ls[i] * rs[i] == 0 && ls[i] + rs[i] != 0) {
sth[++scnt] = leng[i] + 1;
}
}
long long tot = 0;
for(int i=1;i<=scnt;++i) {
long long actlen = L - sth[i] + 1;
tot ^= low(actlen);
}
printf(tot == 0 ? "Bob" : "Alice");
return 0;
}
F日常不会,坑这儿。