题意:有很多个星星,已知星星的初始闪光值s,和坐标,闪光值的变化为s,s+1...c,0,1,2,...c,0,1,2循环
会有星星坐标重叠的情况,c的范围很小,而变化时间对(c+1)取膜后同余的情况相同,可以先把所有点在不同时间的预处理出来,然后1e9的暴力查询就行了
#include<bits/stdc++.h>
#define eps 1e-9
#define PI 3.141592653589793
#define bs 1000000007
#define bsize 256
#define MEM(a) memset(a,0,sizeof(a))
typedef long long ll;
using namespace std;
int ans[15][200][200];
int n,q;
int main()
{
int t,c,i,j,x,y,s,t1,x1,x2,y1,y2,k;
cin>>n>>q>>c;
for(i=0;i<n;i++)
{
scanf("%d %d %d",&x,&y,&s);
for(t=0;t<=c;t++)
ans[t][x][y]+=(s+t)%(c+1);
}
while(q--)
{
scanf("%d %d %d %d %d",&t1,&x1,&y1,&x2,&y2);
t1%=(c+1);
int now=0;
for(i=x1;i<=x2;i++)
{
for(j=y1;j<=y2;j++)
{
now+=ans[t1][i][j];
}
}
printf("%d\n",now);
}
return 0;
}
D. Palindromic characteristics
D题就是暴力。。。。没想到太好的暴力思路,好气。。。不专心写。。。。有点像区间dp。。。
会发现 k-palindrome无论k是多少都一定是一个回文串,当一个串是回文串时,只要他左半部分也是回文串,右半部分一定也是和左半部分一样的回文串
字符串长度并不是很长,先把所有的回文串都标记出来,然后类似区间dp的搞一搞就可以了
#include<bits/stdc++.h>
#define eps 1e-9
#define PI 3.141592653589793
#define bs 1000000007
#define bsize 256
#define MEM(a) memset(a,0,sizeof(a))
typedef long long ll;
using namespace std;
char ch[5005];
int dp1[5005][5005],dp[5005][5005],ans[5005];
int main()
{
cin>>ch;
int i,j,len=strlen(ch);
for(i=0;i<len;i++)
dp1[i][i]=dp[i][i]=1;
for(i=1;i<len;i++)
{
for(j=0;j+i<len;j++)
{
int k=j+i;
if(ch[j]==ch[k]&&(i==1||dp1[j+1][k-1]))
{
dp[j][k]=dp1[j][k]=1;
}
}
}
for(i=1;i<len;i++)
{
for(j=0;j+i<len;j++)
{
int k=j+i;
// cout<<j<<" "<<k<<" "<<dp1[j][k]<<endl;
if(dp1[j][k])
{
int l=(i+1)/2;
// cout<<l<<endl;
if(dp1[j][j+l-1])
{
dp[j][k]=dp[j][j+l-1]+1;
}
}
}
}
for(i=0;i<len;i++)
{
for(j=i;j<len;j++)
ans[dp[i][j]]++;
}
for(i=len;i>=2;i--)
{
ans[i-1]+=ans[i];
}
for(i=1;i<=len;i++)
cout<<ans[i]<<" ";
cout<<endl;
return 0;
}
错过了最佳的上分机会。。。。