[SDOI2008]Cave 洞穴勘測

題目描述

輝輝熱衷于洞穴勘測。

某天,他按照地圖來到了一片被標記為JSZX的洞穴群地區。經過初步勘測,輝輝發現這片區域由n個洞穴(分別編號為1到n)以及若干通道組成,并且每條通道連接了恰好兩個洞穴。假如兩個洞穴可以通過一條或者多條通道按一定順序連接起來,那么這兩個洞穴就是連通的,按順序連接在一起的這些通道則被稱之為這兩個洞穴之間的一條路徑。 洞穴都十分堅固無法破壞,然而通道不太穩定,時常因為外界影響而發生改變,比如,根據有關儀器的監測結果,123號洞穴和127號洞穴之間有時會出現一條通道,有時這條通道又會因為某種稀奇古怪的原因被毀。

輝輝有一臺監測儀器可以實時將通道的每一次改變狀況在輝輝手邊的終端機上顯示:

如果監測到洞穴u和洞穴v之間出現了一條通道,終端機上會顯示一條指令 Connect u v

如果監測到洞穴u和洞穴v之間的通道被毀,終端機上會顯示一條指令 Destroy u v

經過長期的艱苦卓絕的手工推算,輝輝發現一個奇怪的現象:無論通道怎么改變,任意時刻任意兩個洞穴之間至多只有一條路徑。

因而,輝輝堅信這是由于某種本質規律的支配導致的。因而,輝輝更加夜以繼日地堅守在終端機之前,試圖通過通道的改變情況來研究這條本質規律。 然而,終于有一天,輝輝在堆積成山的演算紙中崩潰了……他把終端機往地面一砸(終端機也足夠堅固無法破壞),轉而求助于你,說道:“你老兄把這程序寫寫吧”。

輝輝希望能隨時通過終端機發出指令 Query u v,向監測儀詢問此時洞穴u和洞穴v是否連通。現在你要為他編寫程序回答每一次詢問。 已知在第一條指令顯示之前,JSZX洞穴群中沒有任何通道存在。

輸入輸出格式

輸入格式:

