AB除了题目有点恶心难理解外。其他都还简单
C题数据太大,想着直接打表,结果方法不对,一直tle;
调了快一个小时后终于pp;
但结果还是TLE了;
看了D题有点思路,但来不及做了;
C. Star sky
所有星星闪烁有一个长度为c+1的周期,也就意味着如果只考虑星星亮度的话就只有c+1种状态,这样每次查询时只要取ti%(c+1)就能找到对应的状态,其实这道题已经变得很简单了。
打好表后就是O(1)操作了
#include<cstdio>
#include<cstdlib>
using namespace std;
int f[15][105][105];
int main()
{
int n,q,c;
scanf("%d %d %d",&n,&q,&c);
c++;
int x,y,s;
for(int i=1;i<=n;i++)
{
scanf("%d %d %d",&x,&y,&s);
for(int t=0;t<c;t++)
f[t][x][y]+=(s+t)%c;
}
for(int t=0;t<c;t++)
for(int i=1;i<=100;i++)
for(int j=1;j<=100;j++)
f[t][i][j]+=f[t][i-1][j]+f[t][i][j-1]-f[t][i-1][j-1];
int t,x1,y1,x2,y2;
for(int i=1;i<=q;i++)
{
scanf("%d %d %d %d %d",&t,&x1,&y1,&x2,&y2);
t%=c;
printf("%d\n",f[t][x2][y2]-f[t][x1-1][y2]-f[t][x2][y1-1]+f[t][x1-1][y1-1]);
}
return 0;
}
D Palindromic characteristics
定义 k 回文串满足:
1. 左右子串相等
2. 左右子串为k-1回文串
用dp[i][j]表示字符串i到j是k回文串;
先初始化dp[i][i]都是1回文串;
然后枚举每一冲情况当s[i]!=s[j]或者i+1<=j-1&&dp[i+1][j-1]==0时;i到j不是回文串,反之跟新数据;
最后求和;
#include <cstdio>
#include <cstring>
using namespace std;
#define N 5010
char s[N];
int dp[N][N],ans[N],n;
int main(){
scanf("%s",s+1);
n=strlen(s+1);
for(int i=1;i<=n;++i)
dp[i][i]=1,ans[1]++;
for(int len=2;len<=n;++len)
for(int i=1;i+len-1<=n;++i)
{
int j=i+len-1;
if(s[i]!=s[j]||i+1<=j-1&&dp[i+1][j-1]==0)
dp[i][j]=0;
else
dp[i][j]=dp[i][i+len/2-1]+1;
if(dp[i][j])
ans[dp[i][j]]++;
}
for(int i=n;i>=1;--i)
ans[i]+=ans[i+1];
for(int i=1;i<=n;++i)
printf("%d ",ans[i]);
return 0;
}