1. 程式人生 > >luogu 2827 蚯蚓 單調隊列/優先隊列

luogu 2827 蚯蚓 單調隊列/優先隊列

d+ space tchar 切割 col get inline urn max

易知可利用優先隊列選取最大值;

但是通過分析可知,先取出的蚯蚓分開後仍然要比後分的長,所以可直接利用單調隊列找隊頭即可,分三個單調隊列,分別找未切割,切割,切割2三種情況

#include<bits/stdc++.h>
#define rep(i,x,y) for(register int i=x;i<=y;i++)
#define ll long long
using namespace std;

const int inf=2147483647;
const int N=1e5+5;
const int M=7e6+5;

int n,m,q,u,v,t,add;
int
Q[3][M],head[3],tail[3]; inline int read(){ int x=0,f=1;char ch=getchar(); while(!isdigit(ch)){if(ch==-)f=-1;ch=getchar();} while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} return x*f;} inline bool cmp(const int &x,const int &y){return x>y;} inline
int getmax(){ int res=-inf,k; for(int i=0;i<=2;i++) if(head[i]<tail[i]&&res<Q[i][head[i]+1]) res=Q[i][head[i]+1],k=i; head[k]++;return res;} int main(){ n=read(),m=read(),q=read(); u=read(),v=read(),t=read(); rep(i,1,n) Q[0][++tail[0]]=read(); sort(Q[
0]+1,Q[0]+1+tail[0],cmp); rep(i,1,m){ int x=getmax()+add; if(i%t==0) printf("%d",x),putchar(i+t>m?\n: ); int l=(ll)x*u/v,r=x-l; Q[1][++tail[1]]=l-add-q; Q[2][++tail[2]]=r-add-q;add+=q; } if(t>m) putchar(\n); int tmp=n+m; rep(i,1,tmp){ int x=getmax()+add; if(i%t==0) {printf("%d",x);if(i+t<=tmp) putchar( );} }return 0; }

luogu 2827 蚯蚓 單調隊列/優先隊列