• 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;
    }*/

     

     

  • 相关阅读:
    零侵入性:循环重试功能
    Service有多个实现类,它怎么知道该注入哪个ServiceImpl类
    消息队列经典
    MyBatisplus
    图片存储服务器上
    Spring Boot 保护敏感配置的 4 种方法
    微服务组件
    Optional 实例
    date s 更改时间后不生效
    java运行时 报错 Error: Could not find or load main class test
  • 原文地址:https://www.cnblogs.com/shenben/p/6066102.html
Copyright © 2020-2023  润新知