zoukankan      html  css  js  c++  java
  • 9.5 模拟赛

    T1  屠龙宝刀点击就送

    树状数组求逆序对+大特判 

    #include <algorithm>
    #include <cctype>
    #include <cstdio>
    #define N 205
    using namespace std;
    inline void Read(int &x)
    {
        register char ch=getchar();
        for(x=0;!isdigit(ch);ch=getchar());
        for(;isdigit(ch);x=x*10+ch-'0',ch=getchar());
    }
    int Maxna,Maxnb,tag[N],sum,n,k,a[N],b[N],c[N],all,pos[N],flag;
    inline int lowbit(int x) {return x&(-x);}
    inline int max(int a,int b) {return a>b?a:b;}
    inline int query(int x)
    {
        int ret=0;
        for(;x;x-=lowbit(x)) ret+=tag[x];
        return ret;
    }
    inline void modify(int x,int y) {for(;x<=n;x+=lowbit(x)) tag[x]+=y;}
    int Main()
    {
        Read(n);Read(k);
        for(int i=1;i<=n;++i)
        {
            Read(a[i]);
            if(!a[i]) pos[++all]=i;
            else flag=i,Maxna=max(Maxna,a[i]);
            c[i]=a[i];
        }
        for(int i=1;i<=k;++i) Read(b[i]),Maxnb=max(Maxnb,b[i]);
        if(all==n&&k!=1) {printf("Yes
    ");return 0;}
        if(pos[1]>flag)
        {
            if(k==1&&Maxnb<Maxna) {printf("Yes
    ");return 0;}
            if(k==1&&Maxnb>Maxna) {printf("No
    ");return 0;}
            else {printf("Yes
    ");return 0;}
        }
        sort(b+1,b+1+k);
        for(int i=1;i<=all;++i) a[pos[i]]=b[i],c[pos[i]]=b[i];
        sort(c+1,c+1+n);
        int Size=unique(c+1,c+1+n)-c-1;
        for(int i=n;i>=1;--i)
        {
            int rank=lower_bound(c+1,c+1+Size,a[i])-c;
            if(rank-1) sum+=query(rank-1);
            modify(rank,1);
        }
        if(k>1)
        {
            if(sum>=0) printf("Yes
    ");
            else printf("No
    ");
        }
        else if(sum>0) printf("Yes
    ");
        else printf("No
    ");
        return 0;
    }
    int sb=Main();
    int main() {;}

    T2 屠龙宝刀点击就送

    暴力dfs

    #include <cstdlib>
    #include <cctype>
    #include <cstdio>
    #define N 1005
    
    inline void Read(int &x)
    {
        register char ch=getchar();
        for(x=0;!isdigit(ch);ch=getchar());
        for(;isdigit(ch);x=x*10+ch-'0',ch=getchar());
    }
    bool use[N];
    int n,a[N],b[N],pos[N],all,ans[N];
    bool check()
    {
        int x=0,y=0,z=0;
        for(int i=1;i<=n;++i)
        {
            if(ans[i]==a[i]) x++;
            if(ans[i]==b[i]) y++;
        }
        if((x==n-1)&&(y==n-1)) return 1;
        else return 0;
    }
    void dfs(int num)
    {
        if(num==all+1)
        {
            if(check()) {for(int i=1;i<=n;++i) printf("%d ",ans[i]);exit(0);} 
            return;
        }
        for(int i=1;i<=n;++i)
        {
            if(!use[i])
            {
                use[i]=1;
                ans[pos[num]]=i;
                dfs(num+1);
                use[i]=0;
            }
        }
    }
    int main()
    {
        Read(n);
        for(int i=1;i<=n;++i) Read(a[i]);
        for(int i=1;i<=n;++i)
        {
            Read(b[i]);
            if(a[i]==b[i]) ans[i]=a[i],use[a[i]]=1;
            else pos[++all]=i;
        }
        dfs(1);
        return 0;
    }

    T3 屠龙宝刀点击就送

    正解dp。。自动弃疗

    #include <cstring>
    #include <cstdio>
    #define N 1505
    int pos[27][N],num[27],n,q;
    char str[N],c;
    int main()
    {
        scanf("%d",&n);char ch=getchar();
        for(int i=1;i<=n;++i) scanf("%c",&str[i]),pos[str[i]-'a'][++num[str[i]-'a']]=i;
        scanf("%d",&q);
        for(int x,f,ans;q--;)
        {
            f=ans=0;scanf("%d %c",&x,&c);
            if(x==n-num[c-'a']||n==num[c-'a']) {printf("%d
    ",n);continue;}
            if(num[c-'a']==1) {printf("%d
    ",1+x);continue;}
            for(int i=2;i<=num[c-'a'];++i)
            {
                if(x<=0) break;
                if(pos[c-'a'][i]-pos[c-'a'][i-1]-1<=x) ans+=pos[c-'a'][i]-pos[c-'a'][i-1]-1,x-=pos[c-'a'][i]-pos[c-'a'][i-1]-1,f=i;
                else x--,ans++;
            }
            ans+x+f>=n?printf("%d
    ",n):printf("%d
    ",ans+x+f);
        }
        return 0;
    }
    35分暴力
    #include <cstring>
    #include <cstdio>
    #define N 1505
    int x,f[27][N],n,q;
    char str[N],c;
    bool check(int l)
    {
        int p=c-'a';
        for(int i=1;i<=n-l+1;++i)
         if(f[p][i+l-1]-f[p][i-1]>=l-x) return false;
        return true;
    }
    int main()
    {
        scanf("%d",&n);char ch=getchar();
        for(int i=1;i<=n;++i)
        {
            for(int j=0;j<26;++j) f[j][i]=f[j][i-1];
            scanf("%c",&str[i]);
            ++f[str[i]-'a'][i];
        }
        scanf("%d",&q);
        for(int l,r,mid,ans;q--;)
        {
            scanf("%d %c",&x,&c);
            for(l=0,r=n+1;l<=r;)
            {
                mid=(l+r)>>1;
                if(check(mid)) r=mid-1;
                else l=mid+1;
            }
            printf("%d
    ",l-1);
        }
        return 0;
    }
    “稍微”看题解的二分
    /*
    第一题3次
    
    第二题1次
    
    第三题6次
    
    前两题没看题解。。
    
    自我感觉良好。。
    
    哎 毕竟菜鸡的自我安慰
    */
    我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。
  • 相关阅读:
    天心阁漫步
    大美湘江
    easyui tree基本操作
    盗墓笔记
    半年了
    文件上传控件值发生变化后自动提交表单
    宁静的夏夜
    今天您给别人让座,将来别人给您让座
    优先队列priority_queue 用法详解
    POJ2387
  • 原文地址:https://www.cnblogs.com/ruojisun/p/7482117.html
Copyright © 2011-2022 走看看