Loading

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();}
View Code

 

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();}
View Code


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    ...

自认为这个记起来比较方便

然后考虑没有约束的部分

 

posted @ 2021-10-22 08:49  雪域亡魂  阅读(63)  评论(0编辑  收藏  举报