[NOIp2016提高组]蚯蚓

Posted skylee的OI博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[NOIp2016提高组]蚯蚓相关的知识,希望对你有一定的参考价值。

题目大意:
  给你n个不同长度蚯蚓,每秒从里面取出最长的砍下u/v变成两只,又把剩下的加长q。
  问你在m之前的t,2t,3t...的时间上,砍的蚯蚓长度,
  以及m秒后剩下所有的蚯蚓长度。

思路:
  很容易想到用一个堆来解决,然而这样时间复杂度是O((m+n)log(m+n))的,过不去。
  所以复杂度得是线性的。
  考虑把原来的堆改成三个单调队列。
  每个蚯蚓切成两半总会有一个长的、一个短的。
  我们有q1维护原来的蚯蚓,q2维护砍下来长的一截蚯蚓,q3维护砍下来短的一截蚯蚓。
  不考虑蚯蚓的生长,我们只需要每次砍完蚯蚓扔进去就可以了。
  算长度只要把每个单位时间内增加的长度乘以时间加到蚯蚓上面就可以了。
  由于所有蚯蚓都是一起生长的,所以只要在将其拿出队列时加上即可。

 1 #include<queue>
 2 #include<cstdio>
 3 #include<cctype>
 4 #include<algorithm>
 5 #include<functional>
 6 inline int getint() {
 7     register char ch;
 8     while(!isdigit(ch=getchar()));
 9     register int x=ch^0;
10     while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^0);
11     return x;
12 }
13 const int N=100000;
14 int a[N];
15 std::queue<int> q1,q2,q3;
16 inline int getmax() {
17     if(q1.empty()&&q2.empty()) {
18         const int ret=q3.front();
19         q3.pop();
20         return ret;
21     }
22     if(q1.empty()&&q3.empty()) {
23         const int ret=q2.front();
24         q2.pop();
25         return ret;
26     }
27     if(q2.empty()&&q3.empty()) {
28         const int ret=q1.front();
29         q1.pop();
30         return ret;
31     }
32     if(q1.empty()) {
33         if(q2.front()>q3.front()) {
34             const int ret=q2.front();
35             q2.pop();
36             return ret;
37         }
38         const int ret=q3.front();
39         q3.pop();
40         return ret;
41     }
42     if(q2.empty()) {
43         if(q1.front()>q3.front()) {
44             const int ret=q1.front();
45             q1.pop();
46             return ret;
47         }
48         const int ret=q3.front();
49         q3.pop();
50         return ret;
51     }
52     if(q3.empty()) {
53         if(q1.front()>q2.front()) {
54         }
55         const int ret=q2.front();
56         q2.pop();
57         return ret;
58     }
59     if(q1.front()>=q2.front()&&q1.front()>=q3.front()) {
60         const int ret=q1.front();
61         q1.pop();
62         return ret;
63     }
64     if(q2.front()>=q1.front()&&q2.front()>=q3.front()) {
65         const int ret=q2.front();
66         q2.pop();
67         return ret;
68     }
69     if(q3.front()>=q1.front()&&q3.front()>=q2.front()) {
70         const int ret=q3.front();
71         q3.pop();
72         return ret;
73     }
74     return 0;
75 }
76 int main() {
77     int n=getint(),m=getint(),q=getint(),u=getint(),v=getint(),t=getint();
78     for(register int i=0;i<n;i++) {
79         a[i]=getint();
80     }
81     std::sort(&a[0],&a[n],std::greater<int>());
82     for(register int i=0;i<n;i++) {
83         q1.push(a[i]);
84     }
85     for(register int i=1;i<=m;i++) {
86         const int max=getmax()+q*(i-1);
87         if(!(i%t)) printf("%d ",max);
88         q2.push(std::max(max*u/v-q*i,max-max*u/v-q*i));
89         q3.push(std::min(max*u/v-q*i,max-max*u/v-q*i));
90     }
91     putchar(\n);
92     for(register int i=1;!q1.empty()||!q2.empty()||!q3.empty();i++) {
93         const int max=getmax();
94         if(!(i%t)) printf("%d ",max+q*m);
95     }
96     return 0;
97 } 

 

以上是关于[NOIp2016提高组]蚯蚓的主要内容,如果未能解决你的问题,请参考以下文章

NOIP提高组2016 蚯蚓

NOIP2016提高组day2蚯蚓

洛谷 P2827 蚯蚓(NOIp2016提高组D2T2)

Noip2016 蚯蚓

[Noip2016]蚯蚓

noip2016洛谷P2827蚯蚓