iwtgm-1

Codeforces Beta Round 72 (Div. 2 Only)

A.

A射杀B的一半,B剩下的一半射杀A的一半,A剩下的一半再射杀B剩下的一半
2*n分成4份,3次射杀机会分别射杀一份

void solve()
{
    int n;cin>>n;
    cout<<n*2-n/2;
}

或者

void solve()
{
    int n;cin>>n;
    cout<<2*n/4*3;
}

B.

存下相同连续序列的长度,一个序列贡献是n*(n+1)/2,求总和
要开long long,wa一发

int a[N];
vector<int>v;
void solve()
{
    int n;cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    int tmp=1;
    a[n+1]=1e9+5;
    for(int i=2;i<=n+1;i++){
        if(a[i]==a[i-1])tmp++;
        else{
            if(tmp>1)v.push_back(tmp);
            tmp=1;
        }
    }
    ll ans=n;
    for(int i=0;i<v.size();i++){
        ans+=(v[i]-1)*v[i]/2;
    }
    cout<<ans;
}

C.

对于一个target,圆心横坐标-r到圆心横坐标+r,每一个值都用map映射到一个vector里的结构体,结构体里存储这个target的信息
把输入坐标从后往前遍历
对于每一个坐标,去遍历所映射的vector里的所有结构体,看这个点在不在这个圆上,若在,更新ans数组

struct node{
    int o,r,idx;
};
map<int,vector<node>>mp;
pair<int,int>p[N];
int ans[M];
void solve()
{
    memset(ans,-1,sizeof(ans));
    int n;cin>>n;
    for(int i=1;i<=n;i++){
        struct node tmp;
        cin>>tmp.o>>tmp.r;
        tmp.idx=i;
        for(int j=tmp.o-tmp.r;j<=tmp.o+tmp.r;j++){
            mp[j].push_back(tmp);
        }
    }
    int m;cin>>m;
    for(int i=1;i<=m;i++)cin>>p[i].first>>p[i].second;
    for(int i=m;i>=1;i--){
        for(int j=0;j<mp[p[i].first].size();j++){
            int a=mp[p[i].first][j].o,b=0,r=mp[p[i].first][j].r,idx=mp[p[i].first][j].idx;
            int x=p[i].first,y=p[i].second;
            if(sqrt((x-a)*(x-a)+(y-b)*(y-b))<=r)ans[idx]=i;
        }
    }
    int res=0;
    for(int i=1;i<=n;i++){
        if(ans[i]!=-1)res++;
    }
    cout<<res<<endl;
    for(int i=1;i<=n;i++){
        cout<<ans[i]<<' ';
    }
}

D.

记录下总的看诊次数和动物最多看病的次数
如果总诊数<k,输出-1

k时,重点是在次数参差不齐的情况下如何知道k次看诊后的情况
这里用到看病次数的二分,设为mid
所有动物前mid次看病总和>=k了,就可以记录答案了
可以多记录几个,然后后面重复的就不再输出,避免遗漏
把题目要求的输出读错了,一直认为会超时,
后面有读错了,debug之后终于找到了正确输出,
好在AC

ll a[N];
vector<ll>v;
map<ll,int>mp;
void solve()
{
    ll n,k;cin>>n>>k;
    ll sum=0;
    ll ma=-1;
    for(int i=1;i<=n;i++){
        cin>>a[i];sum+=a[i];ma=max(ma,a[i]);
    }
    if(sum<k){
        cout<<-1;return ;
    }
    ll l=1,r=ma,mid;
    ll p;
    while(l<=r){
        mid=(l+r)/2;
        ll tmp=0;
        for(int i=1;i<=n;i++){
            if(a[i]>=mid)tmp+=mid;
            else tmp+=a[i];
        }
        if(tmp<k)l=mid+1;
        else if(tmp==k){
            p=mid+1;break;
        }else {
            p=mid;r=mid-1;
        }
    }
    //cout<<"p="<<p<<endl;
    ll tmp=0;
    for(int i=1;i<=n;i++){
        if(a[i]>=p-1)tmp+=p-1;
        else tmp+=a[i];
    }
    //cout<<"tmp="<<tmp<<endl;
    for(int i=1;i<=n;i++){
        if(a[i]>=p){
            tmp++;
            if(tmp>k)v.push_back(i);
        }
    }
    for(int i=1;i<=n;i++){
        if(a[i]>=p+1)v.push_back(i);
    }
    for(int i=0;i<v.size();i++){
        //cout<<"i="<<i<<' '<<"mp[i]="<<mp[i]<<endl;
        if(mp[v[i]]==0){
            cout<<v[i]<<' ';mp[v[i]]=1;
        }else break;
    }
}
posted @ 2023-11-02 13:21  WW爆米花  阅读(7)  评论(0编辑  收藏  举报