\(A\)
似乎并不难啊然而还是没想出来……
首先我们发现对于一个数\(k\),它能第一个走到当且仅当对于每一个\(i<k\)满足\(x_i\geq 2i-1\),这样我们就可以把所有的\(i\)移到\(2i-1\)然后让\(k\)直接一路过去了。而如果对于每个\(k\)都有这个性质,答案就是\(n!\)
所以从左往右扫,记录当前栈中的元素个数,设当前的\(k\)在栈中的第\(i\)个位置,且\(k\)不满足\(x_k\geq 2i-1\),那么我们必须把前\(i\)个数中移出至少一个才能使剩下的数满足,所以乘上一个系数就好了。最后栈中是可以任意顺序的
//quming
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
const int P=1e9+7;
inline void upd(R int &x,R int y){(x+=y)>=P?x-=P:0;}
inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int ksm(R int x,R int y){
R int res=1;
for(;y;y>>=1,x=mul(x,x))(y&1)?res=mul(res,x):0;
return res;
}
const int N=2e5+5;
int x[N],n,res,cnt;
int main(){
scanf("%d",&n),res=1;
fp(i,1,n)scanf("%d",&x[i]);
fp(i,1,n){
if(x[i]<(cnt<<1|1))res=mul(res,cnt+1);
else ++cnt;
}
fp(i,1,cnt)res=mul(res,i);
printf("%d\n",res);
return 0;
}
\(B\)
首先如果整个网格全是白色显然\(gg\)
对于所有不是整列都黑的列,我们肯定得把它们变得整列都黑。而且不难发现,若是没有整行都黑的一行,我们怎么操作都不可能使得一列变黑。所以答案就是使得某一行变黑的最小次数\(+\)不是整列都黑的列数
那么对于一行使其全部变黑的最小次数是多少呢?设这一行为\(i\),其中有\(x\)个白色格子,那么如果第\(i\)列有黑色格子,我们显然可以通过\(x\)次操作使得这一行全部变黑,否则的话就需要\(x+1\)次,多出来的那一次就是为了让第\(i\)列有一个黑色格子
//quming
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
const int N=505;
char s[N][N];int vis[N],mm[N],n,res,cnt,fl;
int main(){
scanf("%d",&n);
fp(i,1,n)scanf("%s",s[i]+1);
fp(i,1,n)fp(j,1,n)if(s[i][j]=='#')fl=1,vis[j]=1,++mm[j];
if(!fl)return puts("-1"),0;
fp(i,1,n)mm[i]=(mm[i]==n?1:0),cnt+=mm[i];
res=233333;
fp(i,1,n){
R int c=0;
fp(j,1,n)c+=s[i][j]=='.';
cmin(res,n-cnt+c+(vis[i]^1));
}
printf("%d\n",res);
return 0;
}