P7045-[MCOI-03]金牌【構造,互動題】
正題
題目連結:https://www.luogu.com.cn/problem/P7045?contestId=36089
題目大意
n n n個物品有一些顏色,可以詢問 Q Q Q次兩個物品的顏色是否相同,求一個排列是的相鄰的物品顏色不同。其中 Q ≥ 2 n − 2 Q\geq 2n-2 Q≥2n−2
解題思路
對於每一個不在頭尾的物品,我們需要求出兩個與其顏色不同的物品,當我們判斷兩個物品顏色是否相同時,如果不同,那麼我們就各為一個物品找到了一個顏色不同的。如果相同,假設有 k k k個顏色相同的物品,那麼只需要找到 k + 1 k+1 k+1個顏色與他們不同的物品,也就是沒浪費一個詢問找到相同的物品,後面就可以少用一次詢問找不同的物品。所以可以證明如果有解的話那麼一定在 2 n − 2 2n-2 2n−2次可以詢問出答案。
考慮如何實現,我們開一個棧,如果新的物品和棧頂的顏色相同,那麼壓入棧中。否則在序列後面填入一個棧頂元素,如果此時棧為空那麼將新的物品壓入棧中,否則直接填在後面。
對於剩下棧中的元素,我們從前面往後開始找位置填入即可。
時間複雜度 O ( T n ) O(Tn) O(Tn)
c o d e code code
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
using namespace std;
const int N=5e4+10;
int T,n,Q,v[N],z[N],a[N],cnt;
stack<int> s;
int Ask(int x,int y){
int ans;
printf("%d %d\n",x-1,y-1);
fflush(stdout);
scanf("%d",&ans);
return ans;
}
int main()
{
scanf("%d",&T);v[0]=1;
while(T--){
scanf("%d%d",&n,&Q);
for(int i=1;i<=n;i++)
v[i]=z[i]=0;
while(!s.empty())s.pop();
cnt=0;s.push(1);
int lim=1;
for(int i=2;i<=n;i++){
bool z=Ask(s.top(),i);
if(z){
a[++cnt]=s.top();s.pop();
if(s.empty())s.push(i),lim=i;
else a[++cnt]=i;
}
else s.push(i);
}
a[++cnt]=s.top();s.pop();
if(s.empty()){
printf("%d\n",n);
for(int i=1;i<=cnt;i++)
printf("%d ",a[i]-1);
putchar('\n');
fflush(stdout);
continue;
}
for(int i=1;i<lim;i++){
v[i]=Ask(a[i],s.top());
if(v[i]&&v[i-1]){
z[i]=s.top();
s.pop();
if(s.empty())break;
}
}
if(!s.empty()){printf("-1\n");fflush(stdout);continue;}
printf("%d\n",n);
for(int i=1;i<=cnt;i++){
if(z[i])printf("%d ",z[i]-1);
printf("%d ",a[i]-1);
}
putchar('\n');
fflush(stdout);
}
}
相關文章
- CF 構造題
- 構造做題筆記筆記
- C++ 建構函式實戰指南:預設構造、帶引數構造、複製構造與移動構造C++函式
- Lexicography——CF1267L構造題
- CF構造題1600-1800(1)
- 莫隊的 1.5 近似構造 題解
- [譯] 構建流暢的互動介面
- ACM金牌選手整理的【LeetCode刷題順序】ACMLeetCode
- Java--構造器和構造方法Java構造方法
- 互動視訊不能為了互動而互動
- 結構:遊戲核心玩法互動之“骨”遊戲
- 中手遊投資金牌製作人程良奇建立團隊樂府互娛
- 構造方法構造方法
- 構造器
- C++ 移動構造和複製建構函式匹配C++函式
- Streamlit 快速構建互動式頁面的python庫Python
- 互動答題小遊戲怎麼做?遊戲
- 1.31 wlx 魔怔 9 解法互動題小結
- react native ScrollView巢狀WebView 互動問題React Native巢狀WebView
- 手動構造Qtum合約交易的說明QT
- 模型驅動設計的構造塊(上)——DDD模型
- 構造器中呼叫動態繫結的方法
- 構造點,線結構
- codeforces 1438D,思路非常非常巧妙的構造題
- P7044-[MCOI-03]括號【組合數學】
- 互動媒體日常——互動漫畫之對話方塊互動
- 構造有理數~
- java構造器Java
- AUTOCAD——構造線
- 構造方法20201202構造方法
- 如何設計分層架構和互動介面 API ?架構API
- 【題解】金牌導航-高斯消元/Luogu P3232 遊走
- 日曆(設計構造器與預設構造器)
- MyBatis-plus 自動生成 條件構造器 QueryWrapperMyBatisAPP
- SYZOJ - 補充構造迴文串(動態規劃)動態規劃
- Python|Python互動之mongoDB互動詳解PythonMongoDB
- 構造 LL(1) 分析表的步驟與例題解析
- 構建千萬玩家的遊戲體驗——如何推動互動創新?遊戲