E - Polycarp and Snakes |
题意:
画蛇,蛇宽只能为1,长可若干,字母大是蛇可以把字母小的蛇覆盖
从最多a画到z
给一个图,问能否被蛇填充完
解析:
模拟
字母小的不一定在图上出现,但可以被最大的蛇压在上面
(直接输出最大的蛇,最大的蛇已经判断是必有的,如果只是输出比他大1的蛇,可能都没有)
字母大是蛇可以把字母小的蛇覆盖,但不能被反向覆盖
对所以蛇判断是否宽为1,然后路径上判断是否能被压,如果反而压图上的字母,呢么就是NO
ac:
#include<bits/stdc++.h>
#define MAXN 2005
#define ll long long
using namespace std;
struct node
{
int x,y;
};
char mp[MAXN][MAXN];
vector<node> gg[27];
int aa[26],bb[26],cc[26],dd[26];
int vis[26];
int main()
{
int n,m,t;
scanf("%d",&t);
while(t--)
{
memset(aa,0,sizeof(aa));
memset(bb,0,sizeof(bb));
memset(cc,0,sizeof(cc));
memset(dd,0,sizeof(dd));
memset(vis,0,sizeof(vis));
for(int i=0;i<27;i++)
gg[i].clear();
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%s",mp[i]+1);
int maxs=-1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(mp[i][j]!='.')
{
gg[mp[i][j]-'a'].push_back({i,j});
maxs=max(mp[i][j]-'a',maxs);
}
}
}
int flag=0;
for(int i=0;i<=maxs;i++)
{
int sz=gg[i].size();
if(sz==0)
continue;
int u=9999,d=-1,l=9999,r=-1;
for(int j=0;j<sz;j++)
{
u=min(gg[i][j].x,u);
d=max(gg[i][j].x,d);
l=min(gg[i][j].y,l);
r=max(gg[i][j].y,r);
}
if(u!=d&&l!=r)
{
flag=1;
break;
}
if(u==d)
{
for(int j=l;j<=r;j++)
{
if(mp[u][j]-'a'<i)
{
flag=1;
break;
}
}
}
else{
for(int j=u;j<=d;j++)
{
if(mp[j][l]-'a'<i)
{
flag=1;
break;
}
}
}
if(flag==1)
{
break;
}
else{
vis[i]=1;
aa[i]=u;
bb[i]=l;
cc[i]=d;
dd[i]=r;
}
}
if(flag==1&&maxs!=-1)
printf("NO\n");
else{
printf("YES\n");
printf("%d\n",maxs+1);
for(int i=0;i<=maxs;i++)
{
if(vis[i]==0)//注意要不能直接输出下一个,因为下一个也可能没出现,直接输出最大,最大的必有
//wa1 printf("%d %d %d %d\n",aa[i+1],bb[i+1],cc[i+1],dd[i+1]);
printf("%d %d %d %d\n",aa[maxs],bb[maxs],cc[maxs],dd[maxs]);
else
printf("%d %d %d %d\n",aa[i],bb[i],cc[i],dd[i]);
}
}
}
return 0;
}
D2. Submarine in the Rybinsk Sea (hard edition)
解析:
计算每个数字中的每位数所产生的贡献
y是该位的值,vis[j]是长为j的数字的个数,sz是当前位数,dd是保存1~1e18,j是遍历1~11
1.它在左边:((y*vis[j])%mod*dd[sz+min(j,sz)])%mod;
2.它在右边:((y*vis[j-1])%mod*dd[sz+min(j,sz)-1])%mod;
ac:
#include<bits/stdc++.h>
#define lowbit(x) (x)&(-x)
#define ll long long
#define pb push_back
#define MAXN 100005
#define mod 998244353
using namespace std;
ll vis[22];
ll a[MAXN];
ll dd[22];
ll b[MAXN];
ll getc(ll x)
{
ll k=0;
while(x)
{
k++;
x=x/10;
}
return k;
}
void init()
{
ll sum=1;
for(ll i=1;i<=21;i++)
dd[i]=sum,sum=(sum*10)%mod;
}
int main()
{
init();
ll n;
scanf("%lld",&n);
for(ll i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
vis[getc(a[i])]++;
}
ll sum=0;
for(ll i=1;i<=n;i++)
{
ll x=a[i],sz=0;
while(x)
{
sz++;
ll y=x%10;
for(ll j=1;j<=11;j++)
{
ll jj=((y*vis[j])%mod*dd[sz+min(j,sz)])%mod;
jj=jj+((y*vis[j-1])%mod*dd[sz+min(j,sz)-1])%mod;
sum=(sum+jj)%mod;
}
x=x/10;
}
}
printf("%lld\n",sum%mod);
return 0;
}