2021牛客暑期多校训练营6补题目记录

Hopping Rabbit

#include<bits/stdc++.h>


using namespace std;

const int N=500010;

int ql,qr;


struct node{
    int l,r,x;
};

vector<node> v[N];

struct p{
    int s,len;
}q[N];


void add(int x1,int x2,int y1,int y2){
    v[x1].push_back({y1,y2,1});
    v[x2+1].push_back({y1,y2,-1});
}

void pushup(int i,int l,int r){
    if(q[i].s){
        q[i].len=r-l+1;
    }else if(l==r){
        q[i].len=0;
    }else{
        q[i].len=q[i<<1].len+q[i<<1|1].len;
    }
}


void change(int p,int l,int r,int xx){
    if(ql<=l&&qr>=r){
        q[p].s+=xx;  
        pushup(p,l,r);
        return;
    }

    int mid=(l+r)>>1;
    if(ql<=mid){
        change(p<<1,l,mid,xx);
    }
    if(qr>mid){
        change(p<<1|1,mid+1,r,xx);
    }
    pushup(p,l,r);
}


void get(int p,int l,int r){
    if(q[p].len==0){
        printf("%d\n",l);
        return;
    }

    int mid=(l+r)>>1;
    if(q[p<<1].len<mid-l+1){
        get(p<<1,l,mid);
    }
    else{
        get(p<<1|1,mid+1,r);
    }
}


int main(){

    int n,d;
    scanf("%d %d",&n,&d);
    for(int i=1;i<=n;i++){
        int x1,y1,x2,y2;
        scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
        x2--,y2--;
        if(x2-x1+1>=d){
            x1=0,x2=d-1;
        }


        if(y2-y1+1>=d){
            y1=0,y2=d-1;
        }


        x1=(x1%d+d)%d;
        x2=(x2%d+d)%d;
        y1=(y1%d+d)%d;
        y2=(y2%d+d)%d;


        if(x1<=x2){
            if(y1>y2){
                add(x1,x2,y1,d-1);
                add(x1,x2,0,y2);
            }else{
                add(x1,x2,y1,y2);
            }
        }else{
            if(y1>y2){
                add(x1,d-1,y1,d-1);
                add(x1,d-1,0,y2);
                add(0,x2,y1,d-1);
                add(0,x2,0,y2);
            }else{
                add(x1,d-1,y1,y2);
                add(0,x2,y1,y2);
            }
        }
    }


    for(int i=0;i<d;i++){
        for(int j=0;j<v[i].size();j++){
            ql=v[i][j].l;
            qr=v[i][j].r;

            change(1,0,d-1,v[i][j].x);
        }
        if(q[1].len<d){ 
            printf("YES\n%d ",i);
            get(1,0,d-1);
            return 0;
        }
    }

    puts("NO");
    return 0;
}

Hamburger Steak


#include<bits/stdc++.h>

using namespace std;
typedef long long ll;

struct node{
    ll t;
    int idx;
}Node[100010];

bool cmp(node a,node b){
    return a.t<b.t;
}

struct pan{
    ll k,l,r;
}Pan;

vector<pan> res[100010];

ll tt[100010];

int main(){
    ll n,m;
    scanf("%lld %lld",&n,&m);

    ll mx=0;

    ll sum=0;

    for(int i=1;i<=n;i++){
        scanf("%lld",&Node[i].t);
        mx=max(mx,Node[i].t);
        sum+=Node[i].t;
        Node[i].idx=i;
    }

    ll ave=sum/m;

    if(sum%m) ave++;

    ll ans=max(ave,mx);

    sort(Node+1,Node+1+n,cmp);

    ll now=1;

    for(int i=1;i<=n;i++){
       // cout<<"now:"<<now<<endl;
        if(Node[i].t+tt[now]<=ans){
            Pan={now,tt[now],tt[now]+Node[i].t};
            res[Node[i].idx].push_back(Pan);
            tt[now]+=Node[i].t;
            if(tt[now]==ans) now++;
            continue;
        }

        if(Node[i].t+tt[now]>ans){
            Pan={now,tt[now],ans};
            res[Node[i].idx].push_back(Pan);
            ll tmp=Node[i].t+tt[now]-ans;
            now++;
            Pan={now,0,tmp};
            tt[now]=tmp;
            res[Node[i].idx].push_back(Pan);
        }
    }


    for(int i=1;i<=n;i++){
        printf("%d ",res[i].size());
        if(res[i].size()==1){
            printf("%lld %lld %lld\n",res[i][0].k,res[i][0].l,res[i][0].r);
        }else{
            printf("%lld %lld %lld %lld %lld %lld\n",res[i][1].k,res[i][1].l,res[i][1].r,
            res[i][0].k,res[i][0].l,res[i][0].r);
        }
    }
    return 0;
}
全部评论

相关推荐

起名字真难233:人家只有找猴子的预算,来个齐天大圣他们驾驭不住呀😂😂
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务