888
2025-01-26 15:44:45
发布于:陕西
13阅读
0回复
0点赞
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define B N
using namespace std;
const int N=500010;
template<typename T>void read(T &x){
x=0;bool f=0;
char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=1;ch=getchar();}
while(isdigit(ch)){x=x*10+(ch^48);ch=getchar();}
if(f) x=-x;
}
struct node{
int v,id;
};
int cnt;
struct Node{
node p;
int pre,nxt;
}tr[N<<1];
int newcode(node p,int pre,int nxt){tr[++cnt]=(Node){p,pre,nxt}; return cnt;}
struct queue{
int siz,hd,tl;
bool empty(){return !siz;}
void push_front(node p){
if(!siz) hd=tl=newcode(p,0,0);
else tr[hd].pre=newcode(p,0,hd),hd=tr[hd].pre;
++siz;
}
void push_back(node p){
if(!siz) hd=tl=newcode(p,0,0);
else tr[tl].nxt=newcode(p,tl,0),tl=tr[tl].nxt;
++siz;
}
void pop_front(){siz--,hd=tr[hd].nxt;}
void pop_back(){siz--,tl=tr[tl].pre;}
node front(){return tr[hd].p;}
node back(){return tr[tl].p;}
}q[N<<1];
int tot,head[N<<1],nxt[N<<1];
node to[N<<1];
void add(int u,node p){
to[++tot]=p;
nxt[tot]=head[u];
head[u]=tot;
}
int n,m,lst,ct[N],sum[N],rest[N];//rest表示休息点的后缀和 sum表示相加的后缀和
int calc(){
int ans=0;
for(int i=n;i>=1;i--){
if(!sum[i]) ans++,rest[i]=1;
rest[i]+=rest[i+1];
}
if(ans>=m) return 0;
else return 1;
}
void push(int u,node p){
while(!q[u].empty()&&p.v<q[u].back().v) q[u].pop_back();
q[u].push_back(p);
}
node calc(int u,int lim){
for(int i=head[u];i&&to[i].id<=lim;i=nxt[i]) push(u,to[i]),head[u]=i;
while(!q[u].empty()&&q[u].front().id<=lst) q[u].pop_front();
return q[u].empty()?(node){N,N}:q[u].front();
}
node min(node a,node b){return a.v<b.v?a:b;}
int main(){
read(n); read(m);
for(int i=1;i<=n;i++) read(ct[i]),read(sum[i-1]),sum[i-1]=(sum[i-1])?1:-1;
for(int i=n-1;i>=0;i--) sum[i]+=sum[i+1];
for(int i=n;i>=1;i--) add(sum[i]+B,(node){ct[i],i});
int S=sum[0],d=(S!=0)?(int)ceil(1.0*abs(S)/(1.0*m)):calc();
if(d){
for(int i=1;i<m;i++){
node ans=(node){N,N};
for(int j=S-d+B;j<=S+d+B;j++){
if(ceil(abs(1.0*j-B)/(1.0*m-i))<=d) ans=min(ans,calc(j,n-(m-i)));
}
printf("%d ",ans.v);
lst=ans.id,S=sum[lst];
}
}
else{
for(int j=1,i=head[B];j<m;j++){
for(;i&&rest[to[i].id]-1>=m-j;i=nxt[i]) push(B,to[i]);
printf("%d ",q[B].front().v);
q[B].pop_front();
}
}
printf("%d\n",ct[n]);
return 0;
}
加油哦!
这里空空如也
有帮助,赞一个