洛谷 2827 蚯蚓——相邻两个比较的分析
题目:https://www.luogu.org/problemnew/show/P2827
一眼看到优先队列。可是会被卡吧。
结果没想出来。
优先队列的复杂度在于不停排序。本题的q和p等都是定值。如果能找到什么性质(单调的)避免排序就好了。
需要分析。x>y,先切x再切y的话,x*p+q>y*p+q*p,对于1-p的部分也是一样。
即切出来的部分有单调性。所以再开两个队列存 *p的部分 和 *(1-p)的部分 就行了。
注意还要加上q。记录一个入队时间(弄弄边界)即可。
自己需要分析。列出式子之类的。明确自己要找的是什么(本题:单调性)。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const int N=1e5+5,M=7e6+5; const ll INF=0x7fffffff; int n,m,s,u,v,T,tim[5][N+M],h[5],t[5]; ll q[5][N+M]; bool cmp(ll a,ll b){return a>b;} int rdn() { int ret=0,fx=1;char ch=getchar(); while(ch>'9'||ch<'0'){if(ch=='-')fx=-1;ch=getchar();} while(ch>='0'&&ch<='9')(ret*=10)+=ch-'0',ch=getchar(); return ret*fx; } int main() { n=rdn();m=rdn();s=rdn();u=rdn();v=rdn();T=rdn(); for(int i=1;i<=n;i++)q[0][i]=rdn(),tim[0][i]=1; sort(q[0]+1,q[0]+n+1,cmp); h[0]=1;t[0]=n;h[1]=1;h[2]=1; for(int i=1;i<=m;i++) { int k=-1;ll mx=0; if(h[0]<=t[0]&&q[0][h[0]]+s*(i-tim[0][h[0]])>mx) k=0,mx=q[0][h[0]]+s*(i-tim[0][h[0]]); if(h[1]<=t[1]&&q[1][h[1]]+s*(i-tim[1][h[1]])>mx) k=1,mx=q[1][h[1]]+s*(i-tim[1][h[1]]); if(h[2]<=t[2]&&q[2][h[2]]+s*(i-tim[2][h[2]])>mx) k=2,mx=q[2][h[2]]+s*(i-tim[2][h[2]]); h[k]++;if(i%T==0)printf("%lld ",mx); q[1][++t[1]]=mx*u/v;tim[1][t[1]]=i+1; q[2][++t[2]]=mx-mx*u/v;tim[2][t[2]]=i+1; // for(int i=0;i<3;i++)for(int j=h[i];j<=t[i];j++)printf("q[%d][%d]=%lld,tim=%d\n",i,j,q[i][j],tim[i][j]); } printf("\n"); for(int i=1;i<=n+m;i++) { int k=-1;ll mx=0; if(h[0]<=t[0]&&q[0][h[0]]+s*(m-tim[0][h[0]]+1)>mx) k=0,mx=q[0][h[0]]+s*(m-tim[0][h[0]]+1); if(h[1]<=t[1]&&q[1][h[1]]+s*(m-tim[1][h[1]]+1)>mx) k=1,mx=q[1][h[1]]+s*(m-tim[1][h[1]]+1); if(h[2]<=t[2]&&q[2][h[2]]+s*(m-tim[2][h[2]]+1)>mx) k=2,mx=q[2][h[2]]+s*(m-tim[2][h[2]]+1); h[k]++;if(i%T==0)printf("%lld ",mx); } return 0; }