Day1
T1
按照题意模拟就行了,水。
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define N 100005
int n,m,d,num,now;
char s[N][20];
int len[N],dir[N],pre[N],nxt[N];
int main()
{
freopen("toy.in","r",stdin);
freopen("toy.out","w",stdout);
scanf("%d%d\n",&n,&m);
for (int i=1;i<=n;++i)
{
gets(s[i]);len[i]=strlen(s[i]);
dir[i]=s[i][0]-'0';
for (int j=1;j<len[i]-1;++j) s[i][j]=s[i][j+1];
}
/*
for (int i=1;i<=n;++i)
{
for (int j=1;j<=len[i]-2;++j) putchar(s[i][j]);
putchar('\n');
}
*/
now=1;
for (int i=1;i<=m;++i)
{
scanf("%d%d",&d,&num);
if (!d)//left
{
if (!dir[now])//in
{
now=((now-num-1)%n+n)%n+1;
}
else//out
{
now=(now+num-1)%n+1;
}
}
else//right
{
if (!dir[now])
{
now=(now+num-1)%n+1;
}
else
{
now=((now-num-1)%n+n)%n+1;
}
}
}
for (int i=1;i<=len[now]-2;++i)
putchar(s[now][i]);
putchar('\n');
}
T2
感觉这道题是今年最神的一道题,没想到放到day1T2来考。
考试的时候一个一个部分分打暴力,不过最后只搞出来了60pts。这题的暴力分很良心,不过每一个都不是很好打。。
正解是树上差分。题解的前半部分说得很明白:
也就是说,将每一个路径拆成4个,2条到根的和2条从根出发的。
假设一个观察员在 v ,其时间为
如果要统计有多少个从 u 到根的人可以被
如果要统计有多少个从根到 u 的人可以被