傳送門c++
什麼玩意兒……優化
const int N=105; char s[N];int n,f1,f2; int main(){ scanf("%s",s+1),n=strlen(s+1); fp(i,1,n)if(s[i]=='C')f1=1; else if(f1&&s[i]=='F')f2=1; puts(f2?"Yes":"No"); return 0; }
什麼玩意兒……spa
const int N=105; int a[N],n,k,mx; int main(){ scanf("%d%d",&k,&n); fp(i,1,n)scanf("%d",&a[i]),cmax(mx,a[i]); printf("%d\n",(mx<<1)<=k?0:mx-(k-mx)-1); return 0; }
對於全部前綴後綴最大值變化的位置,它們的值是必定的,判斷這樣的取值是否合法,若是合法的話,對於全部沒有肯定的位置取合法的就能夠了code
//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=5e5+5; int a[N],b[N],c[N],n,res=1; inline int min(R int x,R int y){return x<y?x:y;} int main(){ scanf("%d",&n); fp(i,1,n)scanf("%d",&b[i]); fp(i,1,n)scanf("%d",&c[i]); fp(i,1,n)if(b[i]!=b[i-1])a[i]=b[i]; fd(i,n,1)if(c[i]!=c[i+1])a[i]=c[i]; for(R int i=1,mx=0;i<=n;++i){ cmax(mx,a[i]); if(mx!=b[i])return puts("0"),0; } for(R int i=n,mx=0;i;--i){ cmax(mx,a[i]); if(mx!=c[i])return puts("0"),0; } fp(i,1,n)if(!a[i])res=mul(res,min(b[i],c[i])); printf("%d\n",res); return 0; }
首先發現每兩列之間是互相獨立的,也就是說若是咱們算出每相鄰兩列的答案,最後加起來就是最終的答案了,證實就不寫了get
而後問題轉化爲計算兩列之間的答案,方便起見沿對角線翻轉一下,記\(f[i][j]\)表示前一行還剩下\(i\)的前綴,後一行還剩下\(j\)的前綴,最小代價爲多少,最後\(f[m][m]\)就是答案it
\(f\)的轉移顯然,惟一的問題在於計算\(g[i][j]\)表示前一行\(i\)的前綴和後一行\(j\)的前綴,這種狀態下有多少是重合的,暴力計算\(O(n^3)\),前綴和優化一下就能夠\(O(n^2)\)了class
最後總複雜度\(O(n^3)\),具體細節能夠看代碼test
//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=305; char mp[N][N],s[N][N];int f[N][N],n,m,res; int calc(R int id){ fp(i,1,m)fp(j,1,m)f[i][j]=(s[id][i]==s[id+1][j]); fp(i,1,m)fp(j,1,m)f[i][j]+=f[i-1][j-1]; fp(i,1,m)fp(j,1,m)f[i][j]+=min(f[i-1][j],f[i][j-1]); return f[m][m]; } int main(){ // freopen("testdata.in","r",stdin); scanf("%d%d",&n,&m); fp(i,1,n)scanf("%s",mp[i]+1); fp(i,1,n)fp(j,1,m)s[j][i]=mp[i][j]; swap(n,m); fp(i,1,n-1)res+=calc(i); printf("%d\n",res); return 0; }
根據康託展開,一個排列\(p_i\)在全部排列中的排名爲\(\sum\limits_{i=1}^na_i(n-i)!\),其中\(a_i\)表示知足\(j>i\)且\(p_j<p_i\)的\(j\)的個數,即對於一個逆序對\((i,j)\),對答案的貢獻是\((n-i)!\)im
那麼咱們對於\(i,j\)爲已知數和未知數的狀況分別考慮就行了,具體細節看代碼di
//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=5e5+5; int c[N],s[N],suf[N],a[N],vis[N],fac[N],cnt,m,n,res,sum; inline void chg(R int x){for(;x<=n;x+=x&-x)++c[x];} inline int query(R int x){R int res=0;for(;x;x-=x&-x)res+=c[x];return res;} int main(){ // freopen("testdata.in","r",stdin); scanf("%d",&n),m=n; fp(i,1,n){ scanf("%d",&a[i]); if(a[i])++s[a[i]],--m; } fp(i,1,n)suf[i]=s[i]=1-s[i],s[i]+=s[i-1]; fd(i,n,1)suf[i]+=suf[i+1]; fac[0]=1;fp(i,1,n)fac[i]=mul(fac[i-1],i); fd(i,n,1)if(!a[i])++cnt; else{ sum=mul(query(a[i]-1),fac[m]); if(cnt)upd(sum,1ll*cnt*s[a[i]]%P*fac[m-1]%P); upd(res,mul(sum,fac[n-i])); chg(a[i]); } cnt=sum=0; fp(i,1,n)if(!a[i])upd(sum,fac[n-i]),++cnt; else if(cnt)upd(res,1ll*sum*suf[a[i]]%P*fac[m-1]%P); sum=(1ll*m*(m-1)>>1)%P,cnt=0; if(m>=2)fp(i,1,n)if(!a[i])++cnt,upd(res,1ll*sum*(m-cnt)%P*fac[m-2]%P*fac[n-i]%P); upd(res,fac[m]); printf("%d\n",res); return 0; }