Codeforces Round 948 (Div. 2) E. Tensor(思維題-交互)

題目

n(3<=n<=100)個點的有向圖,

圖的邊的關系未知,但保證以下兩點:

1. 只存在j->i(i<j)的邊

2. 對于任意三個點i、j、k(i<j<k),要么k可以到達i,要么k可以到達j,要么j可以到達i

每次你可以詢問兩個點,? i j(i<j),如果j可以到達i,返回YES,否則返回NO

你需要將圖染成黑白兩色,

使得黑色的任意兩個點x、y(x<y),都滿足y可到達x,

且白色的任意兩個點x、y(x<y),都滿足y可到達x

你有最多2n次詢問機會,可以證明答案一定存在

最終輸出n個點染色的情況,輸出0表示染黑色,為1表示染白色

圖不是交互式的,也就是說圖一開始是固定下來的,不會隨詢問的改變而動態變更

實際t(t<=100)組樣例,但保證sumn不超過1000

思路來源

亂搞ac

題解

其實也不完全是算亂搞,一開始wa了,后來看了下數據的反例修了下就過了

首先原圖肯定可以拆分成兩條鏈,這樣對于三個點,一定存在兩點共鏈,就滿足題意了

然后考慮這個圖的形狀可能是怎樣的,一開始是想的雙螺旋結構的

維護兩條鏈,開始只有點n,然后點n-1如果在點n下游就接上去,否則就新開一條鏈,

然后這兩條鏈可以匯集在一點,后續在這點之后繼續擴,類似Y型,

然后Y型后續還能拆成兩個分支,再成兩條鏈,后續兩條鏈再能合并成一個點,重復若干次

然后輸出的話,就沿著點n,往下找一個下游,直接找齊一條鏈,這樣另一條鏈就自然另一種顏色

但是,遇到了一個反例

可以發現,在點5形成Y字型,后接點4之后,新來的點3并沒有續到點4上,

也沒有續到點5上,而是續到了點6上,

此時我找的鏈是10->9->6->5->4->1,就使得另一條鏈8->7和3->2不連通

而此時應該是10->9->6->3->2,另一條鏈8->7->5->4->1

這表明,當出現Y形狀的交點時(也就是圖中的5點)后,代表兩條鏈合成了一條鏈(合并)

這時候這條鏈往下接了點4,

新來的點3,可以接在點4后,也可以接在點5后,也可以接在點6后,也可以接在點7后,

這四種情況,都能使原圖被劃分成兩條鏈,

對于5->4鏈上有多個點的情況,不妨只視為有Y字形交點(點5)、Y字形尾部點(點4)兩個點

因為在鏈中間的點后面續新的點,都可以看成是在交點后面續新的點,不影響兩條鏈的性質

此外注意到,點3的出現,使得一條鏈又變成了兩條鏈(拆分)

這兩條鏈后續仍然可能再形成新的Y字形,也就是分分合合的過程可能出現若干次

所以,做法是:

1. 初始時,點n當第一條鏈的鏈尾

2. 當前如果有兩條鏈,記他們的鏈尾分別為f和s,當前要續的點是i,

(1)i如果能同時往f和s后面續,代表兩條鏈合成了一條

(2)否則,如果能往第一條鏈后面續,就往第一條后面續

(3)否則,如果能往第二條鏈后面續,就往第二條后面續

(4)否則,兩條鏈都續不了,記兩條鏈上一次合并成Y字形交點(也就是上圖的點5)為las,如果能往las后面續,就往las后面續

(5)否則,記las的兩個父親為f1、f2(也就是上圖的點6、點7),如果能往f1后面續,就往f1后面續

(6)否則往f2后面續

3. 如果當前只有一條鏈,能續則續,不能續的時候,新開一條鏈即可

代碼里加了如果不存在則為-1的情況,以及加了詢問的記憶化,統一了部分情況的分類討論

詢問次數想了一下,是不超過2n的,因為最極端的情況是上圖點3不能續到點4后面的情況

此時有4種情況,需要最多詢問3次才能確認是哪種情況,

而這種情況的出現,說明前面有一個只詢問了1次的點,也就是在點5下面的點4,

這兩個點均攤一下,平均次數就不超過2了

