zoukankan      html  css  js  c++  java
  • 2016-11-15试题解题报告

    2016-11-15试题解题报告

    By shenben

    T1代码:

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    inline int read(){
        register int x=0;bool f=1;
        register char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
        return f?x:-x;
    }
    const int N=1e5+10;
    int lson[N],rson[N],a[N];
    int n,ans;
    int len,r,b[N],c[N];
    void dfs(int x){
        if(lson[x]) dfs(lson[x]);
        b[++len]=x;
        if(rson[x]) dfs(rson[x]);
    }
    void LIS(){
        for(int p,i=1;i<=len;i++){
            int x=a[b[i]]-i;
            if(x>=c[r]){
                c[++r]=x;
            }
            else{
                p=upper_bound(c+1,c+r+1,x)-c;
                c[p]=x;
            }
        }
    }
    #define name "binary"
    int main(){
        n=read();
        for(int i=1;i<=n;i++) a[i]=read();
        for(int i=2,fa,son;i<=n;i++){
            fa=read();son=read();
            if(!son) lson[fa]=i;
            else rson[fa]=i;
        }
        dfs(1);
        LIS();
        printf("%d
    ",len-r);
        return 0;
    } 

    T2代码:

    //std既丑由慢~~~还是暴力快
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int N=5e5+10;
    int n,len=-1,a[N],ans[N];
    #define name "pair"
    int main(){
        freopen(name".in","r",stdin);
        freopen(name".out","w",stdout);
        scanf("%d",&n);
        for(int i=1;i<=n;i++) scanf("%d",a+i);
        for(int i=1;i<=n;i++){//枚举a[k] 
            int L=i,R=i;//枚举a[k]所能管辖的最远边界 
            while(L-1>=1&&a[L-1]%a[i]==0) L--;
            while(R+1<=n&&a[R+1]%a[i]==0) R++;
            if(R-L>len){
                len=R-L;
                ans[ans[0]=1]=L;
            }
            else if(R-L==len){
                ans[++ans[0]]=L;
            }
        }
        sort(ans+1,ans+ans[0]+1);
        ans[0]=unique(ans+1,ans+ans[0]+1)-(ans+1);
        printf("%d %d
    ",ans[0],len);
        for(int i=1;i<=ans[0];i++) printf("%d ",ans[i]);
        fclose(stdin);
        fclose(stdout);
        return 0;
    }
    /*30分存档 
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<map>
    using namespace std;
    inline int read(){
        register int x=0;bool f=1;
        register char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
        return f?x:-x;
    }
    const int N=1e3+10;
    const int M=9e6+10;
    int n,a[N],xmin[N][N];
    struct node{
        int l,r,val;
        node(int _l=0,int _r=0,int _val=0){
            l=_l;r=_r;val=_val;
        }
        bool operator <(const node &b)const{
            if(val==b.val) return l<b.l;
            return val>b.val;
        }
    }fs[M];
    int cnt,num,zmx;
    #define name "pair"
    int main(){
        freopen(name".in","r",stdin);
        freopen(name".out","w",stdout);
        n=read();
        for(int i=1;i<=n;i++) a[i]=read();
        for(int i=1;i<=n;i++){
            xmin[i][i]=a[i];
            for(int j=i+1;j<=n;j++){
                xmin[i][j]=min(xmin[i][j-1],a[j]);
            }
        }
        //for(int i=1;i<=n;i++){
        //    for(int j=i;j<=n;j++){
        //        printf("min[%d,%d]: %d
    ",i,j,xmin[i][j]);
        //    }
        //}
        for(int i=1;i<=n;i++){
            for(int k,v,j=i+1;j<=n;j++){
                for(k=i;k<=j;k++){
                    if(a[k]%xmin[i][j]) break;
                }
                if(k>j){
                    if((v=j-i)>=zmx){
                        zmx=v;
                        fs[++cnt]=node(i,j,v);
                    }
                }
            }
        }
        sort(fs+1,fs+cnt+1);
        for(int i=1;i<=cnt;i++) if(fs[i].val!=zmx){num=i-1;break;}
        if(!num||!zmx){
            printf("%d %d
    ",n,0);
            for(int i=1;i<=n;i++) printf("%d ",i);
            return 0;
        }
        printf("%d %d
    ",num,zmx);
        for(int i=1;i<num;i++) printf("%d ",fs[i].l);printf("%d",fs[num].l);
        fclose(stdin);
        fclose(stdout);
        return 0;
    }*/

    T3代码:

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define ll long long
    using namespace std;
    inline int read(){
        register int x=0,f=1;
        register char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    const int N=55;
    const int mod=1e9+7;
    int n,p[N],C[N][N],dp[N][N];
    int dfs(int len,int low){
        if(dp[len][low]!=-1) return dp[len][low];
        if(len==1) return dp[len][low]=1;
        int &res=dp[len][low];res=0;
        int t[N],m=0;
        for(int i=1;i<=n;i++){
            if(p[i]>=low&&p[i]<len+low){
                t[++m]=p[i];
            }
        }
        for(int j,k,i=1;i<=m;i++){
            swap(t[i],t[i+1]);
            for(j=1;j<=i;j++) if(t[j]>=low+i) break;
            for(k=i+1;k<=m;k++) if(t[k]<low+i) break;
            if(j>i&&k>m){
                ll tmp=((ll)dfs(i,low)*(ll)dfs(m-i,low+i))%mod;
                tmp=tmp*C[m-2][i-1]%mod;
                res=(res+tmp)%mod;
            }
            swap(t[i],t[i+1]);
        }
        return res;
    }
    #define name "swap"
    int main(){
        freopen(name".in","r",stdin);
        freopen(name".out","w",stdout);
        memset(dp,-1,sizeof dp); 
        n=read();
        for(int i=1;i<=n;i++) p[i]=read();
        for(int i=0;i<=n;i++){
            C[i][0]=1;
            for(int j=1;j<=i;j++){
                C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
            }
        }
        dfs(n,0);
        printf("%d",dp[n][0]!=-1?dp[n][0]:0);
        fclose(stdin);
        fclose(stdout);
        return 0;
    }
    /*
    //读懂题目后,暴力30分(改出来的) 
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int N=1e5+10;
    const int mod=1e9+7;
    int n,dn,a[N],b[N],c[N];
    int ans;
    bool judge(){
        for(int i=0;i<n;i++) b[i]=i;
        for(int i=0;i<dn;i++) swap(b[c[i]],b[c[i]+1]);
        for(int i=0;i<n;i++) if(a[i]!=b[i]) return 0;
        return 1;
    }
    #define name "swap"
    int main(){
        freopen(name".in","r",stdin);
        freopen(name".out","w",stdout);
        scanf("%d",&n);
        for(int i=0;i<n;i++) scanf("%d",&a[i]);
        for(int i=0;i<n;i++) b[i]=i;
        dn=n-1;
        for(int i=0;i<dn;i++) c[i]=i;
        do{
            if(judge()) ans++;
            if(ans>=mod) ans-=mod;
        }while(next_permutation(c,c+dn));
        printf("%d",ans);
        fclose(stdin);
        fclose(stdout);
        return 0;
    }*/

     

     

  • 相关阅读:
    prototype.js超强的javascript类库
    MySQL Server Architecture
    Know more about RBA redo block address
    MySQL无处不在
    利用Oracle Enterprise Manager Cloud Control 12c创建DataGuard Standby
    LAMP Stack
    9i中DG remote archive可能导致Primary Database挂起
    Oracle数据库升级与补丁
    Oracle为何会发生归档日志archivelog大小远小于联机重做日志online redo log size的情况?
    Oracle Ksplice如何工作?How does Ksplice work?
  • 原文地址:https://www.cnblogs.com/shenben/p/6066102.html
Copyright © 2011-2022 走看看