NOIP2016 T5 蚯蚓
2017-07-28 15:09
357 查看
解题报告
如果光用优先队列会超时。可以发现如果先排序,那每条蚯蚓按比例切开后的[px]和x-[px]仍分别单调递减,所以可以开3个队列分别放原始长度,[px]部分和x-[px]部分,每次取三个队首中最长的即可。
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<cmath> using namespace std; int getint() { int i=0,f=1;char c; for(c=getchar();(c>'9'||c<'0')&&c!='-';c=getchar()); if(c=='-')f=-1,c=getchar(); for(;c>='0'&&c<='9';c=getchar())i=(i<<1)+(i<<3)+c-'0'; return i*f; } const int N=8e6+5,INF=0x3f3f3f3f; int n,m,q,u,v,t,h1,h2,h3,t1,t2,t3,delta; int q1 ,q2 ,q3 ; double p; bool cmp(const int &a,const int &b) { return a>b; } int getmax() { int a=-INF,b=-INF,c=-INF,x; if(h1<t1)a=q1[h1+1]+delta; if(h2<t2)b=q2[h2+1]+delta; if(h3<t3)c=q3[h3+1]+delta; x=max(a,max(b,c)); if(x==a)h1++; else if(x==b)h2++; else h3++; return x; } int main() { //freopen("lx.in","r",stdin); n=getint(),m=getint(),q=getint(),u=getint(),v=getint(),t=getint(); p=u*1.0/v; for(int i=1;i<=n;i++)q1[++t1]=getint(); sort(q1+1,q1+t1+1,cmp); for(int i=1;i<=m;i++) { int x=getmax(); int tmp=(long long)x*u/v; delta+=q; q2[++t2]=tmp-delta; q3[++t3]=x-tmp-delta; if(i%t==0)cout<<x<<" "; } cout<<'\n'; for(int i=1;i<=n+m;i++) { int x=getmax(); if(i%t==0)cout<<x<<" "; } return 0; }
相关文章推荐
- NKOJ 4241 (NOIP 2016)蚯蚓(单调队列)
- 【NOIP】提高组2016 蚯蚓
- NOIP 2016 蚯蚓 (luogu 2827 & uoj 264) - 鬼畜的优化
- 【BZOJ】4721: [Noip2016]蚯蚓
- BZOJ4721 [Noip2016]蚯蚓
- [NOIP2016]蚯蚓 D2 T2 队列
- 洛谷 2827 [NOIP2016] 蚯蚓 队列模拟
- 【NOIP2016】蚯蚓(单调队列)
- noip2016 Day2 T2:蚯蚓 (归并)
- NOIP2016 day2 t2蚯蚓
- 2016noip蚯蚓《单调队列》
- bzoj4721 [Noip2016]蚯蚓
- bzoj4721 [Noip2016]蚯蚓
- BZOJ 4721: [Noip2016]蚯蚓 乱搞
- 【noip2016】蚯蚓
- NOIP2016 蚯蚓
- [noip2016]蚯蚓——单调队列
- ssl 2599 noip 2016 day1 蚯蚓
- NOIP 2016提高组 Day2 蚯蚓
- BZOJ 4721 [Noip2016]蚯蚓 单调队列