Noip模拟82 2021.10.21
感冒了,考试的时候跟去世了一样,头晕脑胀只会打暴力了,真的头疼
可恶,明天就走了,希望能在后天之前差不多好,不是说感冒一般七天吗?已经五天了,差不多得了。。。。
千万不要考场上还头昏脑胀,$rp++$吧,(希望在链式前向星加边的时候已经加够了。。。。)
T1 魔法
考场上想到了使用队列, 但是后来发现不好判断区间是否合法,于是就打了乱搞做法
然后在$Arbiter$上测居然有$70pts$?
正解就是栈,然后维护栈内的前缀和,表示红球有几个,在栈顶往下数$R+B$个球,如果里面红球个数正好就弹栈记答案
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 inline int read(){ 7 int x=0,f=1; char ch=getchar(); 8 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 9 while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} 10 return x*f; 11 } 12 const int NN=1e5+5; 13 int n,R,B,s[NN],sm[NN],c0,c1; 14 int top,stk[NN]; 15 char ch[NN]; 16 inline void task1(){ 17 if((B==0)||(c1!=0)||(c0%B!=0)) return puts("NO"),void(); 18 int cnt=1,tmp=c0/B;puts("YES");printf("%d\n",tmp); 19 for(int i=1;i<=tmp;i++){for(int j=1;j<=B;j++)printf("%d ",cnt),++cnt;puts("");} 20 } 21 inline void task2(){ 22 if((R==0)||(c0!=0)||(c1%R!=0)) return puts("NO"),void(); 23 int cnt=1,tmp=c1/R;puts("YES");printf("%d\n",tmp); 24 for(int i=1;i<=tmp;i++){for(int j=1;j<=R;j++)printf("%d ",cnt),++cnt;puts("");} 25 } 26 int ans[NN],tot,tag[NN]; 27 namespace WSN{ 28 inline short main(){ 29 freopen("magic.in","r",stdin); 30 freopen("magic.out","w",stdout); 31 n=read();R=read();B=read();scanf("%s",ch+1);n=strlen(ch+1); 32 if((!R)&&(!B)) return puts("NO"),0; 33 for(int i=1;i<=n;i++){ 34 s[i]=(ch[i]=='R'); 35 if(ch[i]=='R') ++c1; else ++c0; 36 } 37 if(R==0)return task1(),0;if(B==0)return task2(),0; 38 if((c0%B!=0)||(c1%R!=0)) return puts("NO"),0; 39 if(c0/B!=c1/R) return puts("NO"),0; 40 int tmp=c0/B; 41 for(int i=1;i<=n;i++){ 42 stk[++top]=i; 43 sm[stk[top]]=sm[stk[top-1]]+s[i]; 44 if(top>=R+B&&sm[stk[top]]-sm[stk[top-(R+B)]]==R){ 45 tag[tot+1]=1; 46 for(int j=i;j>=i-(R+B)+1;j--) 47 ans[++tot]=stk[top--]; 48 } 49 } 50 // cout<<top<<endl; 51 // for(int i=1;i<=top;i++) cout<<stk[i]<<" ";cout<<endl; 52 if(top) return puts("No"),0; 53 puts("YES");printf("%d\n",tmp); 54 for(int i=tot;i;i--){ 55 printf("%d ",ans[i]); 56 if(tag[i]) puts(""); 57 } 58 return 0; 59 } 60 } 61 signed main(){return WSN::main();}
T2 连通性
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #define int long long 6 using namespace std; 7 inline int read(){ 8 int x=0,f=1; char ch=getchar(); 9 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 10 while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} 11 return x*f; 12 } 13 const int NN=105,mod=1e9+7; 14 int T,B[NN][NN],C[NN][NN],pw[NN*100]; 15 int as[6][6]={{0,0,0,0,0,0},{1,1,0,0,0,0},{2,2,2,0,0,0},{8,7,6,5,0,0},{64,51,38,25,15,0},{1024,814,584,356,155,52}}; 16 inline int qmo(int a,int b,int ans=1){ 17 int c=mod;for(;b;b>>=1,a=a*a%c)if(b&1)ans=ans*a%c; 18 return ans; 19 } 20 inline void prework(){ B[1][1]=1; 21 for(int i=2;i<NN;i++){ B[i][1]=B[i-1][i-1]; 22 for(int j=2;j<=i;j++) B[i][j]=(B[i-1][j-1]+B[i][j-1])%mod; 23 } C[0][0]=1; 24 for(int i=1;i<NN;i++){ C[i][0]=C[i][i]=1; 25 for(int j=1;j<i;j++) C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod; 26 } 27 for(int i=0;i<NN*100;i++) pw[i]=qmo(2,i); 28 } 29 int g[NN],f[NN][NN],h[NN][NN]; 30 inline void solve(){ 31 int n=read(),m=read();int rp=n*(n-1)/2; 32 if(!m) return printf("%lld\n",pw[rp]),void(); 33 if(n==m) return printf("%lld\n",B[n][n]),void(); 34 if(n<=5) return printf("%lld\n",as[n][m]),void(); 35 printf("%lld\n",f[n][m]); 36 } 37 inline void calc(){ 38 for(int n=1;n<=100;n++){ 39 int rp=n*(n-1)/2,tmp=0; 40 for(int i=1;i<n;i++) 41 tmp=(tmp+g[i]*pw[(n-i)*(n-i-1)/2]%mod*C[n-1][i-1]%mod)%mod; 42 g[n]=(pw[rp]-tmp+mod)%mod; 43 } 44 for(int i=1;i<=100;i++) for(int j=1;j<=100;j++) 45 h[i][j]=g[j]*qmo((pw[j]-1+mod)%mod,i)%mod*pw[i*(i-1)/2]%mod; 46 f[0][0]=f[1][0]=f[1][1]=1; 47 for(int n=2;n<=100;n++){ 48 f[n][0]=pw[n*(n-1)/2]; 49 for(int m=1;m<=n;m++){ 50 for(int i=1;i<=m;i++){ 51 f[n][m]=(f[n][m]+f[n-i][m-i]*C[m-1][i-1]%mod)%mod; 52 for(int j=1;j<=n-m;j++) 53 f[n][m]=(f[n][m]+f[n-i-j][m-i]*C[m-1][i-1]%mod*C[n-m][j]%mod*h[i][j]%mod)%mod; 54 } 55 } 56 } 57 } 58 namespace WSN{ 59 inline short main(){ 60 // freopen("in.in","r",stdin); 61 freopen("floyd.in","r",stdin),freopen("floyd.out","w",stdout); 62 T=read(); prework(); calc(); 63 while(T--) solve(); 64 return 0; 65 } 66 } 67 signed main(){return WSN::main();}
T3 矩形
非常好的一道题,部分分出的很良心
首先$m=0$直接二的边数次方
$m=n$的是贝尔数第$n$项,
发现机房里同学大多不知道贝尔三角形这种东西
昨晚讲题的时候本身想说一下的帮大家更快的记住贝尔数求法,但是时间太晚了就没说,于是在这里说一下
如果清楚记得斯特林数递推求解方法的,第$n$项加和也可以算贝尔数
贝尔三角形的第$i$行第$i$列就是贝尔数第$i$项
它符合这样一个性质,$B[i][1]=B[i-1][i-1],B[i][j]=B[i-1][j-1]+B[i][j-1]$类似就长这样
1 1 2 2 3 5 5 7 10 15 15 ...
自认为这个记起来比较方便
然后考虑没有约束的部分