P2827——蚯蚓
wangyitong
2018-08-27 20:31:27
八十分:
直接拿个堆维护一下,以 当前len+当前到最后的时间*q
排序即可,然后每次取出来的时候减去后面即可,因为这样可以保证你每次取出来的都是加过q的,而一直到末尾的原因是他们每一段时候加的都是一样的。而不能记一个时间,然后每次取出来的时候加,因为你有可能取出来的那个不是最大的。但如果我们每次加的话就会挂,所以先加到末尾,最后再减就不会有问题。
但是优先队列多个log啊,然后就疯狂乱t;
不加硬核优化只有75(逃
```cpp
// luogu-judger-enable-o2
%:pragma GCC optimize(3)
%:pragma GCC optimize("Ofast")
%:pragma GCC optimize("inline")
%:pragma GCC optimize("-fgcse")
%:pragma GCC optimize("-fgcse-lm")
%:pragma GCC optimize("-fipa-sra")
%:pragma GCC optimize("-ftree-pre")
%:pragma GCC optimize("-ftree-vrp")
%:pragma GCC optimize("-fpeephole2")
%:pragma GCC optimize("-ffast-math")
%:pragma GCC optimize("-fsched-spec")
%:pragma GCC optimize("unroll-loops")
%:pragma GCC optimize("-falign-jumps")
%:pragma GCC optimize("-falign-loops")
%:pragma GCC optimize("-falign-labels")
%:pragma GCC optimize("-fdevirtualize")
%:pragma GCC optimize("-fcaller-saves")
%:pragma GCC optimize("-fcrossjumping")
%:pragma GCC optimize("-fthread-jumps")
%:pragma GCC optimize("-funroll-loops")
%:pragma GCC optimize("-fwhole-program")
%:pragma GCC optimize("-freorder-blocks")
%:pragma GCC optimize("-fschedule-insns")
%:pragma GCC optimize("inline-functions")
%:pragma GCC optimize("-ftree-tail-merge")
%:pragma GCC optimize("-fschedule-insns2")
%:pragma GCC optimize("-fstrict-aliasing")
%:pragma GCC optimize("-fstrict-overflow")
%:pragma GCC optimize("-falign-functions")
%:pragma GCC optimize("-fcse-skip-blocks")
%:pragma GCC optimize("-fcse-follow-jumps")
%:pragma GCC optimize("-fsched-interblock")
%:pragma GCC optimize("-fpartial-inlining")
%:pragma GCC optimize("no-stack-protector")
%:pragma GCC optimize("-freorder-functions")
%:pragma GCC optimize("-findirect-inlining")
%:pragma GCC optimize("-fhoist-adjacent-loads")
%:pragma GCC optimize("-frerun-cse-after-loop")
%:pragma GCC optimize("inline-small-functions")
%:pragma GCC optimize("-finline-small-functions")
%:pragma GCC optimize("-ftree-switch-conversion")
%:pragma GCC optimize("-foptimize-sibling-calls")
%:pragma GCC optimize("-fexpensive-optimizations")
%:pragma GCC optimize("-funsafe-loop-optimizations")
%:pragma GCC optimize("inline-functions-called-once")
%:pragma GCC optimize("-fdelete-null-pointer-checks")
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#define ri register int
#define int long long
#define max maxx
#define min minn
using namespace std;
const int N=1e6+10;
template <class T> void in(T &x) {
x = 0;
bool f = 0;
char c = getchar();
while (c < '0' || c > '9') {
if (c == '-') f = 1;
c = getchar();
}
while ('0' <= c && c <= '9') {
x = (x << 3) + (x << 1) + (c ^ 48);
c = getchar();
}
if (f) x = -x;
}
inline int maxx(int x,int y) {
return x>y?x:y;
}
inline int minn(int x,int y) {
return x<y?x:y;
}
inline int gcd(int x,int y) {
return !y?x:gcd(y,x%y);
}
int m,n,q,u,v,t,lennow,ans[10*N],cnt;
struct node {
int len;
int t;
bool operator < (const node& b)const {
return len<b.len;
}
} ew[8*N],t1,t2,x;
priority_queue<node> pq;
signed main() {
in(n),in(m),in(q),in(u),in(v),in(t);
// printf("%lf\n",p);
for(ri i=1; i<=n; ++i)
in(ew[i].len),ew[i].t=m-0,ew[i].len+=ew[i].t*q,pq.push(ew[i]);
/*for(ri i=1;i<=n;++i)
cout<<pq.top().len<<endl,pq.pop();*/
for(ri i=1; i<=m; ++i) {
x=pq.top();
//puts(" ");
// printf("%d %d %d\n",i,x.len,x.t);
lennow=x.len;
lennow-=(m-i+1)*q;
//printf("%d \n",lennow);
if(i%t==0)
cout<<lennow<<" ";
pq.pop();
t1.len=lennow*u/v,t1.t=m-i;
t2.len=lennow-t1.len,t2.t=m-i;
t1.len+=t1.t*q;
t2.len+=t2.t*q;
//printf("%d %d\n",t1.len,t1.t);
// printf("%d %d\n",t2.len,t2.t);
pq.push(t1);
pq.push(t2);
}
puts(" ");
while(!pq.empty()) {
cnt++;
if(cnt%t==0)
printf("%lld ",pq.top().len);
pq.pop();
}
puts(" ");
return 0;
}
```
100分:
留坑,代码来源:[ jzzcjb](https://www.luogu.org/space/show?uid=57304)
```cpp
// luogu-judger-enable-o2
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#define ri register int
#define max maxx
#define min minn
using namespace std;
const int N=1e7+10;
template <class T> void in(T &x) {
x = 0;
bool f = 0;
char c = getchar();
while (c < '0' || c > '9') {
if (c == '-') f = 1;
c = getchar();
}
while ('0' <= c && c <= '9') {
x = (x << 3) + (x << 1) + (c ^ 48);
c = getchar();
}
if (f) x = -x;
}
inline int maxx(int x,int y) {
return x>y?x:y;
}
inline int minn(int x,int y) {
return x<y?x:y;
}
inline int gcd(int x,int y) {
return !y?x:gcd(y,x%y);
}
bool cmp(int a,int b) {
return a>b;
}
int n,m,sum,S,u,v,T,q[N],q1[N],q2[N],h,h1,h2,t,t1,t2;
int find() {
return (q[h]>max(q1[h1],q2[h2])&&(h<=t))?q[h++]:((q1[h1]>q2[h2])?q1[h1++]:q2[h2++]);
}
int main() {
in(n),in(m),in(S),in(u),in(v),in(T);
double p=(double)u/v;
t1=t2=0;
t=n;
h=h1=h2=1;
for(ri i=1; i<=n; ++i) scanf("%d",&q[i]);
sort(q+1,q+n+1,cmp);
for(ri i=1; i<=m; ++i) {
int x=find()+sum;
sum+=S;
int a1=p*(double)x,a2=x-a1;
q1[++t1]=(a1-=sum),q2[++t2]=(a2-=sum);
if(i%T==0)printf("%d ",x);
}
puts("");
q1[t1+1]=q2[t2+1]=-0x3f3f3f3f;
for(ri i=1,x=find(); i<=n+m; ++i,x=find())
if(i%T==0)printf("%d ",x+sum);
return 0;
}
```