Sicily 1431. Interesting Sequence(有趣的數列)
阿新 • • 發佈:2019-02-06
1431. Interesting Sequence(有趣的數列)
Constraints
Time Limit: 1 secs, Memory Limit: 32 MB , Special Judge
Description
Philia這個孩子真是聰明絕頂,在其他夥伴只知道把一列數逐個加起來的和會越來越大的時候,她就知道了其實這個和也會變小的。因為她已經學會了負數啦!愛思考的Philia給自己提出了一個很有趣的問題:是否存在一個長度為n的整數數列,其任意連續p項之和為正數而任意連續q項之和為負數?Philia思考了一下,發現原來不是那麼簡單咧,於是她請教你,世界上最聰明的程式設計師。你思考了片刻,大悟:這不很簡單嗎?看我寫個程式來搞定它!
Input
標準輸入,輸入資料第一行包含一個整數T,表示輸入有T組資料,下面每行一組資料,由三個整數數n, p, q 描述,各資料意義如上述,其中1<=n<=1000000, 1<=p, q<=n.
Output
結果輸出到標準裝置。對應於每組輸入資料,相應結果在同一行輸出。如果這樣的數列存在,則輸出這個數列,要求每一項的絕對值小於10^9, 相鄰兩項間用一個空格隔開,行首行末無多餘空格。如果有多個解,只要輸出任意一個即可。如果這樣的序列不存在,則輸出”Impossible”.
Sample Input
2 6 5 3 4 2 4
Sample Output
-8 18 -12 -8 16 -11 Impossible
Problem Source
<Good Luck, Sysu Teams>,crystal
// Problem#: 1431 // Submission#: 3238446 // The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License // URI: http://creativecommons.org/licenses/by-nc-sa/3.0/ // All Copyright reserved by Informatic Lab of Sun Yat-sen University #include <stdio.h> #include <queue> using namespace std; //sort記錄s[i]的大小, //sort[i]>sort[j]=>s[i]>s[j], //sort[i]-sort[0]=s[i]-s[0]=s[i], //a[i]=sort[i]-sort[i-1]。 int sort[1000001]; int main(){ int t,n,p,q,m,i,j; queue<int> mq; scanf("%d",&t); while(t--){ scanf("%d %d %d",&n,&p,&q); if(p+q<n+2){ printf("Impossible\n"); continue; } m=n; for(i=n-p+1;i<=q-1;i++) mq.push(i); while(!mq.empty()){ //拓撲排序 i=mq.front(); mq.pop(); sort[i]=m--; if(i-p>=0) mq.push(i-p); else if(i+q<=n) mq.push(i+q); } if(m==-1){ for(i=1;i<=n-1;i++) printf("%d ",sort[i]-sort[i-1]); printf("%d\n",sort[n]-sort[n-1]); } else printf("Impossible\n"); } return 0; }