1. 程式人生 > >雜題 NOIP2016蚯蚓

雜題 NOIP2016蚯蚓

ont 也會 大小 thml 擁有 hit 一秒 () front

本題中,我們將用符號 c?c? 表示對 cc 向下取整,例如: 3.03.13.93?3.0?=?3.1?=?3.9?=3 。

蛐蛐國最近蚯蚓成災了!隔壁跳蚤國的跳蚤也拿蚯蚓們沒辦法,蛐蛐國王只好去請神刀手來幫他們消滅蚯蚓。

蛐蛐國裏現在共有 nn 只蚯蚓( nn 為正整數)。每只蚯蚓擁有長度,我們設第 ii 只蚯蚓的長度為 aiai? ( i12ni=1,2,,n ),並保證所有的長度都是非負整數(即:可能存在長度為 00 的蚯蚓)。

每一秒,神刀手會在所有的蚯蚓中,準確地找到最長的那一只(如有多個則任選一個)將其切成兩半。神刀手切開蚯蚓的位置由常數 pp (是滿足 0p10<p<1 的有理數)決定,設這只蚯蚓長度為 xx ,神刀手會將其切成兩只長度分別為 px?px? 和 xpxx??px? 的蚯蚓。特殊地,如果這兩個數的其中一個等於 00 ,則這個長度為 00 的蚯蚓也會被保留。此外,除了剛剛產生的兩只新蚯蚓,其余蚯蚓的長度都會增加 qq (是一個非負整常數)。

蛐蛐國王知道這樣不是長久之計,因為蚯蚓不僅會越來越多,還會越來越長。蛐蛐國王決定求助於一位有著洪荒之力的神秘人物,但是救兵還需要 mm 秒才能到來……( mm 為非負整數)

蛐蛐國王希望知道這 mm 秒內的戰況。具體來說,他希望知道:

  • mm 秒內,每一秒被切斷的蚯蚓被切斷前的長度(有 mm 個數);
  • mm 秒後,所有蚯蚓的長度(有 nmn+m 個數)。

蛐蛐國王當然知道怎麽做啦!但是他想考考你……

輸入輸出格式

輸入格式:

第一行包含六個整數 nmquvtn,m,q,u,v,t ,其中: nmqn,m,q 的意義見【問題描述】; uvtu,v,t 均為正整數;你需要自己計算 pu/vp=u/v (保證 0uv0<u<v ); tt 是輸出參數,其含義將會在【輸出格式】中解釋。

第二行包含 nn 個非負整數,為 a1a2ana1?,a2?,,an? ,即初始時 nn 只蚯蚓的長度。

同一行中相鄰的兩個數之間,恰好用一個空格隔開。

保證 1n1051n105 , 0m71060m7×106 , 0uv1090<u<v109 , 0q2000q200 , 1t711t71 , 0ai1080ai?108 。

  這道題我看到第一反應是優先隊列,但是網上說只能過80分,肖大佬只過了65分。

  其實就是開三個隊列,一個是原本的那些數按大小排序,一個是px,一個是x - px。每次取三個隊首最大來分配,計數器記錄在特定時候輸出即可。

  其中第一個可以用單調隊列,後兩個如果也用單調隊列沒有意義,而且會TLE4個點,期望得分80。

  代碼如下:

  1 #include<cstdio>
  2 #include<algorithm>
  3 #include<cmath>
  4 #include<queue>
  5 using namespace std;
  6 typedef long long ll;
  7 ll read()
  8 {
  9     ll a = 0,b = 1;
 10     char c = getchar();
 11     while(c < 0 or c > 9)
 12     {
 13         if(c == -) b = -1;
 14         c = getchar();
 15     }
 16     while( c >= 0 and c <= 9)
 17     {
 18         a = a*10 + c -0;
 19         c = getchar();
 20     }
 21     return a * b;
 22 }
 23 ll maxn (ll a, ll b, ll c)
 24 {
 25     ll t = max(a,b);
 26     return max(t, c);
 27 }
 28 ll n,m,q,u,v,t,a,dq = 0,cnt = 1,t1,t2,t3;
 29 int main()
 30 {
 31     priority_queue<ll>k[2];
 32     queue<ll>k1[4];
 33     n = read(); m = read(); q = read();u = read(); v = read(); t = read();
 34     for(int i=1; i<=n; i++)
 35     {
 36         a = read();
 37         k[1].push(a);
 38     }
 39     while(cnt <= m)
 40     {
 41         if(cnt == 1)
 42         {
 43             t1 = k[1].top();
 44             t2 = k[1].top();
 45             t3 = k[1].top();
 46         }
 47         else
 48         {
 49             t1 = !k[1].empty() ? k[1].top() : -1000000000;
 50             t2 = !k1[2].empty() ? k1[2].front() : -1000000000;
 51             t3 = !k1[3].empty() ? k1[3].front() : -1000000000;
 52         }
 53 //        printf("%lld %lld %lld\n", t1, t2, t3);
 54         if(cnt % t == 0)
 55         printf("%lld ",maxn(t1,t2,t3) + dq);
 56         if(t1 == maxn(t1,t2,t3))
 57         {
 58             t1 = t1 + dq;
 59             k1[2].push(t1*u/v - q - dq);
 60             k1[3].push(t1 - (t1 * u / v) -dq - q);
 61             k[1].pop();
 62         }
 63         else
 64         {
 65             if(t2  == maxn(t1,t2,t3))
 66             {
 67                 t2 = t2+dq;
 68                 k1[2].pop();
 69                 k1[2].push(t2*u/v - q - dq);
 70                 k1[3].push(t2 - (t2 * u / v) - q - dq);
 71             }
 72             else
 73             {
 74                 k1[3].pop();
 75                 t3+=dq;
 76                 k1[2].push(t3*u/v-dq-q);
 77                 k1[3].push(t3 - (t3 * u / v)- dq - q);
 78             }
 79         }
 80         dq+=q;
 81         cnt++;
 82     }
 83     printf("\n");
 84     ll tm = 1;
 85     while(tm <= m + n)
 86     {
 87         t1 = !k[1].empty() ? k[1].top() : -1000000000;
 88         t2 = !k1[2].empty() ? k1[2].front() : -1000000000;
 89         t3 = !k1[3].empty() ? k1[3].front() : -1000000000;
 90         if(t1 == maxn(t1,t2,t3))
 91         {
 92             if(tm % t == 0)
 93             printf("%lld ",t1 + dq);
 94             k[1].pop();
 95         }
 96         else
 97         {
 98             if(t2 == maxn(t1,t2,t3))
 99             {
100                 if(tm%t == 0)
101                 printf("%lld ",t2 + dq);
102                 k1[2].pop();
103             }
104             else
105             {
106                 if(tm%t == 0)
107                 printf("%lld ",t3 + dq);
108                 k1[3].pop();
109             }
110         }
111         tm++;
112     }
113     return 0;
114 }

雜題 NOIP2016蚯蚓