蚯蚓
# 题意
开始有n只蚯蚓,m次操作,每次选出最大的一条,切分成floor(x*u/v)和x-floor(x*u/v),分别作为新的加入集合,长度可以为0,一个参数t每当t次的时候就输出操作之前的数,
所有操作操作完了以后,从大到小分别输出t的倍数。
# 题解
首先用一个偏移量记录所有数列增加的q的值,因为只有被操作的不加q所以被操作的两个数都减去q,然后开三个队列来分别记录原始序列,和两段切分完后的序列,
显然每次操作完成后的两段分别都是各自队列中的最大值,因为操作的数都没有加q,所以显然正确。
开始时将初始序列从大到下排序
每次操作时只需要将三个中的最大值进行操作
小注意:
1)每次操作的时候都要加上偏移量进行操作,否则会出错
2)加入之前先算出来两个数操作完的数,再减偏移量
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e5+10,M=7e6+10; 4 int n,m,q,t,u,v; 5 int all[N],h0,t0; 6 int que1[M],h1,t1=-1; 7 int que2[M],h2,t2=-1; 8 int delta; 9 bool cmp(int a,int b){ 10 return a>b; 11 } 12 int get(){ 13 int x=INT_MIN; 14 if(h1<=t1) x=max(que1[h1],x); 15 if(h2<=t2) x=max(que2[h2],x); 16 if(h0<=t0) x=max(all[h0],x); 17 18 if(h0<=t0 && x==all[h0]) h0++; 19 else if(h1<=t1 && x==que1[h1]) h1++; 20 else h2++; 21 return x; 22 } 23 int main(){ 24 cin>>n>>m>>q>>u>>v>>t; 25 for(int i=0;i<n;i++) { 26 cin>>all[i]; 27 } 28 sort(all,all+n,cmp); 29 t0=n-1; 30 for(int i=1;i<=m;i++){ 31 int now=get(); 32 now += delta; 33 if(i % t == 0) cout<<now<<' '; 34 int l = now * 1ll * u / v; 35 int r = now - l; 36 delta+=q; 37 l-=delta; 38 r-=delta; 39 que1[++t1]=l; 40 que2[++t2]=r; 41 } 42 cout<<endl; 43 for(int i=1;i<=n+m;i++){ 44 int x=get(); 45 if(i%t==0) 46 cout<<x+delta<<' '; 47 } 48 }