• 2017-10-29-afternoon-清北模拟赛


    T1 洗澡

    贪心:将未匹配的右括号花费1变为左括号,最有多余的左括号有一半变成右括号

     1 #include <cstring>
     2 #include <cstdio>
     3 
     4 const int N(100005);
     5 int n,top,ans;
     6 char s[N];
     7 
     8 int Presist()
     9 {
    10     freopen("shower.in","r",stdin);
    11     freopen("shower.out","w",stdout);
    12     scanf("%s",s);    n=strlen(s);
    13     for(int i=0; i<n; ++i)
    14     {
    15         if(s[i]=='(') top++;
    16         else
    17         {
    18             if(top<1) top++,ans++;
    19             else top--;
    20         }
    21     }
    22     printf("%d
    ",ans+top/2);
    23     return 0;
    24 }
    25 
    26 int Aptal=Presist();
    27 int main(int argc,char*argv[]){;}
    AC

    T2 日记

    线性筛出1e6内的所有素数,一共78000++个,对于每次询问暴力查找(可二分)符合条件的最大数,1.6*10^8

     1 #include <cstdio>
     2 
     3 inline void read(int &x)
     4 {
     5     x=0; register char ch=getchar();
     6     for(; ch>'9'||ch<'0'; ) ch=getchar();
     7     for(; ch>='0'&&ch<='9'; ch=getchar()) x=x*10+ch-'0';
     8 }
     9 const int N(1e6+5);
    10 bool not_pri[N],flag;
    11 long long sum[N];
    12 int pri[N],cnt,t;
    13 
    14 inline void Prepare()
    15 {
    16     register int i,j;
    17     for(i=2; i<=1e6; ++i)
    18     {
    19         if(!not_pri[i]) pri[++cnt]=i;
    20         for(j=1; j<=cnt; ++j)
    21         {
    22             if(i*pri[j]>1e6) break;
    23             not_pri[i*pri[j]]=1;
    24             if(i%pri[j]==0) break;
    25         }
    26     }
    27     for(i=1; i<=cnt; ++i)
    28         sum[i]=sum[i-1]+1ll*pri[i];
    29 }
    30 
    31 int Presist()
    32 {
    33     freopen("diary.in","r",stdin);
    34     freopen("diary.out","w",stdout);
    35 //    freopen("1.txt","r",stdin);
    36     Prepare(); read(t);
    37     for(register int n,k,i,j; t--; )
    38     {
    39         read(n),read(k); flag=1;
    40         for(i=cnt; i>=k; --i)
    41         {
    42             j=i-k;
    43             if(sum[i]-sum[j]<=n)
    44             {
    45                 printf("%I64d
    ",sum[i]-sum[j]);
    46                 flag=0; break;
    47             }
    48         }
    49         if(flag) puts("-1");
    50     }
    51     return 0;
    52 }
    53 
    54 int Aptal=Presist();
    55 int main(int argc,char**argv){;}
    AC

    T3 洗衣

    用f(i)表示第i棵树的值的话,会发现    f(i)=f(i-1)+f(i-2)+一坨奇怪的东西
    这坨奇怪的东西大概是某棵树中到某个点的距离之和的几个组合方式,

    所以你会发现本质问题实际上需要求第i棵树中所有点到第j个点的距离之和
    用g[i][j]表示这个东西,那么我们实际上要想办法求g[i][j],那么这个递归的往下用记忆化搜索的方式历来求

     1 #include <algorithm>
     2 #include <cstdio>
     3 #include <map>
     4 
     5 #define LL long long
     6 
     7 const int mod(1e9+7);
     8 const int N(66);
     9 
    10 typedef std:: map<std:: pair<LL,LL>, LL> Mm1;
    11 typedef std:: map<LL,LL> Mm2;
    12 Mm1 mm1[N];
    13 Mm2 mm2[N];
    14 
    15 inline void read(LL &x)
    16 {
    17     x=0; register char ch=getchar();
    18     for(; ch>'9'||ch<'0'; ) ch=getchar();
    19     for(; ch>='0'&&ch<='9'; ch=getchar()) x=x*10+ch-'0';
    20 }
    21 
    22 LL a[N],b[N],c[N],d[N],l[N];
    23 LL F[N],n[N];
    24 
    25 inline LL dis(LL i,LL x,LL y)
    26 {
    27     if(x>y) { LL a=x;x=y;y=a;}
    28     if(x==y) return 0;
    29     Mm1::iterator it=mm1[i].find(std::make_pair(x,y));
    30     if(it!=mm1[i].end()) return it->second;
    31     LL na=n[a[i]];
    32     if(x>=na) return mm1[i][std::make_pair(x,y)]=dis(b[i],x-na,y-na)%mod;
    33     else if(y<na) return mm1[i][std::make_pair(x,y)]=dis(a[i],x,y)%mod;
    34     else return mm1[i][std::make_pair(x,y)]=(dis(a[i],x,c[i])+dis(b[i],d[i],y-na)+l[i])%mod;
    35 }
    36 
    37 inline LL f(LL i,LL j)
    38 {
    39     if(!i) return 0;
    40     Mm2:: iterator it=mm2[i].find(j);
    41     if(it != mm2[i].end()) return it->second;
    42     LL na=n[a[i]];
    43     if(j<na) return mm2[i][j]= ( f(a[i],j)+n[b[i]]%mod*
    44                                  dis(i,j,d[i]+na)%mod+
    45                                  f(b[i],d[i])) %mod;
    46     else return mm2[i][j]= ( f(b[i],j-na)+n[a[i]]%mod*
    47                              dis(i,j,c[i]) %mod+
    48                              f(a[i],c[i])) %mod;
    49 }
    50 
    51 int Presist()
    52 {
    53     freopen("cloth.in","r",stdin);
    54     freopen("cloth.out","w",stdout);
    55     int m; scanf("%d",&m);
    56     F[0]=0; n[0]=1;
    57     for(int i=1; i<=m; ++i)
    58     {
    59         read(a[i]),read(b[i]),read(c[i]),read(d[i]),read(l[i]);
    60         n[i]=n[a[i]]+n[b[i]];    l[i]%=mod;
    61         LL na=n[a[i]]%mod, nb=n[b[i]]%mod;
    62         printf("%I64d
    ",F[i]=( F[a[i]]+F[b[i]]+
    63                                 nb*f(a[i],c[i])%mod+
    64                                 na*f(b[i],d[i])%mod+
    65                                 na*nb %mod*l[i]%mod)%mod);
    66     }
    67     return 0;
    68 }
    69 
    70 int Aptal=Presist();
    71 int main(int argc,char**argv){;}
    AC
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    关于SQLServer数据库中字段值为NULL,取出来该字段放在DataTable中,判断datatable中该字段值是否为NULL的三种方法
    关于web程序中使用KindEditor向数据库插入带有格式的数据时出现的问题
    使用再生龙对ubuntu16.04系统完全备份与还原
    mysql数据库操作指令汇总
    ubuntu安装supervisor以及使用supervisor启动.net core进程
    c#小数取整
    nuget.server搭建及实际测试
    mysql主从同步+mycat读写分离+.NET程序连接mycat代理
    EasyNVR-流媒体服务详解
    Js实现子窗体给父窗体的元素赋值
  • 原文地址:https://www.cnblogs.com/Shy-key/p/7757944.html
Copyright © 2020-2023  润新知