zoukankan      html  css  js  c++  java
  • [考试反思]1016csp-s模拟测试76:自知

    要打对拍。

    要打对拍。

    要打对拍。

    要手模数据。

    要手模数据。

    要手模数据。

    不要相信样例。

    不要相信样例。

    不要相信样例。

    不要飘。

    不要飘。

    不要飘。

    跟skyh学坏了。最近不打对拍。

    连续十几次考试都没打对拍,都没有出锅。

    但是这次就崩了。

    飘了。最近是有点飘。

    也算是敲响了警钟吧。

    样例都是精心构造的,有的是故意让你理解错的,有的是故意让你打错的。

    我的代码除了样例基本都输出No,随便手模了一组样例就挂了。

    侥幸拿到了30分。虽然也没爆零,但是也足以长记性了吧。

    其实是一个大小于号打反了,判断条件写错了。

    要对码下的每一个字负责。

    上一轮11场以rank5告终了:2330/2143/2002/1924/1895/1890/1863/1853/1796/1731/1646/1630/1619/1590/1575|机房分数线

    (和谐了一句话),跟前面的三个大神和一个大脸差距极大。。。

    但是上一轮总体来说,尤其到后半,还是比较稳的。

    可是这一轮一开始就是严重爆炸,直接150分差敬上。。。

    长记性吧,别再犯了。

    T1:序列

    简单的构造题。根据A*B=N的特殊数据就可以造了。

    注意大小于号不要写反。

     1 #include<cstdio>
     2 int main(){
     3     int t,n,a,b;scanf("%d",&t);
     4     while(t--){
     5         scanf("%d%d%d",&n,&a,&b);
     6         if(a+b-1>n||1ll*a*b<n){puts("No");continue;};
     7         puts("Yes");n-=a;b--;
     8         for(int i=1;i<=a;++i)printf("%d ",n+i);
     9         if(!b){puts("");continue;}
    10         int sz=n/b+1,tms=n%b,sz2=n/b,tms2=b-n%b;
    11         while(tms--){n-=sz;for(int i=1;i<=sz;++i)printf("%d ",n+i);}
    12         while(tms2--){n-=sz2;for(int i=1;i<=sz2;++i)printf("%d ",n+i);}
    13         puts("");
    14     }
    15 }
    444B

    T2:购物

    算是半个结论,但是稍显然。排序后考虑每个物品的一半和前面所有物品的sum的关系,看有没有断档即可。

     1 #include<cstdio>
     2 #include<algorithm>
     3 int n;long long a[100005],sum,l[100005],r[100005],ans;
     4 int main(){
     5     scanf("%d",&n);
     6     for(int i=1;i<=n;++i)scanf("%lld",&a[i]);
     7     std::sort(a+1,a+1+n);
     8     for(int i=1;i<=n;++i)
     9         if((a[i]+1>>1)>r[i-1])ans+=r[i-1]-l[i-1]+1,sum+=a[i],l[i]=a[i]+1>>1,r[i]=sum;
    10         else l[i]=l[i-1],sum+=a[i],r[i]=sum;
    11     ans+=r[n]-l[n]+1;
    12     printf("%lld
    ",ans-1);
    13 }
    386B

    T3:计数

    看起来很难。

    前序遍历有很多性质。

    (——By rvalue %%%,他讲的太好了我就不想写了)

    数对的限制很难处理。怎么突破?

    可以发现在前序遍历确定后,中序遍历关系所限制的,其实就是a是否在b的左子树内。

    进一步说,b限制的是a的子树大小。

    如果在子树内,那么限制的就是左子树大小的下界,否则限制上界。

    所以设dp[i][j]表示以i为根的子树大小为j。然后就

    记忆化一发即可。

    (当然也可以直接dp参见LNC)

     1 #include<cstdio>
     2 #include<iostream>
     3 using namespace std;
     4 #define mod 1000000007
     5 int liml[405],limr[405],dp[405][405],m,n;
     6 int sch(int ord,int sz){
     7     if(dp[ord][sz]!=-1)return dp[ord][sz];
     8     if(!sz)return dp[ord][sz]=1;
     9     dp[ord][sz]=0;
    10     for(int k=liml[ord];k<sz&&k<=limr[ord];++k)dp[ord][sz]=(dp[ord][sz]+1ll*sch(ord+1,k)*sch(ord+1+k,sz-k-1))%mod;
    11     return dp[ord][sz];
    12 }
    13 int main(){
    14     int t,n,m,a,b;scanf("%d",&t);
    15     while(t--){
    16         scanf("%d%d",&n,&m);
    17         for(int i=1;i<=n+1;++i)for(int j=0;j<=n;++j)dp[i][j]=-1;
    18         for(int i=1;i<=n;++i)liml[i]=0,limr[i]=n-i+1;
    19         while(m--){
    20             scanf("%d%d",&a,&b);
    21             if(a>b)liml[b]=max(liml[b],a-b);else limr[a]=min(limr[a],b-a-1);
    22         }printf("%d
    ",sch(1,n));
    23     }
    24 }
    View Code
  • 相关阅读:
    #415 Div2 Problem C Do you want a data? (math && 前后缀和 && 快速幂)
    KMP模版 && KMP求子串在主串出现的次数模版
    Codeforces 1140G Double Tree 倍增 + dp
    Codeforces 1140F Extending Set of Points 线段树 + 按秩合并并查集 (看题解)
    Codeforces 442D Adam and Tree dp (看题解)
    DC3求后缀数组板子
    Codeforces 865C Gotta Go Fast 二分 + 期望dp (看题解)
    Codeforces 1137D Cooperative Game (看题解)
    Codeforces 1139E Maximize Mex 二分图匹配
    Codeforces 1139D Steps to One dp
  • 原文地址:https://www.cnblogs.com/hzoi-DeepinC/p/11689828.html
Copyright © 2011-2022 走看看