• 2019.3.25考试


    T1

    暴力写挂.jpg

    正解考虑枚举有几个小塔放了奇数个,然后剩下的就变成球和盒子的问题,统一算

    orz wxx,tql

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 using namespace std;
     5 const int N=1000005;
     6 int fac[N],inv[N];
     7 long long T,n,m,k,mod;
     8 int Qpow(int x,int k)
     9 {
    10     if(k<=1) return k?x:1;
    11     int tmp=Qpow(x,k>>1);
    12     return 1ll*tmp*tmp%mod*((k&1)?x:1)%mod;
    13 }
    14 void Pre()
    15 {
    16     fac[0]=inv[0]=1;
    17     for(int i=1;i<mod;i++) fac[i]=1ll*fac[i-1]*i%mod;
    18     inv[mod-1]=Qpow(fac[mod-1],mod-2);
    19     for(int i=mod-2;i;i--) inv[i]=1ll*inv[i+1]*(i+1)%mod;
    20 }
    21 int C(int a,int b)
    22 {
    23     if(a<b||a<0||b<0) return 0;
    24     return 1ll*fac[a]*inv[b]%mod*inv[a-b]%mod;
    25 }
    26 int Lucas(long long a,long long b)
    27 {
    28     return b?1ll*C(a%mod,b%mod)*Lucas(a/mod,b/mod)%mod:1;
    29 }
    30 int main()
    31 {
    32     scanf("%lld",&T);
    33     while(T--){
    34         scanf("%lld%lld%lld%lld",&n,&m,&k,&mod),Pre();
    35         if(!n&&!m) puts("0");
    36         else if(!n) printf("%d
    ",(k&1)?0:Lucas((k>>1)+m-1,m-1));
    37         else if(!m) printf("%d
    ",Lucas(k+n-1,n-1));
    38         else
    39         {
    40             int ans=0;
    41             for(int i=0;i<=n;i++)
    42                 if(((k-i)&1)==0)
    43                     (ans+=1ll*Lucas(n,i)*Lucas(((k-i)>>1)+n+m-1,n+m-1)%mod)%=mod;
    44             printf("%d
    ",ans);
    45         }
    46     }
    47     return 0;
    48 }
    View Code

    T2

    效率垫底.jpg

    用DFS序转成二维数点,然后做就完了

      1 #include<cstdio>
      2 #include<cstring>
      3 #include<algorithm>
      4 using namespace std;
      5 const int N=100005,M=200005,K=19;
      6 int n,m,q,op,t1,t2,id,cnt,tot,num;
      7 int p[N],noww[M],goal[M],upp[N][K],ans[N];
      8 int siz[N],anc[N],dep[N],imp[N],dfn[N],top[N];
      9 int root[N],val[N*330],lson[N*330],rson[N*330];
     10 void Link(int f,int t)
     11 {
     12     noww[++cnt]=p[f];
     13     goal[cnt]=t,p[f]=cnt;
     14     noww[++cnt]=p[t];
     15     goal[cnt]=f,p[t]=cnt;
     16 }
     17 void DFS(int nde,int fth,int dth)
     18 {
     19     int tmp=0;
     20     siz[nde]=1,anc[nde]=fth,dep[nde]=dth;
     21     for(int i=p[nde],g;i;i=noww[i])
     22         if((g=goal[i])!=fth)
     23         {
     24             DFS(g,nde,dth+1),siz[nde]+=siz[g];
     25             if(siz[g]>tmp) tmp=siz[g],imp[nde]=g;
     26         }
     27 }
     28 void Decompose(int nde,int upt)
     29 {
     30     dfn[nde]=++tot,top[nde]=upt;
     31     if(imp[nde])
     32     {
     33         Decompose(imp[nde],upt);
     34         for(int i=p[nde],g;i;i=noww[i])
     35             if((g=goal[i])!=imp[nde]&&g!=anc[nde]) Decompose(g,g);
     36     }
     37 }
     38 int LCA(int x,int y)
     39 {
     40     while(top[x]!=top[y])
     41     {
     42         if(dep[top[x]]<dep[top[y]])
     43             swap(x,y); x=anc[top[x]];
     44     }
     45     return dep[x]<dep[y]?x:y;
     46 }
     47 void Pre()
     48 {
     49     for(int i=1;i<=n;i++) upp[i][0]=anc[i];
     50     for(int i=1;i<=18;i++)
     51         for(int j=1;j<=n;j++)
     52             upp[j][i]=upp[upp[j][i-1]][i-1];
     53 }
     54 void Add(int &nde,int l,int r,int pos,int tsk)
     55 {
     56     if(!nde) nde=++id;
     57     if(l==r) val[nde]+=tsk;
     58     else 
     59     {
     60         int mid=(l+r)>>1;
     61         if(pos<=mid) Add(lson[nde],l,mid,pos,tsk);
     62         else Add(rson[nde],mid+1,r,pos,tsk);
     63         val[nde]=val[lson[nde]]+val[rson[nde]];
     64     }
     65 }
     66 void Modify(int pos,int pot,int tsk)
     67 {
     68     for(int i=pos;i<=n;i+=i&-i)
     69         Add(root[i],1,n,pot,tsk);
     70 }
     71 int Query(int &nde,int l,int r,int ll,int rr)
     72 {
     73     if(!nde) nde=++id;
     74     if(ll>rr) return 0;
     75     if(l>=ll&&r<=rr) return val[nde];
     76     else
     77     {
     78         int mid=(l+r)>>1,ret=0;
     79         if(mid>=ll) ret+=Query(lson[nde],l,mid,ll,rr);
     80         if(mid<rr) ret+=Query(rson[nde],mid+1,r,ll,rr);
     81         return ret;
     82     }
     83 }
     84 int Count(int xa,int ya,int xb,int yb)
     85 {
     86     int ret1=0,ret2=0;
     87     for(int i=xa-1;i;i-=i&-i)
     88         ret1+=Query(root[i],1,n,1,yb)-Query(root[i],1,n,1,ya-1);
     89     for(int i=xb;i;i-=i&-i)
     90         ret2+=Query(root[i],1,n,1,yb)-Query(root[i],1,n,1,ya-1);
     91     return ret2-ret1;
     92 }
     93 int main()
     94 {
     95     scanf("%d",&n);
     96     for(int i=1;i<n;i++)
     97         scanf("%d%d",&t1,&t2),Link(t1,t2);
     98     DFS(1,0,1),Decompose(1,1),Pre();
     99     scanf("%d",&m);
    100     for(int i=1;i<=m;i++)
    101     {
    102         scanf("%d%d",&t1,&t2);
    103         Modify(dfn[t1],dfn[t2],1);
    104         Modify(dfn[t2],dfn[t1],1);
    105     }
    106     scanf("%d",&q);
    107     while(q--)
    108     {
    109         scanf("%d%d%d",&op,&t1,&t2);
    110         if(op==1) Modify(dfn[t1],dfn[t2],1),Modify(dfn[t2],dfn[t1],1);
    111         else if(op==2) Modify(dfn[t1],dfn[t2],-1),Modify(dfn[t2],dfn[t1],-1);
    112         else 
    113         {
    114             int lca=LCA(t1,t2);
    115             if(lca==t1)
    116             {
    117                 int ly=dfn[t2],ry=dfn[t2]+siz[t2]-1,nde=t2;
    118                 for(int i=18;~i;i--)
    119                     if(dep[upp[nde][i]]>dep[t1]) nde=upp[nde][i];
    120                 int lx=dfn[nde],rx=dfn[nde]+siz[nde]-1;
    121                 ans[++num]=Count(1,ly,lx-1,ry)+Count(rx+1,ly,n,ry);
    122             }
    123             else if(lca==t2)
    124             {
    125                 swap(t1,t2);
    126                 int ly=dfn[t2],ry=dfn[t2]+siz[t2]-1,nde=t2;
    127                 for(int i=18;~i;i--)
    128                     if(dep[upp[nde][i]]>dep[t1]) nde=upp[nde][i];
    129                 int lx=dfn[nde],rx=dfn[nde]+siz[nde]-1;
    130                 ans[++num]=Count(1,ly,lx-1,ry)+Count(rx+1,ly,n,ry);
    131             }
    132             else
    133             {
    134                 int lx=dfn[t1],rx=dfn[t1]+siz[t1]-1;
    135                 int ly=dfn[t2],ry=dfn[t2]+siz[t2]-1;
    136                 ans[++num]=Count(lx,ly,rx,ry);
    137             }
    138         }
    139     }
    140     for(int i=1;i<=num;i++)
    141     {
    142         printf("%d",ans[i]);
    143         if(i!=num) puts("");
    144     }
    145     return 0;
    146 }
    View Code

    T3

  • 相关阅读:
    大话设计模式-——简答工厂模式
    大话设计——-单例模式
    首先,编写一个类ChongZai,该类中有3个重载的方法void print();其次, 再编写一个主类来测试ChongZai类的功能
    创建一个Point类,有成员变量x,y,方法getX(),setX(),还有一个构造方 法初始化x和y。创建类主类A来测试它
    正则表达式
    struts(一)
    servlet容器开发要点
    Http协议
    TCP的四次挥手
    建立TCP连接的三次握手
  • 原文地址:https://www.cnblogs.com/ydnhaha/p/10593976.html
Copyright © 2020-2023  润新知