zoukankan      html  css  js  c++  java
  • 2019杭电多校第二场

    比赛总结

    @辣鸡lfw,一开始算三角形那题没想到正解使用莫队乱搞,然后要选出50个最大的时候还用莫队。。。主席树区间第k大什么的完全忘记了

    题解

    1001 Another Chess Problem

    unsolved

    1002 Beauty Of Unimodal Sequence 

    unsolved

    1003 Coefficient 

    unsolved

    1004 Double Tree 

    unsolved

    1005 Everying is Generated In Equal Probability

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 #define mod 998244353
     5 const int maxn=3000;
     6 const int maxm=3010;
     7 int n;
     8 ll sum,f[maxm],rav[maxm],b[maxm];
     9 ll Pow(ll x,int n)
    10 {
    11     ll ans=1;
    12     while(n)
    13     {
    14         if(n&1)ans=ans*x%mod;
    15         n>>=1;
    16         x=x*x%mod;
    17     }
    18     return ans;
    19 }
    20 ll C(int a,int b){return (f[a]*rav[b]%mod)*rav[a-b]%mod;}
    21 void Init()
    22 {
    23     sum=0; f[0]=rav[0]=1;
    24     for(ll i=1;i<=maxn;i++)f[i]=f[i-1]*i%mod;
    25     rav[maxn]=Pow(f[maxn],mod-2);
    26     for(ll i=maxn-1;i;i--) rav[i]=rav[i+1]*(i+1)%mod;
    27 }
    28 /////////// 求组合数和逆元 
    29 
    30 int main()
    31 { 
    32     while(~scanf("%d",&n)) 
    33     {
    34         Init();
    35         
    36         ll r=Pow(4,mod-2),k,x,y;
    37         for(ll i=2;i<=n;++i)
    38         {
    39             x=Pow(2,i);
    40             y=Pow(Pow(2,i)-1,mod-2);
    41             k=x*y%mod;
    42             b[i]=k*((i*(i-1)%mod)*r%mod)%mod;
    43             for(int j=0;j<i;++j) b[i]=(b[i]+(y*C(i,j)%mod)*b[j]%mod)%mod;
    44             sum=(sum+b[i])%mod;
    45         }
    46         sum=sum*Pow(n,mod-2)%mod;
    47         
    48         printf("%lld
    ",sum);
    49     }
    50     return 0;
    51 }
    View Code

    1006 Fantastic Magic Cube

    unsolved

    1007 Game

    unsolved

    1008 Harmonious Army

    题解:https://blog.csdn.net/baiyifeifei/article/details/97231963

     1 #include<bits/stdc++.h>
     2 #define maxl 200010
     3 using namespace std;
     4  
     5 int n,q,cnt,tot;
     6 int a[maxl],num[maxl],rt[maxl];
     7 long long b[110];
     8 struct node
     9 {
    10     int ls,rs,sum;
    11 }tree[maxl*40];
    12  
    13 inline void insert(int num,int &x,int l,int r)
    14 {
    15     tree[++tot]=tree[x];x=tot;
    16     ++tree[x].sum;
    17     if(l==r) return;
    18     int mid=(l+r)>>1;
    19     if(num<=mid)
    20         insert(num,tree[x].ls,l,mid);
    21     else
    22         insert(num,tree[x].rs,mid+1,r);
    23 }
    24  
    25 inline int query(int i,int j,int k,int l,int r)
    26 {
    27     if(l==r)
    28         return l;
    29     int tp=tree[tree[j].ls].sum-tree[tree[i].ls].sum;
    30     int mid=(l+r)>>1;
    31     if(k<=tp) 
    32         return query(tree[i].ls,tree[j].ls,k,l,mid);
    33     else
    34         return query(tree[i].rs,tree[j].rs,k-tp,mid+1,r);
    35 }
    36  
    37 inline void prework()
    38 {
    39     for(int i=1;i<=n;i++)
    40         scanf("%d",&a[i]),num[i]=a[i];
    41     sort(num+1,num+1+n);
    42     cnt=unique(num+1,num+1+n)-num-1;
    43     for(int i=1;i<=n;i++)
    44         a[i]=lower_bound(num+1,num+1+cnt,a[i])-num;
    45     for(int i=0;i<=tot;i++)
    46         tree[i].ls=tree[i].rs=tree[i].sum=0;
    47     tot=0;
    48     for(int i=1;i<=n;i++)
    49         rt[i]=0;
    50     for(int i=1;i<=n;i++)
    51     {
    52         rt[i]=rt[i-1];
    53         insert(a[i],rt[i],1,cnt);
    54     }
    55 }
    56  
    57 inline void mainwork()
    58 {
    59     int l,r,up;
    60     long long ans=0;
    61     for(int i=1;i<=q;i++)
    62     {
    63         scanf("%d%d",&l,&r);
    64         up=min(50,r-l+1);
    65         for(int j=1;j<=up;j++)
    66             b[j]=num[query(rt[l-1],rt[r],r-l+1-j+1,1,cnt)];
    67         ans=-1;
    68         for(int j=1;j<=up-2;j++)
    69         if(b[j]<b[j+1]+b[j+2])
    70         {
    71             ans=b[j]+b[j+1]+b[j+2];
    72             break;
    73         }
    74         printf("%lld
    ",ans);
    75     }
    76 }
    77  
    78 int main()
    79 {
    80     while(~scanf("%d%d",&n,&q))
    81     {
    82         prework();
    83         mainwork();
    84         //print();
    85     }
    86     return 0;
    87 }
    View Code

    1009 I Love Palindrome String 

     1 #include<bits/stdc++.h>
     2 #define maxl 200010
     3 using namespace std;
     4  
     5 int n,q,cnt,tot;
     6 int a[maxl],num[maxl],rt[maxl];
     7 long long b[110];
     8 struct node
     9 {
    10     int ls,rs,sum;
    11 }tree[maxl*40];
    12  
    13 inline void insert(int num,int &x,int l,int r)
    14 {
    15     tree[++tot]=tree[x];x=tot;
    16     ++tree[x].sum;
    17     if(l==r) return;
    18     int mid=(l+r)>>1;
    19     if(num<=mid)
    20         insert(num,tree[x].ls,l,mid);
    21     else
    22         insert(num,tree[x].rs,mid+1,r);
    23 }
    24  
    25 inline int query(int i,int j,int k,int l,int r)
    26 {
    27     if(l==r)
    28         return l;
    29     int tp=tree[tree[j].ls].sum-tree[tree[i].ls].sum;
    30     int mid=(l+r)>>1;
    31     if(k<=tp) 
    32         return query(tree[i].ls,tree[j].ls,k,l,mid);
    33     else
    34         return query(tree[i].rs,tree[j].rs,k-tp,mid+1,r);
    35 }
    36  
    37 inline void prework()
    38 {
    39     for(int i=1;i<=n;i++)
    40         scanf("%d",&a[i]),num[i]=a[i];
    41     sort(num+1,num+1+n);
    42     cnt=unique(num+1,num+1+n)-num-1;
    43     for(int i=1;i<=n;i++)
    44         a[i]=lower_bound(num+1,num+1+cnt,a[i])-num;
    45     for(int i=0;i<=tot;i++)
    46         tree[i].ls=tree[i].rs=tree[i].sum=0;
    47     tot=0;
    48     for(int i=1;i<=n;i++)
    49         rt[i]=0;
    50     for(int i=1;i<=n;i++)
    51     {
    52         rt[i]=rt[i-1];
    53         insert(a[i],rt[i],1,cnt);
    54     }
    55 }
    56  
    57 inline void mainwork()
    58 {
    59     int l,r,up;
    60     long long ans=0;
    61     for(int i=1;i<=q;i++)
    62     {
    63         scanf("%d%d",&l,&r);
    64         up=min(50,r-l+1);
    65         for(int j=1;j<=up;j++)
    66             b[j]=num[query(rt[l-1],rt[r],r-l+1-j+1,1,cnt)];
    67         ans=-1;
    68         for(int j=1;j<=up-2;j++)
    69         if(b[j]<b[j+1]+b[j+2])
    70         {
    71             ans=b[j]+b[j+1]+b[j+2];
    72             break;
    73         }
    74         printf("%lld
    ",ans);
    75     }
    76 }
    77  
    78 int main()
    79 {
    80     while(~scanf("%d%d",&n,&q))
    81     {
    82         prework();
    83         mainwork();
    84         //print();
    85     }
    86     return 0;
    87 }
    View Code

    1010 Just Skip The Problem

    就直接问n个2进制位上的数,由于有顺序,那么就是n!,对1e6+3取模,那就在外面预处理到1e6+3,之后都是0

     1 #include<bits/stdc++.h>
     2 #define maxl 1000010
     3 using namespace std;
     4 
     5 const int mod=1e6+3;
     6 
     7 long long f[maxl]; 
     8 
     9 int main()
    10 {
    11     f[1]=1;
    12     for(int i=2;i<mod;i++)
    13         f[i]=(f[i-1]*i)%mod;
    14     int n;
    15     while(~scanf("%d",&n))
    16     {
    17         if(n>=mod)
    18             puts("0");
    19         else
    20             printf("%lld
    ",f[n]);
    21     }
    22     return 0;
    23 }
    View Code

    1011 Keep On Everything But TRiangle

    题解:https://blog.csdn.net/liufengwei1/article/details/97324278

     1 #include<bits/stdc++.h>
     2 #define maxl 200010
     3 using namespace std;
     4  
     5 int n,q,cnt,tot;
     6 int a[maxl],num[maxl],rt[maxl];
     7 long long b[110];
     8 struct node
     9 {
    10     int ls,rs,sum;
    11 }tree[maxl*40];
    12  
    13 inline void insert(int num,int &x,int l,int r)
    14 {
    15     tree[++tot]=tree[x];x=tot;
    16     ++tree[x].sum;
    17     if(l==r) return;
    18     int mid=(l+r)>>1;
    19     if(num<=mid)
    20         insert(num,tree[x].ls,l,mid);
    21     else
    22         insert(num,tree[x].rs,mid+1,r);
    23 }
    24  
    25 inline int query(int i,int j,int k,int l,int r)
    26 {
    27     if(l==r)
    28         return l;
    29     int tp=tree[tree[j].ls].sum-tree[tree[i].ls].sum;
    30     int mid=(l+r)>>1;
    31     if(k<=tp) 
    32         return query(tree[i].ls,tree[j].ls,k,l,mid);
    33     else
    34         return query(tree[i].rs,tree[j].rs,k-tp,mid+1,r);
    35 }
    36  
    37 inline void prework()
    38 {
    39     for(int i=1;i<=n;i++)
    40         scanf("%d",&a[i]),num[i]=a[i];
    41     sort(num+1,num+1+n);
    42     cnt=unique(num+1,num+1+n)-num-1;
    43     for(int i=1;i<=n;i++)
    44         a[i]=lower_bound(num+1,num+1+cnt,a[i])-num;
    45     for(int i=0;i<=tot;i++)
    46         tree[i].ls=tree[i].rs=tree[i].sum=0;
    47     tot=0;
    48     for(int i=1;i<=n;i++)
    49         rt[i]=0;
    50     for(int i=1;i<=n;i++)
    51     {
    52         rt[i]=rt[i-1];
    53         insert(a[i],rt[i],1,cnt);
    54     }
    55 }
    56  
    57 inline void mainwork()
    58 {
    59     int l,r,up;
    60     long long ans=0;
    61     for(int i=1;i<=q;i++)
    62     {
    63         scanf("%d%d",&l,&r);
    64         up=min(50,r-l+1);
    65         for(int j=1;j<=up;j++)
    66             b[j]=num[query(rt[l-1],rt[r],r-l+1-j+1,1,cnt)];
    67         ans=-1;
    68         for(int j=1;j<=up-2;j++)
    69         if(b[j]<b[j+1]+b[j+2])
    70         {
    71             ans=b[j]+b[j+1]+b[j+2];
    72             break;
    73         }
    74         printf("%lld
    ",ans);
    75     }
    76 }
    77  
    78 int main()
    79 {
    80     while(~scanf("%d%d",&n,&q))
    81     {
    82         prework();
    83         mainwork();
    84         //print();
    85     }
    86     return 0;
    87 }
    View Code

    1012  Longgest Subarray 

    题解:https://blog.csdn.net/liufengwei1/article/details/97324937

     1 #include<bits/stdc++.h>
     2 #define maxl 200010
     3 using namespace std;
     4  
     5 int n,q,cnt,tot;
     6 int a[maxl],num[maxl],rt[maxl];
     7 long long b[110];
     8 struct node
     9 {
    10     int ls,rs,sum;
    11 }tree[maxl*40];
    12  
    13 inline void insert(int num,int &x,int l,int r)
    14 {
    15     tree[++tot]=tree[x];x=tot;
    16     ++tree[x].sum;
    17     if(l==r) return;
    18     int mid=(l+r)>>1;
    19     if(num<=mid)
    20         insert(num,tree[x].ls,l,mid);
    21     else
    22         insert(num,tree[x].rs,mid+1,r);
    23 }
    24  
    25 inline int query(int i,int j,int k,int l,int r)
    26 {
    27     if(l==r)
    28         return l;
    29     int tp=tree[tree[j].ls].sum-tree[tree[i].ls].sum;
    30     int mid=(l+r)>>1;
    31     if(k<=tp) 
    32         return query(tree[i].ls,tree[j].ls,k,l,mid);
    33     else
    34         return query(tree[i].rs,tree[j].rs,k-tp,mid+1,r);
    35 }
    36  
    37 inline void prework()
    38 {
    39     for(int i=1;i<=n;i++)
    40         scanf("%d",&a[i]),num[i]=a[i];
    41     sort(num+1,num+1+n);
    42     cnt=unique(num+1,num+1+n)-num-1;
    43     for(int i=1;i<=n;i++)
    44         a[i]=lower_bound(num+1,num+1+cnt,a[i])-num;
    45     for(int i=0;i<=tot;i++)
    46         tree[i].ls=tree[i].rs=tree[i].sum=0;
    47     tot=0;
    48     for(int i=1;i<=n;i++)
    49         rt[i]=0;
    50     for(int i=1;i<=n;i++)
    51     {
    52         rt[i]=rt[i-1];
    53         insert(a[i],rt[i],1,cnt);
    54     }
    55 }
    56  
    57 inline void mainwork()
    58 {
    59     int l,r,up;
    60     long long ans=0;
    61     for(int i=1;i<=q;i++)
    62     {
    63         scanf("%d%d",&l,&r);
    64         up=min(50,r-l+1);
    65         for(int j=1;j<=up;j++)
    66             b[j]=num[query(rt[l-1],rt[r],r-l+1-j+1,1,cnt)];
    67         ans=-1;
    68         for(int j=1;j<=up-2;j++)
    69         if(b[j]<b[j+1]+b[j+2])
    70         {
    71             ans=b[j]+b[j+1]+b[j+2];
    72             break;
    73         }
    74         printf("%lld
    ",ans);
    75     }
    76 }
    77  
    78 int main()
    79 {
    80     while(~scanf("%d%d",&n,&q))
    81     {
    82         prework();
    83         mainwork();
    84         //print();
    85     }
    86     return 0;
    87 }
    View Code
  • 相关阅读:
    纳尼?不用码代码,就可回归主流程,一只海豚就可以做到
    教育产品-组件化视觉设计实践
    从整理看视觉设计(网易云课堂我的学习中心-微专业视觉优化)
    搜索意图识别浅析
    如何配置使用Dnsmasq
    如何实现最佳的跨平台游戏体验?Unity成亮解密实时渲染技术!
    PAT 1024. Palindromic Number
    PAT 1023. Have Fun with Numbers
    PAT 1022. Digital Library
    PAT 1021. Deepest Root
  • 原文地址:https://www.cnblogs.com/csushl/p/11249771.html
Copyright © 2011-2022 走看看