zoukankan      html  css  js  c++  java
  • Codeforces Round #451 (Div. 2)

    水题场。。。。

    结果因为D题看错题意,B题手贱写残了。。。现场只出了A,C,E

    A:水题。。

    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define mp make_pair
    #define pb push_back
    #define pi acos(-1.0)
    #define ll long long
    #define mod 1000000007
    #define C 0.5772156649
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #define pil pair<int,ll>
    #define pii pair<int,int>
    #define ull unsigned long long
    #define base 1000000000000000000
    #define fio ios::sync_with_stdio(false);cin.tie(0)
    
    using namespace std;
    
    const double g=10.0,eps=1e-12;
    const int N=200000+10,maxn=90000+10,inf=0x3f3f3f3f;
    
    
    int main()
    {
        int n;
        scanf("%d",&n);
        int s=n%10;
        if(s<10-s)printf("%d
    ",n-s);
        else printf("%d
    ",n+10-s);
        return 0;
    }
    /********************
    
    ********************/
    A

    B:水题。。。直接暴力,不用exgcd

    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define mp make_pair
    #define pb push_back
    #define pi acos(-1.0)
    #define ll long long
    #define mod 1000000007
    #define C 0.5772156649
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #define pil pair<int,ll>
    #define pii pair<int,int>
    #define ull unsigned long long
    #define base 1000000000000000000
    #define fio ios::sync_with_stdio(false);cin.tie(0)
    
    using namespace std;
    
    const double g=10.0,eps=1e-12;
    const int N=200000+10,maxn=90000+10,inf=0x3f3f3f3f;
    
    
    int main()
    {
        ll n,a,b;
        scanf("%lld%lld%lld",&n,&a,&b);
        for(ll i=0;i<=10000000;i++)
        {
            if(n-b*i>=0&&(n-b*i)%a==0)
            {
                puts("YES");
                printf("%lld %lld
    ",(n-b*i)/a,i);
                return 0;
            }
        }
        puts("NO");
        return 0;
    }
    /********************
    
    ********************/
    B

    C:把同一个人的电话合在一起,一个电话是另一个电话的后缀代表相同,直接暴力模拟即可

    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define mp make_pair
    #define pb push_back
    #define pi acos(-1.0)
    #define ll long long
    #define mod 1000000007
    #define C 0.5772156649
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #define pil pair<int,ll>
    #define pii pair<int,int>
    #define ull unsigned long long
    #define base 1000000000000000000
    #define fio ios::sync_with_stdio(false);cin.tie(0)
    
    using namespace std;
    
    const double g=10.0,eps=1e-12;
    const int N=30+10,maxn=90000+10,inf=0x3f3f3f3f;
    
    map<string,int>ma;
    string s[N];
    vector<string>v[N];
    bool ok[2000+10];
    bool cmp(string a,string b)
    {
        return a.size()>b.size();
    }
    int main()
    {
        fio;
        int n,sz=0;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            string p;
            cin>>p;
            if(ma[p])
            {
                int id=ma[p],k;
                cin>>k;
                while(k--)
                {
                    cin>>p;
                    v[id].pb(p);
                }
            }
            else
            {
                s[++sz]=p;
                ma[p]=sz;
                int k;
                cin>>k;
                while(k--)
                {
                    cin>>p;
                    v[sz].pb(p);
                }
            }
        }
        cout<<sz<<"
    ";
        for(int i=1;i<=sz;i++)
        {
            sort(v[i].begin(),v[i].end(),cmp);
            memset(ok,1,sizeof ok);
            for(int j=0;j<v[i].size();j++)
            {
                for(int k=j+1;k<v[i].size();k++)
                {
                    string a=v[i][j],b=v[i][k];
                    if(a.size()>=b.size())
                    {
                        if(a.substr(a.size()-b.size(),b.size())==b)ok[k]=0;
                    }
                }
            }
            cout<<s[i]<<" ";
            int ans=0;
            for(int j=0;j<v[i].size();j++)if(ok[j])ans++;
            cout<<ans<<" ";
            for(int j=0;j<v[i].size();j++)
                if(ok[j])
                    cout<<v[i][j]<<" ";
            cout<<"
    ";
        }
        return 0;
    }
    /********************
    
    ********************/
    C

    D:题意:一整天内,如果连续m分钟里,闹钟响了k次,那么人会被吵醒,要使人不被吵醒找到最小需要关闭的闹钟个数

    题解:先sort,然后边处理边维护前缀和,处理的时候找到,当前到前m时刻有多少个闹钟,如果已经有k-1个,那么当前闹钟必须被关闭,可以简略的证明,如果一个闹钟对两个时间段有影响,那么它一定在两个时间段相交的部分里,所以,前缀和维护 是可行的

    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define mp make_pair
    #define pb push_back
    #define pi acos(-1.0)
    #define ll long long
    #define mod 1000000007
    #define C 0.5772156649
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #define pil pair<int,ll>
    #define pii pair<int,int>
    #define ull unsigned long long
    #define base 1000000000000000000
    #define fio ios::sync_with_stdio(false);cin.tie(0)
    
    using namespace std;
    
    const double g=10.0,eps=1e-12;
    const int N=200000+10,maxn=90000+10,inf=0x3f3f3f3f;
    
    int a[N],sum[N*10];
    bool ok[N*10];
    int main()
    {
        int n,m,k;
        scanf("%d%d%d",&n,&m,&k);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            ok[a[i]]=1;
        }
        sort(a+1,a+1+n);
        int ans=0;
        for(int i=1;i<=1000000;i++)
        {
            if(!ok[i])sum[i]=sum[i-1];
            else
            {
              //  cout<<sum[i-1]<<"----"<<sum[max(0,i-m)]<<"+++
    ";
                if(sum[i-1]-sum[max(0,i-m)]==k-1)
                {
                    ans++;
                    sum[i]=sum[i-1];
                }
                else sum[i]=sum[i-1]+1;
            }
        }
        printf("%d
    ",ans);
        return 0;
    }
    /********************
    
    ********************/
    D

    E:题意:n个数,每次操作对一个数+1或-1,要求最小操作次数使得n个数里有n/2个是完全平方数

    题解:对于每一个数,如果是完全平方数,我们维护最小需要多少次操作使他变成不是完全平方数,否则,看最小多少次操作变成完全平方数,然后sort一下,比较即可

    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define mp make_pair
    #define pb push_back
    #define pi acos(-1.0)
    #define ll long long
    #define mod 1000000007
    #define C 0.5772156649
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #define pil pair<int,ll>
    #define pii pair<int,int>
    #define ull unsigned long long
    #define base 1000000000000000000
    #define fio ios::sync_with_stdio(false);cin.tie(0)
    
    using namespace std;
    
    const double g=10.0,eps=1e-12;
    const int N=200000+10,maxn=90000+10,inf=0x3f3f3f3f;
    
    ll a[N];
    map<ll,ll>ma;
    ll c[N],po[N];
    vector<ll>issq,notsq;
    int main()
    {
        for(ll i=0;i<=40000;i++)ma[i*i]=i,po[i]=i*i;
        ll n,sq=0;
        scanf("%lld",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%lld",&a[i]);
            if(ma[a[i]]||a[i]==0)
            {
                sq++;
                if(a[i]==0)c[i]=2;
                else c[i]=1;
                issq.pb(c[i]);
            }
            else
            {
                int id=lower_bound(po,po+40001,a[i])-po;
                c[i]=min(po[id]-a[i],a[i]-po[id-1]);
                notsq.pb(c[i]);
            }
        }
        sort(issq.begin(),issq.end());
        sort(notsq.begin(),notsq.end());
        ll ans=0;
        if(sq>n/2)
        {
            for(int i=0;i<sq-n/2;i++)
                ans+=issq[i];
        }
        else
        {
            for(int i=0;i<n/2-sq;i++)
                ans+=notsq[i];
        }
        printf("%lld
    ",ans);
        return 0;
    }
    /********************
    
    ********************/
    View Code

    F:题意:有一个很长的数,要求插入+,=使条件满足a+b=c,所有数不能有前导零

    题解:对于长度为sz的数c,a要么长度为sz,sz-1,b要么长度sz,sz-1,只有四种情况(想到了这一点,但是高精度把我搞蒙蔽了,还是tle,学到了新姿势字符串Hash)

    字符串Hash方便的判断两个字符串是否相同,推荐博客:字符串hash

    我们以10为底,这样就可以满足线性关系了

    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define mp make_pair
    #define pb push_back
    #define pi acos(-1.0)
    #define ll long long
    #define mod 1000000007
    #define C 0.5772156649
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #define pii pair<int,int>
    #define ull unsigned long long
    #define base 1000000000000000000
    #define fio ios::sync_with_stdio(false);cin.tie(0)
    
    using namespace std;
    
    const double g=10.0,eps=1e-12;
    const int N=1000000+10,maxn=200000+10,inf=0x3f3f3f3f;
    const ll ba=10;
    
    ll p[N],Hash[N];
    string s;
    void init()
    {
        p[0]=1,Hash[0]=s[0]-'0';
        for(int i=1;i<=1000000+3;i++)p[i]=p[i-1]*ba%mod;
        for(int i=1;i<s.size();i++)
        {
            Hash[i]=Hash[i-1]*ba%mod+s[i]-'0';
            if(Hash[i]>=mod)Hash[i]-=mod;
        }
    }
    bool check(int a,int b)
    {
        //cout<<a<<" "<<b<<endl;
        if(s[0]=='0'&&a!=1)return 0;
        if(s[a]=='0'&&b-a!=1)return 0;
        ll aa=Hash[a-1],bb=(Hash[b-1]-Hash[a-1]*p[b-a]%mod)%mod;
        ll cc=(Hash[s.size()-1]-Hash[b-1]*p[s.size()-b]%mod)%mod;
      //  cout<<(aa+bb+mod)%mod<<"++++++ "<<(cc+mod)%mod<<endl;
        return (aa+bb+mod)%mod==(cc+mod)%mod;
    }
    int main()
    {
        fio;
        cin>>s;
        init();
        for(int i=0;i<s.size();i++)
        {
            int sz=s.size()-i;
            if(2*sz<s.size())
            {
                int a=sz,b=s.size()-sz;
                if(a<=sz&&b-a<=sz&&check(a,b))
                {
                    cout<<s.substr(0,a)<<"+"<<s.substr(a,b-a)<<"="<<s.substr(b,s.size())<<"
    ";
                    return 0;
                }
                a=s.size()-2*sz,b=s.size()-sz;
                if(a<=sz&&b-a<=sz&&check(a,b))
                {
                    cout<<s.substr(0,a)<<"+"<<s.substr(a,b-a)<<"="<<s.substr(b,s.size())<<"
    ";
                    return 0;
                }
            }
            if(2*sz-1<s.size())
            {
                int a=sz-1,b=s.size()-sz;
                if(a<=sz&&b-a<=sz&&check(a,b))
                {
                    cout<<s.substr(0,a)<<"+"<<s.substr(a,b-a)<<"="<<s.substr(b,s.size())<<"
    ";
                    return 0;
                }
                a=s.size()-2*sz+1,b=s.size()-sz;
                if(a<=sz&&b-a<=sz&&check(a,b))
                {
                    cout<<s.substr(0,a)<<"+"<<s.substr(a,b-a)<<"="<<s.substr(b,s.size())<<"
    ";
                    return 0;
                }
            }
        }
        return 0;
    }
    /********************
    
    ********************/
    F
  • 相关阅读:
    优化慢执行或慢查询的方法
    Top K问题的两种解决思路
    优先队列实现 大小根堆 解决top k 问题
    进程间的八种通信方式----共享内存是最快的 IPC 方式
    二叉树基础之按层打印
    按层打印二叉树--每行打印一层
    给定一颗完全二叉树,给每一层添加上next的指针,从左边指向右边
    缓存与数据库一致性保证
    一致性哈希算法原理
    Linux复制指定目录下的文件夹结构
  • 原文地址:https://www.cnblogs.com/acjiumeng/p/8056469.html
Copyright © 2011-2022 走看看