代碼

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
typedef long long ll;
typedef double db;
typedef pair<int,int> P;
#define fi first
#define se second
#define pb push_back
#define dbg(x) cerr<<(#x)<<":"<<x<<" ";
#define dbg2(x) cerr<<(#x)<<":"<<x<<endl;
#define SZ(a) (int)(a.size())
#define sci(a) scanf("%d",&(a))
#define pt(a) printf("%d",a);
#define pte(a) printf("%d\n",a)
#define ptlle(a) printf("%lld\n",a)
#define debug(...) fprintf(stderr, __VA_ARGS__)
using namespace std;
const int N=105;
int t,n,col[N];
vector<int>e[N];
int mp[N][N];
char s[10];
void clr(int x){if(x<0)return;e[x].clear();
}
void add(int x,int y){if(x<0)return;e[x].pb(y);
}
bool ask(int i,int j){if(i>j)return 0;if(~mp[i][j])return mp[i][j];printf("? %d %d\n",i,j);fflush(stdout);scanf("%s",s);return mp[i][j]=(strcmp(s,"YES")==0);
}
void out(){printf("! ");rep(i,1,n){printf("%d%c",col[i]," \n"[i==n]);}fflush(stdout);
}
int main(){sci(t);while(t--){memset(col,0,sizeof col);memset(mp,-1,sizeof mp);sci(n);rep(i,1,n)e[i].clear();int f=n,s=-1,las=-1,f1=-1,f2=-1;bool x,y;per(i,n-1,1){x=ask(i,f),y=ask(i,s);if(x && y){add(f,i);add(s,i);las=i,f1=f,f2=s;f=i,s=-1;}else if(x){add(f,i);f=i;}else if(y){add(s,i);s=i;}else{if(las==-1)s=i;else{y=ask(i,las);if(y){add(las,i);s=i;continue;}y=ask(i,f1);if(y){clr(f1);add(f1,i);s=i;}else{clr(f2);add(f2,i);s=i;}}}}for(int i=n;;i=e[i][0]){col[i]=1;if(e[i].empty())break;}out();}return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/19110.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19110.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/19110.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

18 js時間對象

時間對象是一種復雜數據類型&#xff0c;用來存儲時間 創建時間對象 內置構造函數創建 語法&#xff1a;var 時間名new Date() var datenew Date()console.log(date) //Wed May 29 2024 16:03:47 GMT0800 (中國標準時間) 創建指定日期 當參數為數字——>在格林威治的時間基…

知識付費小程序源碼系統 界面支持萬能DIY裝修,一站式運營 附帶完整的源代碼以及搭建教程

系統概述 這是一款功能強大的知識付費小程序源碼系統&#xff0c;它為用戶提供了一個全面的平臺&#xff0c;能夠滿足各種知識付費場景的需求。其界面支持萬能 DIY 裝修&#xff0c;讓用戶可以根據自己的品牌形象和風格進行個性化定制&#xff0c;打造出獨具特色的小程序界面。…

解釋“this”的工作原理,原型繼承如何工作,以及如何實現手寫JS繼承。還包括Array對象自帶的方法列舉,以及如何使用閉包。

1:"this"的工作原理: this 關鍵字指向當前執行上下文的對象,也就是當前函數被調用時所在的對象。this 的值取決于函數的調用方式,不同的調用方式會導致 this 指向不同的對象:作為對象的方法調用,this 指向該對象作為普通函數調用,this 指向全局對象(瀏覽器中是 wind…

愛問云網課加密視頻去除錄屏檢測翻錄工具使用方法

很多伙伴反饋說遇到愛問云的網課&#xff0c;直接打開錄屏工具會被檢測&#xff0c;并且錄出來黑屏。 基于這種情況&#xff0c;可以用我們這個教程翻錄為mp4&#xff0c;可以用到我們的工具。 用這個錄不會被檢測&#xff0c;而且不會黑屏。 提前是必須有授權能正常播放才可…

【云原生】Kubernetes----PersistentVolume(PV)與PersistentVolumeClaim(PVC)詳解

目錄 引言 一、存儲卷 &#xff08;一&#xff09;存儲卷定義 &#xff08;二&#xff09;存儲卷的作用 1.數據持久化 2.數據共享 3.解耦 4.靈活性 &#xff08;三&#xff09;存儲卷的分類 1.emptyDir存儲卷 1.1 定義 1.2 特點 1.3 示例 2.hostPath存儲卷 2.1 …

Leetcode373.查找和最小的 K 對數字

文章目錄 題目描述解題思路代碼 題目鏈接 題目描述 給定兩個以 非遞減順序排列 的整數數組 nums1 和 nums2 , 以及一個整數 k 。 定義一對值 (u,v)&#xff0c;其中第一個元素來自 nums1&#xff0c;第二個元素來自 nums2 。 請找到和最小的 k 個數對 (u1,v1), (u2,v2) … (…

大模型日報2024-05-29

大模型日報 2024-05-29 大模型資訊 大型語言模型在金融預測中將超越人類分析師 摘要: 新研究表明&#xff0c;大型語言模型如ChatGPT在金融預測方面表現優于人類專家&#xff0c;為交易策略提供了寶貴的見解。這意味著未來這些模型將在金融領域發揮更重要的作用&#xff0c;提升…

使用Keepalived提高吞吐量和負載均衡ip_hash.

一 . Nginx使用Keepalived提高吞吐量案例 Keepalived[表示把連接保持一定長連接數來提高吞吐量] 1.1沒有使用keepalived參數 upstream tomcats {server 192.168.28.102:8080; } server {listen 88;server_name www.tomcats.com;location / {proxy_pass http://to…

深入探索JavaScript:精準判斷對象間的“真”相等【含代碼示例】

深入探索JavaScript&#xff1a;精準判斷對象間的“真”相等【含代碼示例】 基本概念與作用說明 與 的區別Object.is()深度比較的必要性 實戰案例&#xff1a;五種深度比較策略案例一&#xff1a;樸素遞歸法案例二&#xff1a;JSON.stringify()法&#xff08;謹慎使用&#xf…

postman教程-6-發送delete請求

領取資料&#xff0c;咨詢答疑&#xff0c;請?wei: June__Go 上一小節我們學習了postman發送put請求的方法&#xff0c;本小節我們講解一下postman發送delete請求的方法。 HTTP DELETE 請求是一種用于刪除指定資源的請求方法。在RESTful API 設計中&#xff0c;DELETE 請求…

tensorboard可視化時save_graph報錯ERROR: Graphs differed across invocations!的一個解決方法

在使用tensorboard可視化&#xff0c;經常會將模型通過save_graph方法保存下來&#xff0c;方便查看結構。在使用save_graph經常會遇到錯誤&#xff08;至少我經常遇到&#xff09;&#xff0c;對于我&#xff0c;最常見的一個錯誤為 Tracing failed sanity checks! ERROR: Gr…

GPT-4o:重塑人機交互的未來

一個愿意佇立在巨人肩膀上的農民...... 一、推出 在人工智能&#xff08;AI&#xff09;領域&#xff0c;自然語言處理&#xff08;NLP&#xff09;技術一直被視為連接人類與機器的橋梁。近年來&#xff0c;隨著深度學習技術的快速發展&#xff0c;NLP領域迎來了前所未有的變革…

ARM-V9 RME(Realm Management Extension)系統架構之系統能力的執行隔離

安全之安全(security)博客目錄導讀 目錄 一、執行隔離 1、安全狀態 2、安全模型 本博客探討 RME 所需的系統能力&#xff0c;以保證 Arm CCA 對于 Realms 的安全性和隔離特性。 一、執行隔離 1、安全狀態 RME 系統支持以下安全狀態&#xff1a; 非安全 (Non-secure)安全…

Orange Pi Kunpeng Pro測評

#創作靈感# 參加樹莓派鯤鵬開發版的測評活動&#xff0c;也想體驗一下該開發版&#xff0c;之前有做過樹莓派和香橙派的開發&#xff0c;剛好借此機會了解一下鯤鵬&#xff0c;所以就有了這篇測評文章。 #正文# 引言 說是測評&#xff0c;其實也沒有多少測評方面的內容&…

前端面試題23-34

23. 說說你對 Promise 的理解 Promise 是 ECMAScript6 引入的一種異步編程解決方案&#xff0c;用于處理異步操作。它表示一個尚未完成但最終會結束的操作&#xff0c;具有三種狀態&#xff1a;pending&#xff08;進行中&#xff09;、fulfilled&#xff08;已完成&#xff0…

代碼隨想錄算法訓練營Day22|235.二叉搜索樹的最近公共祖先、701.二叉搜索樹中的插入操作、450.刪除二叉搜索樹中的節點

二叉搜索樹的最近公共祖先 不考慮二叉搜索樹這一條件的話&#xff0c;普通的二叉搜索樹搜索最近的公共祖先就是昨日的做法&#xff0c;這種做法也能解決二叉搜索樹的最近公共祖先。 class Solution { public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, Tr…

貪心算法02(leetcode122/55/4)

參考資料&#xff1a; https://programmercarl.com/0122.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9A%84%E6%9C%80%E4%BD%B3%E6%97%B6%E6%9C%BAII.html 122. 買賣股票的最佳時機 II 題目描述&#xff1a; 給你一個整數數組 prices &#xff0c;其中 prices[i] 表示某支股票第…

STM32讀寫內部FLASH讀取芯片id

文章目錄 讀寫內部Flash接線程序編寫測試效果補充 讀取芯片id代碼編寫 讀寫內部Flash 接線 程序編寫 首先使用ThisFlash.c來寫入flash的基本操作&#xff0c;寫入、讀取、擦除&#xff0c;然后使用Store.c配合數組來進行主存與flash的交互 ThisFlash.c #include "stm32…

為什么工控現場會用到Profinet轉Modbus網關設備

一、背景&#xff1a; 工控現場之所以需要使用Profinet轉Modbus網關&#xff0c;是因為工控系統中常常存在不同廠家設備之間通訊協議不一致的問題。而Modbus和Profinet分別代表著兩種不同的通信協議&#xff0c;Profinet通常用于較新的設備&#xff0c;而Modbus則是比較老的通…

思科防火墻ASA Version 9.1(1) 怎么配置靜態NAT,把內網ip192.168.1.10 端口1000映射到公網端口1000上?

環境: 思科防火墻5520 ASA Version 9.1(1) 問題描述: 思科防火墻ASA Version 9.1(1) 怎么配置靜態NAT,把內網ip192.168.1.10 端口1000映射到公網端口1000上? 解決方案: 舊版本8.0 1.做之前要先查一下有沒有端口被占用,要和業務確認2.sh Xlate | in 10011 端口 這條…