A
先查有几行,然后把一行全部消掉
然后查剩下哪些地方还有,把一列消掉
#include<bits/stdc++.h>
using namespace std;
namespace red{
inline int read()
{
int x=0;char ch,f=1;
for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
if(ch=='-') f=0,ch=getchar();
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return f?x:-x;
}
char s[9][9];
int sum;
inline void main()
{
for(int i=1;i<=8;++i) scanf("%s",s[i]+1);
for(int i=1;i<=8;++i)
{
if(s[i][1]=='B')
{
bool flag=0;
for(int j=1;j<=8;++j)
{
flag|=(s[i][j]=='W');
}
if(!flag)
{
++sum;
for(int j=1;j<=8;++j)
{
s[i][j]='W';
}
}
}
}
for(int i=1;i<=8;++i)
{
for(int j=1;j<=8;++j)
{
if(s[i][j]=='B')
{
++sum;
for(int k=i;k<=8;++k)
{
s[k][j]='W';
}
}
}
}
cout<<sum<<endl;
}
}
signed main()
{
red::main();
return 0;
}
B
直接模拟
#include<bits/stdc++.h>
using namespace std;
namespace red{
inline int read()
{
int x=0;char ch,f=1;
for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
if(ch=='-') f=0,ch=getchar();
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return f?x:-x;
}
const int N=1e5+10;
int n,m,id;
int a[N],b[N];
int l[N],r[N];
char s[N];
inline void alloc(int x)
{
int pre=1;
for(int i=1;i<=m;++i)
{
if(b[i]) pre=i+1;
else
{
if(i-pre+1>=x)
{
++id;
for(int j=pre;j<=i;++j) b[j]=id;
l[id]=pre,r[id]=i;
printf("%d
",id);
return;
}
}
}
puts("NULL");
}
inline void erase(int x)
{
if(x<=0||x>id)
{
puts("ILLEGAL_ERASE_ARGUMENT");
return;
}
bool flag=0;
for(int i=1;i<=m;++i)
{
if(b[i]==x)
{
flag=1;
b[i]=0;
}
}
if(!flag) puts("ILLEGAL_ERASE_ARGUMENT");
}
inline void get_col(int x,int y,int col)
{
for(int i=x;i<=y;++i) b[i]=col;
if(col) l[col]=x,r[col]=y;
}
inline void defragment()
{
int pre=1;
for(int i=1;i<=m;++i)
{
if(b[i])
{
if(pre==l[b[i]])
{
pre=r[b[i]]+1;
i=r[b[i]];
}
else
{
int col=b[i],len=r[col]-l[col];
get_col(l[col],r[col],0);
get_col(pre,pre+len,col);
i=r[col];
pre=r[col]+1;
}
}
}
}
inline void main()
{
n=read(),m=read();
for(int i=1;i<=n;++i)
{
scanf("%s",s);
if(s[0]=='a') alloc(read());
if(s[0]=='e') erase(read());
if(s[0]=='d') defragment();
}
}
}
signed main()
{
red::main();
return 0;
}
C
裸(exgcd)……
#include<bits/stdc++.h>
using namespace std;
namespace red{
#define int long long
inline int read()
{
int x=0;char ch,f=1;
for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
if(ch=='-') f=0,ch=getchar();
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return f?x:-x;
}
int a,b,c;
int x,y,g;
inline void exgcd(int &x,int &y,int &g,int a,int b)
{
if(!b)
{
x=1,y=0,g=a;
return;
}
exgcd(y,x,g,b,a%b);
y-=a/b*x;
}
inline void main()
{
a=read(),b=read(),c=read();
exgcd(x,y,g,a,b);
if(-c%g)
{
puts("-1");
return;
}
x*=-c/g,y*=-c/g;
cout<<x<<' '<<y<<endl;
}
}
signed main()
{
red::main();
return 0;
}
D
先跑个马拉车,然后求出哪些位置回文串是从开头开始的
然后(f[i]=f[(1+i)>>1]+1),(ans=sumlimits_{i=1}^{n}f[i])
#include<bits/stdc++.h>
using namespace std;
namespace red{
const int N=5e6+10;
int n=1,mid,r,ret;
char s[N<<1],t[N<<1];
int p[N<<1],f[N<<1];
inline void read()
{
scanf("%s",t+1);
s[0]='~';s[1]='#';
int len=strlen(t+1);
for(int i=1;i<=len;++i)
{
s[++n]=t[i];
s[++n]='#';
}
}
inline void main()
{
read();
for(int i=1;i<=(n>>1)+1;++i)
{
if(i<r) p[i]=min(r-i,p[(mid<<1)-i]);
else p[i]=1;
while(s[i-p[i]]==s[i+p[i]]) ++p[i];
if(i+p[i]>r) r=i+p[i],mid=i;
}
for(int i=2;i<=(n>>1)+1;++i)
{
if(p[i]==i) f[i]=f[(1+i)>>1]+1;
ret+=f[i];
}
printf("%d
",ret);
}
}
signed main()
{
red::main();
return 0;
}
E
黑色模拟题,快滚吧
一场(cf)五道题三道模拟¿