码迷,mamicode.com
首页 > 其他好文 > 详细

CF4

时间:2020-01-24 17:27:47      阅读:93      评论:0      收藏:0      [点我收藏+]

标签:www   continue   line   ==   while   clu   red   ring   char   

A

A

奇数或者\(2\)\(NO\)

#include<bits/stdc++.h>
using namespace std;
namespace red{
    inline int read()
    {
        int x=0;char ch,f=1;
        for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
        if(ch=='-')f=0,ch=getchar();
        while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
        return f?x:-x;
    }
    int n;
    inline void main()
    {
        n=read();
        if(n&1||n==2) puts("NO");
        else puts("YES");
    }
}
signed main()
{
    red::main();
    return 0;
}

B

B

先都给最少的,然后从前往后加就行了

#include<bits/stdc++.h>
using namespace std;
namespace red{
    inline int read()
    {
        int x=0;char ch,f=1;
        for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
        if(ch=='-')f=0,ch=getchar();
        while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
        return f?x:-x;
    }
    const int N=50;
    int n,sum;
    int a[N],b[N],c[N];
    inline void main()
    {
        n=read(),sum=read();
        for(int i=1;i<=n;++i)
        {
            a[i]=read(),b[i]=read();
        }
        for(int i=1;i<=n;++i)
        {
            c[i]=a[i],sum-=a[i];
        }
        if(sum<0)
        {
            puts("NO");
            return;
        }
        for(int i=1;i<=n&&sum;++i)
        {
            c[i]+=min(sum,b[i]-a[i]);
            sum-=min(sum,b[i]-a[i]);
        }
        if(sum)
        {
            puts("NO");
            return;
        }
        puts("YES");
        for(int i=1;i<=n;++i) printf("%d ",c[i]);
    }
}
signed main()
{
    red::main();
    return 0;
}

C

C

\(map\)

#include<bits/stdc++.h>
using namespace std;
namespace red{
    inline int read()
    {
        int x=0;char ch,f=1;
        for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
        if(ch=='-')f=0,ch=getchar();
        while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
        return f?x:-x;
    }
    int n;
    map<string,int> q;
    string s;
    char t[110];
    int st[100],top,l;
    inline void main()
    {
        n=read();
        for(int i=1;i<=n;++i)
        {
            cin>>s;
            if(!q[s])
            {
                q[s]=1;
                puts("OK");
            }
            else
            {
                int tmp=q[s];
                ++q[s];
                memset(t,0,sizeof(t));  
                while(tmp) st[++top]=tmp%10,tmp/=10;
                l=0;
                while(top) t[l++]=st[top--]+'0';
                cout<<s<<t<<endl;
            }
        }
    }
}
signed main()
{
    red::main();
    return 0;
}

D

D

\(w\)排序以后就是裸的最长严格上升子序列了……

\(n\le 5000\)显然可以直接暴力,然而我还是写了线段树优化……

注意严格上升,当\(w\)与上一位不同时再把上一位\(w\)值加进线段树

#include<bits/stdc++.h>
using namespace std;
namespace red{
#define ls(p) (p<<1)
#define rs(p) (p<<1|1)
#define mid ((l+r)>>1)
    inline int read()
    {
        int x=0;char ch,f=1;
        for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
        if(ch=='-')f=0,ch=getchar();
        while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
        return f?x:-x;
    }
    const int N=1e6+10;
    int aa,bb,tot,n,m,pre;
    int f[N],g[N];
    int ret,w;
    int st[N],top;
    struct node
    {
        int x,y,id;
        inline bool operator < (const node &t) const
        {
            return x<t.x;
        }
    }a[N];
    int ans[N<<2],pos[N<<2];
    inline void update(int d,int l,int r,int p,int k,int w)
    {
        if(l==r)
        {
            if(k>ans[p])
            {
                ans[p]=k;
                pos[p]=w;
            }
            return;
        }
        if(d<=mid) update(d,l,mid,ls(p),k,w);
        else update(d,mid+1,r,rs(p),k,w);
        ans[p]=max(ans[ls(p)],ans[rs(p)]);
        pos[p]=ans[ls(p)]>=ans[rs(p)]?pos[ls(p)]:pos[rs(p)];
    }
    inline node query(int tl,int tr,int l,int r,int p)
    {
        if(!tr) return (node){0,0};
        if(tl<=l&&r<=tr) return (node){ans[p],pos[p]};
        if(tr<=mid) return query(tl,tr,l,mid,ls(p));
        if(tl>mid) return query(tl,tr,mid+1,r,rs(p));
        node tx=query(tl,tr,l,mid,ls(p)),ty=query(tl,tr,mid+1,r,rs(p));
        return tx.x>=ty.x?tx:ty;
    }
    inline void main()
    {
        tot=read(),aa=read(),bb=read();
        for(int x,y,i=1;i<=tot;++i)
        {
            x=read(),y=read();
            if(x<=aa||y<=bb) continue;
            a[++n].x=x,a[n].y=y,a[n].id=i;
            m=max(m,a[n].y);
        }
        if(!n)
        {
            puts("0");
            return;
        }
        sort(a+1,a+n+1);
        pre=1;
        for(int i=1;i<=n;++i)
        {
            if(a[i].x^a[i-1].x)
            {
                for(int j=pre;j<=i-1;++j) update(a[j].y,1,m,1,f[j],j);
                pre=i;
            }
            node t=query(1,a[i].y-1,1,m,1);
            f[i]=f[t.y]+1;
            g[i]=t.y;
            if(f[i]>ret) ret=f[i],w=i;
        }
        printf("%d\n",ret);
        while(w) st[++top]=a[w].id,w=g[w];
        while(top) printf("%d ",st[top--]);
    }
}
signed main()
{
    red::main();
    return 0;
}

CF4

标签:www   continue   line   ==   while   clu   red   ring   char   

原文地址:https://www.cnblogs.com/knife-rose/p/12232357.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!