第一行為兩個正整數n和m,分別表示洞穴的個數和終端機上出現過的指令的個數。 以下m行,依次表示終端機上出現的各條指令。每行開頭是一個表示指令種類的字符串s("Connect”、”Destroy”或者”Query”,區分大小寫),之后有兩個整數u和v (1≤u, v≤n且u≠v) 分別表示兩個洞穴的編號。

輸出格式:

對每個Query指令,輸出洞穴u和洞穴v是否互相連通:是輸出”Yes”,否則輸出”No”。(不含雙引號)

輸入輸出樣例

輸入樣例#1: 復制
樣例輸入1 cave.in
200	5
Query	123	127
Connect	123	127
Query	123	127
Destroy	127	123
Query	123	127
樣例輸入2 cave.in3 5
Connect	1	2
Connect	3	1
Query	2	3
Destroy	1	3
Query	2	3
輸出樣例#1: 復制
樣例輸出1 cave.out
No
Yes
No樣例輸出2 cave.outYes
No

說明

數據說明

10%的數據滿足n≤1000, m≤20000

20%的數據滿足n≤2000, m≤40000

30%的數據滿足n≤3000, m≤60000

40%的數據滿足n≤4000, m≤80000

50%的數據滿足n≤5000, m≤100000

60%的數據滿足n≤6000, m≤120000

70%的數據滿足n≤7000, m≤140000

80%的數據滿足n≤8000, m≤160000

90%的數據滿足n≤9000, m≤180000

100%的數據滿足n≤10000, m≤200000

保證所有Destroy指令將摧毀的是一條存在的通道

本題輸入、輸出規模比較大,建議c\c++選手使用scanf和printf進行I\O操作以免超時

這題比模板題還簡單

不需要維護很多東西

查詢時只要用pre往上走就行了,看能否走到同一點

數據很小,完全沒問題

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<cmath>
  6 #include<queue>
  7 using namespace std;
  8 int ch[300005][2],pre[300005],n,m;
  9 bool isrt[300005],rev[300005];
 10 void pushdown(int o)
 11 {
 12   if (!o) return;
 13   if (rev[o])
 14     {
 15       int ls=ch[o][0],rs=ch[o][1];
 16       if (ls)
 17     {
 18       rev[ls]^=1;
 19       swap(ch[ls][0],ch[ls][1]);
 20     }
 21       if (rs)
 22     {
 23       rev[rs]^=1;
 24       swap(ch[rs][0],ch[rs][1]);
 25     }
 26       rev[o]=0;
 27     }
 28 }
 29 void push(int o)
 30 {
 31   if (isrt[o]==0)
 32       push(pre[o]);
 33   pushdown(o);
 34 }
 35 void rotate(int o,bool kind)
 36 {
 37   int p=pre[o];
 38   ch[p][!kind]=ch[o][kind];pre[ch[o][kind]]=p;
 39   if (isrt[p]) isrt[o]=1,isrt[p]=0;
 40   else ch[pre[p]][ch[pre[p]][1]==p]=o;
 41   pre[o]=pre[p];
 42   ch[o][kind]=p;pre[p]=o;
 43 }
 44 void splay(int o)
 45 {
 46   push(o);
 47   while (isrt[o]==0)
 48     {
 49       if (isrt[pre[o]])
 50     rotate(o,ch[pre[o]][0]==o);
 51       else
 52     {
 53       int p=pre[o],kind=ch[pre[p]][0]==p;
 54       if (ch[p][kind]==o)
 55         rotate(o,!kind),rotate(o,kind);
 56       else rotate(p,kind),rotate(o,kind);
 57     }
 58     }
 59 }
 60 void access(int o)
 61 {
 62   int y=0;
 63   while (o)
 64     {
 65       splay(o);
 66       isrt[ch[o][1]]=1;isrt[ch[o][1]=y]=0;
 67       o=pre[y=o];
 68     }
 69 }
 70 void makeroot(int o)
 71 {
 72   access(o);
 73   splay(o);
 74   rev[o]^=1;
 75   swap(ch[o][0],ch[o][1]);
 76 }
 77 void link(int x,int y)
 78 {
 79   makeroot(x);
 80   pre[x]=y;
 81 }
 82 void cut(int x,int y)
 83 {
 84   makeroot(x);access(y);splay(y);
 85   pre[x]=0;
 86   ch[y][0]=0;
 87   isrt[x]=1;
 88 }
 89 void query(int x,int y)
 90 {
 91   while (pre[x]!=0) x=pre[x];
 92   while (pre[y]!=0) y=pre[y];
 93   if (x==y) printf("Yes\n");
 94   else printf("No\n");
 95 }
 96 int main()
 97 {int i,c,x,y;
 98   char s[12];
 99   cin>>n>>m;
100   for (i=1;i<=n;i++)
101     isrt[i]=1;
102   for (i=1;i<=m;i++)
103     {
104       scanf("%s%d%d",s,&x,&y);
105       if (s[0]=='Q')
106     {
107       query(x,y);
108     }
109       else if (s[0]=='C')
110     {
111       link(x,y);
112     }
113       else if (s[0]=='D')
114     {
115       cut(x,y);
116     }
117     }
118 }

?

轉載于:https://www.cnblogs.com/Y-E-T-I/p/8296702.html

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

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

相關文章

Linux指令大全

名稱&#xff1a;cat 使用權限&#xff1a;所有使用者 使用方式&#xff1a;cat [-AbeEnstTuv] [--help] [--version] fileName 說明&#xff1a;把檔案串連接后傳到基本輸出&#xff08;螢幕或加 > fileName 到另一個檔案&#xff09; 參數&#xff1a; -n 或 --number 由 …

mysql宏參數_C語言帶參數的宏定義

C語言允許宏帶有參數。在宏定義中的參數稱為“形式參數”&#xff0c;在宏調用中的參數稱為“實際參數”&#xff0c;這點和函數有些類似。對帶參數的宏&#xff0c;在展開過程中不僅要進行字符串替換&#xff0c;還要用實參去替換形參。帶參宏定義的一般形式為&#xff1a;#de…

自定義過濾器

首先在web.xml中對過濾器的監聽 1 <!-- 自定義過濾器 -->2 <filter>3 <filter-name>AscFilter</filter-name>4 <filter-class>com.llh.filter.AscFilter</filter-class>5 </filter>6 <filter-mapping>7 …

[MS Sql Server術語解釋]預讀,邏輯讀,物理讀

在MSSQL中使用 SET STATISTICS IO ON 打開IO統計功能之后&#xff0c;每次執行完一個查詢就會在下面的【消息】面板中顯示本次查詢IO的統計信息。 (0 行受影響) 表 demo。掃描計數 1&#xff0c;邏輯讀取 622 次&#xff0c;物理讀取 0 次&#xff0c;預讀 0 次&#xff0c;lob…

mysql 數據庫查詢測試_MySQL查詢測試經驗

測試表geoinfo,整個表超過1100萬行&#xff0c;表結構&#xff1a;CREATE TABLEgeoinfo (objectidint(11) NOT NULLAUTO_INCREMENT ,latitudedouble NOT NULL,longitudedouble NOT NULL,occupancybit(1) NOT NULL,timedatetime NOT NULL,cabidvarchar(16) NOT NULL,PRIMARY KEY…

更改阿里云域名解析臺里某個域名綁定的IP之后不能解析到新IP

1.由于要撤銷一組負載均衡&#xff0c;所以需要更改阿里云域名解析臺里某個域名由原來綁定的負載均衡公網IP換到服務器公網IP 2.在服務器上nginx指定了域名訪問&#xff0c;開啟nginx服務 3.暫時關閉該組負載均衡服務 4.實現通過服務器IP可以訪問項目&#xff0c;域名訪問不了 …

秒懂數據類型的真諦—Python基礎前傳(4)

一切編程語言都是人設計的&#xff0c;既然是人設計的&#xff0c;那么設計各種功能的時候就一定會有它的道理&#xff0c;那么設計數據類型的用意是什么呢&#xff1f; (一) 基本數據類型 基本數據類型&#xff1a; 數字 int字符串 str布爾值 bool列表 list元組 tuple字典 dic…

Linux 系統命令及其使用詳解(大全)

Linux 系統命令及其使用詳解(大全) (來源: 中國系統分析員) cat cd   chmod chown   cp cut   名稱&#xff1a;cat   使用權限&#xff1a;所有使用者   使用方式&#xff1a;cat[-AbeEnstTuv] [--help] [--version] fileName   說明&#xff1a;把檔案串連…

wordpress配置SMTP服務發送郵件

使用SMTP服務發送郵件&#xff0c;需要使用一個插件&#xff1a;http://wordpress.org/extend/plugins/wp-mail-smtp/ 下載完成以后解壓到plugin目錄&#xff0c;然后在插件中啟用這個插件。 配置SMTP服務 SMTP的選項 發送一封測試郵件吧 >>> 本文轉自齊師傅博客園博客…

使用rpm包安裝mysql_centos下利用rpm包安裝mysql

安裝mysql步驟&#xff1a;第一、 http://www.mysql.com/downloads/mysql-4.0.html下載MySQL-client-5.0.96-1.glibc23.x86_64.rpm和MySQL-server-5.0.96-1.glibc23.x86_64.rpm第二、安裝服務端&#xff1a;[rootlfl01 mysql]# rpm -ivh MySQL-server-5.1.73-1.glibc23.i386.rp…

maxN - 返回數組中N個最大元素 minN - 返回數組中N個最小元素

從提供的數組中返回 n 個最小元素。如果 n 大于或等于提供的數組長度&#xff0c;則返回原數組&#xff08;按降序排列&#xff09;。 結合使用Array.sort() 與展開操作符(...) &#xff0c;創建一個數組的淺克隆&#xff0c;并按降序排列。 使用 Array.slice() 以獲得指定的元…

Linux 常用命令

Linux之所以受到廣大計算機愛好者的喜愛&#xff0c;主要原因有兩個&#xff0c;首先它是自由軟件&#xff0c;用戶不用支付費用就可以使用它&#xff0c;并可根據自己的需要對它進行修改。另外&#xff0c;它具有Unix的全部功能&#xff0c;任何使用Unix系統或想要學習Unix系統…

使用Server 2008新GPO做驅動器映射

在Server 2003的時代&#xff0c;我們為用戶做網絡驅動器映射(以下就直接稱為Map Network Drive&#xff09;, 通常可能有以下的做法. 方法一: 做一個登錄腳本&#xff0c;放在DC的netlogon目錄&#xff0c;接著在“Active Directory用戶和計算機”控制臺的用戶屬性的Logon S…

electron 打包后 __static_electron開發客戶端注意事項(兼開源個人知識管理工具“想學嗎”)...

窗口間通信的問題electron窗口通信比nwjs要麻煩的多electron分主進程和渲染進程&#xff0c;渲染進程又分主窗口的渲染進程和子窗口的渲染進程主窗口的渲染進程給子窗口的渲染進程發消息subWin.webContents.on(dom-ready, () > {subWin.webContents.send(message, {title: s…

180118 有趣的人工智能對話小程序

print(Hello world!) #輸入 print(What is your name?) # ask for their name 詢問名字 myName input()   #該你來回答名字了 print(It is good to meet you, myName)  #根據你的名字來給你打個招呼 print(The length of your name is:)  #然后看下一句 print(len(…

Linux 內核調試器 調試指南

Linux 內核調試器內幕 KDB 入門指南 Hariprasad Nellitheertha (nhariprain.ibm.com), 軟件工程師, IBM簡介&#xff1a; 調試內核問題時&#xff0c;能夠跟蹤內核執行情況并查看其內存和數據結構是非常有用的。Linux 中的內置內核調試器 KDB 提供了這種功能。在本文中您將了解…

學習API HOOK,編寫了一個winsock 的封包抓取程序,可免費使用;

開發環境是:windows 2000 delphi 7 監視API&#xff1a;recv,recvfrom,WSARecvEx,send,sendto,accept,bind,closesocket,connect socket 版本&#xff1a;wsock32.dll/*ws2_32.dll(暫時有兼容問題) 目前還不支持修改封包&#xff1b; 當前實現針對某個進程或多個選定進程的通…

fib函數用python編寫_Python中利用函數裝飾器實現備忘功能

“備忘”的定義“memoization”(備忘)這個詞是由Donald Michie在1968年提出的&#xff0c;它基于拉丁語單詞“memorandum”(備忘錄)&#xff0c;意思是“被記住”。雖然它和單詞“memorization”在某種程度上有些相似&#xff0c;但它并不是該單詞的錯誤拼寫。實際上&#xff0…

MyBatis學習總結(二)——使用MyBatis對表執行CRUD操作

MyBatis學習總結(二)——使用MyBatis對表執行CRUD操作 上一篇博文MyBatis學習總結(一)——MyBatis快速入門中我們講了如何使用Mybatis查詢users表中的數據&#xff0c;算是對MyBatis有一個初步的入門了&#xff0c;今天講解一下如何使用MyBatis對users表執行CRUD操作。本文中使…

cifs mount 掛載共享目錄_安裝cifsutils解決linux掛載windows共享文件夾

1、安裝mount.cifs軟件包yum install cifs-utils -y如果是離線環境&#xff0c;請參考我的另一篇文章https://blog.csdn.net/qq_37119960/article/details/1083313732、開始掛載mount.cifs //192.168.1.110/share /usr/local/winshare -o useradministrator,pass123456參數說明…