zoukankan      html  css  js  c++  java
  • NOIp2018集训test-10-18 (bike day4)

    这是一套简单题,这几天的考试让bike老爷感觉很绝望,说实话我也确实不知道还能怎么更简单了。

    这几天的题换做llj、sxy应该都能轻松AK吧,至少随便考个250+应该不是问题吧,我越来越觉得觉得我跟他们的差距真的是非常非常大,dcoier跟其他学校的大佬的差距更是如此。我不知道我之前没有自知之明的时候对自己的定义是怎么样的,但是现在我发现我大概真的是一个堪堪noip一等奖水平的选手。

    已经不知道该怎么办了,我甚至很想自暴自弃地大喊,我已经凉了!!dcoi没有救的!!每一届每一届地下去都会凉透的!!

    B 君的第一题 (changchun)

    这是一道讲过的数学题,然而我实在太菜并不记得怎么做。

    然后写了个树dp,似乎递归爆栈了只有90。f[x][0]表示x的子树中与x不相连的联通块个数的期望,f[x][1]表示与x相连的联通块个数的期望,也就是有点和x相连的概率,就可以转移了。

     1 //Achen
     2 #include<bits/stdc++.h>
     3 #define For(i,a,b) for(int i=(a);i<=(b);i++)
     4 #define Rep(i,a,b) for(int i=(a);i>=(b);i--)
     5 #define Formylove return 0
     6 const int N=1000007,p=1000000007;
     7 typedef long long LL;
     8 typedef double db;
     9 using namespace std;
    10 int n;
    11 LL pr[N],inv=500000004;
    12 
    13 template<typename T> void read(T &x) {
    14     char ch=getchar(); x=0; T f=1;
    15     while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
    16     if(ch=='-') f=-1,ch=getchar();
    17     for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
    18 }
    19 
    20 int ecnt,fir[N],nxt[N<<1],to[N<<1];
    21 void add(int u,int v) {
    22     nxt[++ecnt]=fir[u]; fir[u]=ecnt; to[ecnt]=v;
    23     nxt[++ecnt]=fir[v]; fir[v]=ecnt; to[ecnt]=u;
    24 }
    25 
    26 LL f[N][2],son[N];
    27 void dfs(int x,int fa) {
    28     son[x]=0;
    29     for(int i=fir[x];i;i=nxt[i]) if(to[i]!=fa) {
    30         int y=to[i];
    31         son[x]++;
    32         dfs(y,x);
    33         f[x][0]=(f[x][0]+(f[y][0]+f[y][1]*inv%p)%p)%p;
    34     }
    35     f[x][1]=(pr[n]-pr[n-son[x]]+p)%p;
    36 }
    37 
    38 #define ANS
    39 int main() {
    40 #ifdef ANS
    41     freopen("changchun.in","r",stdin);
    42     freopen("changchun.out","w",stdout);
    43 #endif
    44        read(n);
    45        pr[0]=1;
    46        For(i,1,n) pr[i]=pr[i-1]*2%p;
    47        For(i,2,n) {
    48            int x,y;
    49            read(x); read(y);
    50            add(x,y);
    51        }
    52        dfs(1,0);
    53     printf("%lld
    ",(f[1][0]+f[1][1])%p);
    54     Formylove;
    55 }
    树dp

    正解:

    考虑点的联通块怎么算,树中砍掉k条边就形成k+1个联通块,每条边被砍的概率是1/2,那么砍掉边的期望就是(n-1)/2,形成联通块的期望就是(n-1)/2+1

    然后边的联通块就减去单独一个点形成的联通块的个数的期望即可。

    单独点的联通块个数的期望等于每个点形成的单独联通块的个数期望之和,即每个点成为单独联通块的概率之和。llj切这题似乎只需要3min。

     1 //Achen
     2 #include<bits/stdc++.h>
     3 #define For(i,a,b) for(int i=(a);i<=(b);i++)
     4 #define Rep(i,a,b) for(int i=(a);i>=(b);i--)
     5 #define Formylove return 0
     6 const int N=1000007,p=1000000007;
     7 typedef long long LL;
     8 typedef double db;
     9 using namespace std;
    10 int n,in[N];
    11 LL pr[N],ans;
    12 
    13 template<typename T> void read(T &x) {
    14     char ch=getchar(); x=0; T f=1;
    15     while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
    16     if(ch=='-') f=-1,ch=getchar();
    17     for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
    18 }
    19 
    20 LL mo(LL x) { return x<0?x+p:(x>=p?x-p:x); }
    21 
    22 #define ANS
    23 int main() {
    24 #ifdef ANS
    25     freopen("changchun.in","r",stdin);
    26     freopen("changchun.out","w",stdout);
    27 #endif
    28        read(n);
    29        pr[0]=1;
    30        For(i,1,n) pr[i]=mo(pr[i-1]*2);
    31        For(i,2,n) {
    32            int x,y;
    33            read(x); read(y);
    34            in[x]++; in[y]++;
    35        }
    36       ans=((LL)n+1)*pr[n-1]%p;
    37       For(i,1,n) 
    38           ans=mo(ans-pr[n-in[i]]);
    39       printf("%lld
    ",ans);
    40     Formylove;
    41 }
    View Code

    B 君的第二题 (harbin)

    除了菜菜菜菜菜菜我不知道还能说些什么。

    弱智都知道的70pt做法就是随便拿个啥子数据结构模拟,我不想打平衡树又忘了树状数组求第k大怎么打,在那里打印了一个树状数组现场研究,还写挂了一次。

    正解是,考虑每个人是第几轮被踢出去的,O(n)地dp这个东西,然后基数排序即可。。

     1 //Achen
     2 #include<bits/stdc++.h>
     3 #define For(i,a,b) for(int i=(a);i<=(b);i++)
     4 #define Rep(i,a,b) for(int i=(a);i>=(b);i--)
     5 #define Formylove return 0
     6 const int N=1000007,mod=1e9+7;
     7 typedef long long LL;
     8 typedef double db;
     9 using namespace std;
    10 int T,n,k,pr[N],f[N],c[N],sa[N];
    11 
    12 template<typename T> void read(T &x) {
    13     char ch=getchar(); x=0; T f=1;
    14     while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
    15     if(ch=='-') f=-1,ch=getchar();
    16     for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
    17 }
    18 
    19 int p[N],bo[N];
    20 void get_prime() {
    21     For(i,2,1000007) {
    22         if(!bo[i]) p[++p[0]]=i;
    23         for(int j=1;j<=p[0]&&p[j]*i<=1000007;j++) {
    24             bo[i*p[j]]=1;
    25             if(i%p[j]==0) break;
    26         }
    27     }
    28 }
    29 
    30 void pre() {
    31     int l=1,r=p[0],rs=1;
    32     while(l<=r) {
    33         int mid=((l+r)>>1);
    34         if(p[mid]>=n) rs=mid,r=mid-1;
    35         else l=mid+1;
    36     }
    37     int P=p[rs];
    38     pr[0]=1;
    39     For(i,1,n) pr[i]=(LL)pr[i-1]*P%mod;
    40 }
    41 
    42 LL mo(LL x) { return x>=mod?x-mod:x; }
    43 
    44 #define ANS
    45 int main() {
    46 #ifdef ANS
    47     freopen("harbin.in","r",stdin);
    48     freopen("harbin.out","w",stdout);
    49 #endif
    50     pr[0]=1;
    51     For(i,1,18) pr[i]=pr[i-1]*2;
    52     get_prime();
    53     read(T);
    54     while(T--) {
    55            read(n); read(k);
    56            pre();
    57            For(i,0,n-1) {
    58                if(i%k==0) f[i]=0;
    59                else f[i]=f[i-(i/k+1)]+1; 
    60                c[f[i]]++;
    61            }
    62            For(i,1,n-1) c[i]+=c[i-1];
    63            Rep(i,n-1,0) sa[--c[f[i]]]=i;
    64            LL ans=0;
    65            For(i,0,n-1) 
    66                ans=mo(ans+(LL)sa[i]*pr[i]%mod);
    67            printf("%lld
    ",ans);
    68            if(T) memset(c,0,sizeof(c));
    69        }
    70     Formylove;
    71 }
    View Code

    B 君的第三题 (shenyang)

    一个很弱智的状压dp,然而我当时竟然觉得一个质数跟自己互质,然后说这是什么沙比题随便搜一下就差不多了吧写了个迭代加深。

     1 //Achen
     2 #include<bits/stdc++.h>
     3 #define For(i,a,b) for(int i=(a);i<=(b);i++)
     4 #define Rep(i,a,b) for(int i=(a);i>=(b);i--)
     5 #define Formylove return 0
     6 const int N=107,up=65535;
     7 typedef long long LL;
     8 typedef double db;
     9 using namespace std;
    10 int p[20]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};
    11 int n,a[N],ans,f[N][up+7];
    12 
    13 template<typename T> void read(T &x) {
    14     char ch=getchar(); x=0; T f=1;
    15     while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
    16     if(ch=='-') f=-1,ch=getchar();
    17     for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
    18 }
    19 
    20 int get(int x) {
    21     int rs=0;
    22     For(i,0,15) if(x%p[i]==0)
    23         rs|=(1<<i);
    24     return rs;
    25 }
    26 
    27 #define ANS
    28 int main() {
    29 #ifdef ANS
    30     freopen("shenyang.in","r",stdin);
    31     freopen("shenyang.out","w",stdout);
    32 #endif
    33     read(n);
    34     For(i,1,n) read(a[i]);
    35     memset(f,127/3,sizeof(f));
    36     f[0][0]=0;
    37     ans=n*29;
    38     For(i,1,n) {
    39         For(x,1,53) {
    40             int now=get(x),S=(now^up);
    41             for(int s=S;;s=((s-1)&S)) {
    42                 f[i][s|now]=min(f[i][s|now],f[i-1][s]+abs(x-a[i]));
    43                 if(!s) break;
    44             }
    45         }
    46         if(i==n) For(s,0,up) ans=min(ans,f[i][s]);
    47     }
    48     printf("%d
    ",ans);
    49     Formylove;
    50 }
    View Code
  • 相关阅读:
    设计模式(17) 访问者模式(VISITOR) C++实现
    Effective C++(20) 继承与面向对象设计
    Google论文(1) GFS:Google文件系统
    设计模式(16) 观察者模式(OBSERVER)C++实现
    海量数据处理面试题(2) 将用户的query按出现频度排序
    海量数据处理面试题(1) 找出两文件种包含的相同的url
    深入探索C++对象模型(1) 关于对象(思维导图)
    服务器编程入门(13) Linux套接字设置超时的三种方法
    技术笔记:Indy的TIdSMTP改造,解决发送Html和主题截断问题
    技术笔记:Delphi多线程应用读写锁
  • 原文地址:https://www.cnblogs.com/Achenchen/p/9812718.html
Copyright © 2011-2022 走看看