zoukankan      html  css  js  c++  java
  • [考试反思]1004csp-s模拟测试59:惊醒

    一句话:我看错考试时间了,我以为11:30结束,T2T3暴力没来得及交。

    为什么考试的时间忽然变了啊。。。没转过来

    一定要看清考试的起止时间!

    虽说T2T3连爆搜都没打,只打特殊性质只有32分。爆搜分还挺高的。

    当特殊性质不好扩展时,记得把爆搜打上。

    本来是想T1先送上暴力,然后尝试肝T2,然后是T3暴力,有时间再回来优化T1。

    但是整场考试时间是崩的,也没回T1。。。然而T2T3

    注意分数与时间的权衡。

    T1:Reverse

    BFS。

    二营长打法极其简单。因为是BFS所以一个点不会被多次更新。

    那么一次更新了一个区间内的全部奇数或偶数,下次遇到的时候直接跳过就行了。

    用链表实现,代码特别特别特别简单。常数也特别小,复杂度O(n),相较于线段树优化建边还少个log。

     1 #include<iostream>
     2 using namespace std;
     3 int dt[100005],q[100005],R[100005],n,m,k,S,x;
     4 int main(){
     5     cin>>n>>k>>m>>S;
     6     for(int i=1;i<=n;++i)dt[i]=n+1,R[i]=i+2;
     7     while(m--)cin>>x,dt[x]=-1;
     8     dt[S]=0;q[1]=S;
     9     for(int h=1,t=1;h<=t;++h){
    10         int st=max(1,q[h]-k+1),l=st+st+k-1-q[h];st=min(n-k+1,q[h]);int r=st+st+k-1-q[h];
    11         for(int i=l;i<=r;i=R[i])if(dt[i]>dt[q[h]]+1)dt[i]=dt[q[h]]+1,q[++t]=i;
    12         for(int i=l;i<=r;){int rr=R[i];R[i]=max(R[i],r);i=rr;}
    13     }
    14     for(int i=1;i<=n;++i)cout<<(dt[i]>n?-1:dt[i])<<" ";cout<<endl;
    15 }
    View Code

    T2:Silhouette

    神仙数学题,考场上死在容斥上了。

    无解的判定就是横纵最大值不同。

    不然的话我们把读入序列排序,对答案没有影响。

    从大到小扩展,扫每一种权值。

    然后这种权值占据的是一个矩形或一个L形,并且要求这个区域内每行每列都恰好出现了这个值。

    容斥,f[i]表示一共a行中至少i行不满足条件。

    ABab表示的是一个A×B的矩形挖掉一个(A-a)×(B-b)的小矩形之后得到的L形,当前处理的数字是S。

    $f[i]=sumlimits_{i=0}^{a}C_a^i imes (S^i imes ( (S+1)^{A-i} - S^{A-i} ) )^b imes ( S^i imes (S+1)^{a-i} )^{B-b}$

    这一类“至少”的容斥也没少做,容斥系数是$(-1)^i$

    式子的含义是先选出是哪i行不合条件,$C_a^i$

    接下来在A×b的矩阵里选合法的方案,

    考虑每一列,其中这不合法的i行不出现数字S,所以是[0,S-1]里面选,$S^i$

    然后剩下的行里面需要出现数字S,那就是瞎选的方案减去没出现S的方案,即$(    (S+1)^{A-i} - S^{A-i} )$

    每一列都是这样,所以要b次方

    接下来需要计算那一个a×(B-b)的矩形,被限制不合法的i行还是不能放$S^i$,剩下的随便$(S+1)^{a-i}$

    然后每一列都这样,要B-b次方

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<algorithm>
     4 using namespace std;
     5 #define mod 1000000007
     6 #define int long long
     7 int pw(int b,int t,int a=1){for(;t;t>>=1,b=b*b%mod)if(t&1)a=a*b%mod;return a;}
     8 bool com(int a,int b){return a>b;}
     9 int fac[100005],x[100005],n,y[100005],ans=1,invv[100005],inv[100005];
    10 int C(int b,int t){return fac[b]*inv[t]%mod*inv[b-t]%mod;}
    11 int cal(int A,int B,int a,int b,int s){
    12     int tot=0;
    13     for(int i=0;i<=a;++i)tot=(tot+pw(mod-1,i)*C(a,i)%mod*pw(s,B*i)%mod*pw(pw(s+1,A-i)-pw(s,A-i)+mod,b)%mod*pw(pw(s+1,a-i),B-b))%mod;
    14     return tot%mod+mod;
    15 }
    16 main(){
    17     fac[0]=inv[0]=inv[1]=fac[1]=invv[1]=1;
    18     for(int i=2;i<=100000;++i)fac[i]=fac[i-1]*i%mod,invv[i]=mod-mod/i*invv[mod%i]%mod,inv[i]=inv[i-1]*invv[i]%mod;
    19     scanf("%lld",&n);
    20     for(int i=1;i<=n;++i)scanf("%lld",&x[i]);
    21     for(int i=1;i<=n;++i)scanf("%lld",&y[i]);
    22     sort(x+1,x+1+n,com);sort(y+1,y+1+n,com);
    23     int p1=1,p2=1;
    24     while(p1<=n||p2<=n){
    25         int num=max(x[p1],y[p2]),cnt1=0,cnt2=0;
    26         while(p1<=n&&x[p1]==num)p1++,cnt1++;
    27         while(p2<=n&&y[p2]==num)p2++,cnt2++;
    28         ans=ans*cal(p1-1,p2-1,cnt1,cnt2,num)%mod;
    29     }
    30     printf("%lld
    ",ans);
    31 }
    View Code

    Tips:感谢王hecao更正。

    T3:Seat

    skyh倾情压行注释。

  • 相关阅读:
    luogu P1641 [SCOI2010]生成字符串
    luogu P2662 牛场围栏
    luogu P3193 [HNOI2008]GT考试
    luogu P3293 [SCOI2016]美味
    luogu P2048 [NOI2010]超级钢琴
    Wannafly挑战赛21 E 未来城市规划
    luogu P2770 航空路线问题
    luogu P4082 [USACO17DEC]Push a Box
    运维交流平台
    elk之[logstash-input-file]插件使用详解
  • 原文地址:https://www.cnblogs.com/hzoi-DeepinC/p/11622585.html
Copyright © 2011-2022 走看看