Codeforces Round #657 (Div. 2)垫底记

A

被这题卡住了,没写出来,想着类似AC自动机了,发现讨论一堆还可能有错。实质上就是每个位置枚举即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const string str="abacaba";
int n;
string s;
bool check(string &a)
{
    int cnt=0;
    for(int i=0;i+7<=n;i++)if(a.substr(i,7)==str)cnt++;
    return cnt==1;
}
int main()
{
    int T;scanf("%d",&T);
    while(T--)
    {
        cin>>n>>s;
        bool has=0;
        for(int i=0;i+7<=n;i++)
        {
            string ss=s;
            bool ok=1;
            for(int j=0;j<7;j++)
            {
                if(ss[i+j]!=str[j]&&ss[i+j]!='?'){ok=0;break;}
                ss[i+j]=str[j];    
            }
            if(ok&&check(ss))
            {
                for(int j=0;j<n;j++)if(ss[j]=='?')ss[j]='d';
                puts("Yes"),cout<<ss<<endl,has=1;
                break;
            }
        }
        if(!has)puts("No");
    }
}
View Code

B

枚举a,判断m被a除的余数看是否符合条件即可

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int T,l,r;
ll m;
int main()
{
    cin>>T;
    while(T--)
    {
        cin>>l>>r>>m;
        int A,B,C;
        for(int a=l;a<=r;a++)
        {
            int rest=m%a;
            if(l+rest<=r&&m/a){A=a,C=l,B=l+rest;break;}
            rest=a-rest;
            if(l+rest<=r){A=a,B=l,C=l+rest;break;}
        }
        cout<<A<<' '<<B<<' '<<C<<endl;
    }
}
View Code

C

发现至多只有一种花买的数量>2,将花按a排序,二分+枚举即可

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+7;
int n,m;
ll ans,sum,s[N];
struct node{int a,b;}a[N];
bool cmp(node a,node b){return a.a==b.a?a.b>b.b:a.a>b.a;}
int main()
{
    int T;scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)scanf("%d%d",&a[i].a,&a[i].b);
        sort(a+1,a+m+1,cmp);
        if(n==1){printf("%d\n",a[1].a);continue;}
        ans=0;
        for(int i=1;i<=m;i++)s[i]=s[i-1]+a[i].a;
        for(int i=1;i<=m;i++)
        {
            if(i<=n&&n<=m&&a[n].a>=a[i].b)ans=max(ans,s[n]);
            else if(i>n&&a[n-1].a>=a[i].b)ans=max(ans,s[n-1]+a[i].a);
            else if(a[i].b>=a[1].a)ans=max(ans,a[i].a+1ll*(n-1)*a[i].b);
            else if(a[i].b<=a[m].a)ans=max(ans,s[m]+1ll*(n-m)*a[i].b);
            else{
                int l=1,r=m,mid;
                while(l<=r)
                {
                    mid=l+r>>1;
                    if(a[mid].a>a[i].b)l=mid+1;
                    else r=mid-1;
                }
                if(i<=r)ans=max(ans,s[r]+1ll*(n-r)*a[i].b);
                else ans=max(ans,s[r]+a[i].a+1ll*(n-r-1)*a[i].b);
            }
        }
        printf("%lld\n",ans);
    }
}
View Code

D

这题就是two-pointers,由于长时间不写题码不出来,于是本场就做出来2题成功垫底,但最终还是订正完了

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
struct node{int id;ll x;}a[N];
deque<int>q;
int n;
bool operator<(node a,node b){return a.x<b.x;}
int main()
{
    ll m,k;
    scanf("%d%*d%lld%lld",&n,&m,&k),m/=2;
    for(int i=1;i<=n;i++)scanf("%*d%lld",&a[i].x),a[i].id=i,a[i].x%=m;
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i++)a[i+n]=a[i],a[i+n].x+=m;
    int l=2,del=n,sz=0,st=0,al=0;
    for(int i=1;i<=n;i++)
    {
        if(q.size()&&q.front()==a[i].id)q.pop_front(),sz--;
        l=max(l,i+1);
        while(a[l].x<=a[i].x+k-1)q.push_back(a[l++].id),sz++;
        if(sz<del)
        {
            if(q.size())al=i+1;
            del=sz,st=(a[i].x+k)%m;
        }
    }
    printf("%d %d\n",del,st);
    if(del)for(int i=al;i<al+del;i++)printf("%d ",a[i].id);
}
View Code

rank460 rating+=513

posted @ 2020-07-20 10:47  hfctf0210  阅读(254)  评论(0编辑  收藏  举报