日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Codeforces 1338E JYPnation (图论)

發(fā)布時(shí)間:2025/3/15 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Codeforces 1338E JYPnation (图论) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

UPD 2020.04.30:本題解被發(fā)現(xiàn)存在嚴(yán)重錯(cuò)誤,已更正。

題目鏈接

https://codeforces.com/contest/1338/problem/E

題解

這題太神了……這才是 div1E 啊,比什么 nim 積意義下的離散對(duì)數(shù)之類的高明到不知道哪里去了
這篇題解主要復(fù)述一下官方題解并補(bǔ)充一下官方題解上省略的證明。所有證明都是蒟蒻口胡的,有問(wèn)題敬請(qǐng)指出。

下面把題目保證不存在的那個(gè) 444 個(gè)點(diǎn)的子圖稱作 HHH,用四元組表示 HHH 時(shí),默認(rèn)最后一個(gè)點(diǎn)入度為 333;整張圖的點(diǎn)集記作 VVV. 設(shè)一個(gè)點(diǎn) uuu 的入點(diǎn)集合為 in(u)in(u)in(u).

首先對(duì)這個(gè)圖進(jìn)行拓?fù)渑判?#xff0c;每次刪掉入度為 000 的點(diǎn),則該點(diǎn)對(duì)答案的貢獻(xiàn)是 (614n+1)(614n+1)(614n+1) 乘以剩下的點(diǎn)數(shù)。不妨假設(shè)剩下的圖非空,下面的內(nèi)容都在剩下的圖上進(jìn)行。我們會(huì)發(fā)現(xiàn):
引理 0 不存在入度為 000 的點(diǎn)時(shí),整張圖是強(qiáng)連通的。
證明 對(duì)其縮點(diǎn)后,大小超過(guò) 111 的 SCC 必定有三元環(huán),而入度為 000 的 SCC 必定大小超過(guò) 111. 因此如果 SCC 個(gè)數(shù)超過(guò) 111,則取入度為 000 的 SCC 的一個(gè)三元環(huán)和其余的 SCC 中的一個(gè)點(diǎn),會(huì)構(gòu)成 HHH.
引理 1 ?u,in(u)∪{u}\forall u, in(u)\cup \{u\}?u,in(u){u} 無(wú)環(huán)。
證明 反證,如果有環(huán)的話環(huán)上的點(diǎn)構(gòu)成一個(gè)大小至少為 333 的 SCC,必定存在三元環(huán),和 uuu 點(diǎn)構(gòu)成 HHH.
引理 2 任取一個(gè)點(diǎn) XXX,我們可以把整張圖劃分為兩部分 P=in(X)∪{X},Q=V?PP=in(X)\cup \{X\},Q=V\setminus PP=in(X){X},Q=V?P,則存在 u∈Q,v∈Pu\in Q,v\in PuQ,vP 滿足 (u,v)(u,v)(u,v) 有邊。
證明 由于整張圖強(qiáng)連通,顯然。
(題解在這里的做法是取度數(shù)最大的點(diǎn)作為 XXX,實(shí)際上是需要的,理由將在下面給出。)
任取一個(gè)滿足引理 2 條件的點(diǎn) vvv. 設(shè) R=in(v)∩Q,S=Q?RR=in(v)\cap Q,S=Q\setminus RR=in(v)Q,S=Q?R.
引理 3 ?y∈S,z∈R\forall y\in S,z\in R?yS,zR(y,z)(y,z)(y,z) 有邊。
證明 反證,設(shè) (z,y)(z,y)(z,y) 有邊,則 (v,X,z,y)(v,X,z,y)(v,X,z,y) 四個(gè)點(diǎn)構(gòu)成 HHH.
引理 4 SSS 無(wú)環(huán),RRR 無(wú)環(huán)。
證明 根據(jù)引理 1 得 RRR 無(wú)環(huán);若 SSS 有環(huán)則和 RRR 中任何一點(diǎn)構(gòu)成 HHH.
引理 5 PPP 無(wú)環(huán),QQQ 無(wú)環(huán)。
證明 根據(jù)引理 1 得 PPP 無(wú)環(huán),由 S,RS,RS,R 分別無(wú)環(huán)且 S,RS,RS,R 之間連的邊都由 SSS 指向 RRR 得到 Q=S∪RQ=S\cup RQ=SR 無(wú)環(huán)。
到這里,我們就知道我們把這張圖劃分成了兩個(gè)部分,且兩部分分別無(wú)環(huán)。

對(duì)兩部分分別進(jìn)行拓?fù)渑判?#xff0c;并給他們標(biāo)號(hào)為 Pi,QiP_i,Q_iPi?,Qi?(現(xiàn)在把集合看成序列),不妨設(shè) i<ji\lt ji<j 當(dāng)且僅當(dāng)存在邊 (Pi,Pj)(P_i,P_j)(Pi?,Pj?)QQQ 同理。
設(shè) inP(u)=in(u)∩P,inQ(u)=in(u)∩QinP(u)=in(u)\cap P,inQ(u)=in(u)\cap QinP(u)=in(u)P,inQ(u)=in(u)Q.
引理 6a ?i\forall i?iinQ(Pi)inQ(P_i)inQ(Pi?)QQQ 的一段后綴;
證明 反證,若存在 j<kj\lt kj<k 滿足 (Pi,Qk),(Qj,Pi)(P_i,Q_k),(Q_j,P_i)(Pi?,Qk?),(Qj?,Pi?). 注意到 PPP 的最后一個(gè)元素是 XXX,且 XXXQQQ 中每個(gè)點(diǎn)都連了邊。于是 (Pi,Qj,X,Qk)(P_i,Q_j,X,Q_k)(Pi?,Qj?,X,Qk?) 構(gòu)成 HHH.
那么不難發(fā)現(xiàn),?i,j\forall i,j?i,j, 若∣inQ(Pi)∣=∣inQ(Pj)∣|inQ(P_i)|=|inQ(P_j)|inQ(Pi?)=inQ(Pj?)inQ(Pi)=inQ(Pj)inQ(P_i)=inQ(P_j)inQ(Pi?)=inQ(Pj?),否則大的包含小的。
引理 6b ?i\forall i?iinP(Qi)inP(Q_i)inP(Qi?)PPP 的一段后綴。
證明 設(shè) lil_ili? 為最小的 jjj 滿足 (Qj,Pi)(Q_j,P_i)(Qj?,Pi?) 有邊(若不存在視為 +∞+\infty+),可以證明 li≤li+1l_i\le l_{i+1}li?li+1?.
反證:若 li>li+1l_i\gt l_{i+1}li?>li+1? 且都不為 +∞+\infty+,則 (Pi,Qli+1,Qli,Pi+1)(P_i,Q_{l_{i+1}},Q_{l_i},P_{i+1})(Pi?,Qli+1??,Qli??,Pi+1?) 四個(gè)點(diǎn)構(gòu)成 HHH.
li=+∞l_i=+\inftyli?=+,則由于入度不為 000P1P_1P1? 一定滿足 l1≠+∞l_1\ne +\inftyl1??=+,即 (Q∣Q∣,P1)(Q_{|Q|},P_1)(QQ?,P1?). 而因?yàn)?(Pi,Q∣Q∣),(Q∣Q∣,Pi+1)(P_i,Q_{|Q|}),(Q_{|Q|},P_{i+1})(Pi?,QQ?),(QQ?,Pi+1?)(P1,Pi,Q∣Q∣,Pi+1)(P_1,P_i,Q_{|Q|},P_{i+1})(P1?,Pi?,QQ?,Pi+1?) 構(gòu)成 HHH.

還有一個(gè)問(wèn)題:dis(Qj,Pi)dis(Q_j,P_i)dis(Qj?,Pi?)(Pi,Qj)(P_i,Q_j)(Pi?,Qj?) 有邊時(shí)的距離沒(méi)有解決。由于整張圖中沒(méi)有入度大于 XXX 的點(diǎn),故 QQQ 中每個(gè)點(diǎn)會(huì)往 PPP 中連至少一條邊。而因?yàn)?QQQPPP 連的點(diǎn)是 PPP 的一個(gè)前綴,因此一定會(huì)連到 P1P_1P1?,故 dis(Qj,Pi)=2dis(Q_j,P_i)=2dis(Qj?,Pi?)=2.

最后總結(jié)一下結(jié)論:
dis(Pi,Pj)=1?i<jdis(P_i,P_j)=1\Leftrightarrow i\lt jdis(Pi?,Pj?)=1?i<j
dis(Pi,Pj)=2?j<i∧∣inQ(Pi)∣≠∣inQ(Pj)∣dis(P_i,P_j)=2\Leftrightarrow j\lt i\land |inQ(P_i)|\ne |inQ(P_j)|dis(Pi?,Pj?)=2?j<iinQ(Pi?)?=inQ(Pj?)
dis(Pi,Pj)=3?j<i∧∣inQ(Pi)∣=∣inQ(Pj)∣dis(P_i,P_j)=3\Leftrightarrow j\lt i\land |inQ(P_i)|=|inQ(P_j)|dis(Pi?,Pj?)=3?j<iinQ(Pi?)=inQ(Pj?)
dis(Qi,Qj)=1?i<jdis(Q_i,Q_j)=1\Leftrightarrow i\lt jdis(Qi?,Qj?)=1?i<j
dis(Qi,Qj)=2?j<i∧∣inP(Qi)∣≠∣inP(Qj)∣dis(Q_i,Q_j)=2\Leftrightarrow j\lt i\land |inP(Q_i)|\ne |inP(Q_j)|dis(Qi?,Qj?)=2?j<iinP(Qi?)?=inP(Qj?)
dis(Qi,Qj)=3?j<i∧∣inP(Qi)∣=∣inP(Qj)∣dis(Q_i,Q_j)=3\Leftrightarrow j\lt i\land |inP(Q_i)|=|inP(Q_j)|dis(Qi?,Qj?)=3?j<iinP(Qi?)=inP(Qj?)
dis(Pi,Qj)+dis(Qj,Pi)=3dis(P_i,Q_j)+dis(Q_j,P_i)=3dis(Pi?,Qj?)+dis(Qj?,Pi?)=3

時(shí)間復(fù)雜度 O(n2)O(n^2)O(n2).

代碼

#include<bits/stdc++.h> #define llong long long #define mkpr make_pair #define x first #define y second #define iter iterator #define riter reversed_iterator #define y1 Lorem_ipsum_dolor using namespace std;inline int read() {int x = 0,f = 1; char ch = getchar();for(;!isdigit(ch);ch=getchar()) {if(ch=='-') f = -1;}for(; isdigit(ch);ch=getchar()) {x = x*10+ch-48;}return x*f; }const int mxN = 8000; int ind[mxN+3]; vector<int> s1,s2; char a[mxN+3][mxN+3]; queue<int> que; int n; llong w,ans;char decode(char x) {return x>=65?x-55:x-48;}bool cmp(int x,int y) {return a[x][y];}int main() {scanf("%d",&n); w = 614ll*n;for(int i=1; i<=n; i++){char ch = getchar();for(int j=4; j<=n; j+=4){ch = decode(getchar());a[i][j-3] = (ch&8)>>3,a[i][j-2] = (ch&4)>>2,a[i][j-1] = (ch&2)>>1,a[i][j] = ch&1;}}for(int i=1; i<=n; i++) for(int j=i+1; j<=n; j++){if(a[i][j]) {ind[j]++;} else {ind[i]++;}}for(int i=1; i<=n; i++) if(ind[i]==0) {que.push(i);}int cur = n;while(!que.empty()){int u = que.front(); que.pop();cur--; ans += (w+1ll)*cur;for(int v=1; v<=n; v++) if(a[u][v]&&v!=u){ind[v]--;if(ind[v]==0) {que.push(v);}}}if(cur==0) {printf("%I64d\n",ans); return 0;}int u = 0; for(int i=1; i<=n; i++) if(u==0||ind[i]>ind[u]) {u = i;}for(int i=1; i<=n; i++) if(ind[i]) {if(u==i||a[i][u]) {s1.push_back(i);} else {s2.push_back(i);}}sort(s1.begin(),s1.end(),cmp); sort(s2.begin(),s2.end(),cmp);ans += 3ll*s1.size()*s2.size()+s1.size()*(s1.size()-1ll)/2ll+s2.size()*(s2.size()-1ll)/2ll;for(int i=0; i<s1.size(); i++) {ind[s1[i]] -= i;}for(int i=0; i<s1.size(); i++) for(int j=0; j<i; j++){ans += ind[s1[i]]==ind[s1[j]]?3ll:2ll;}for(int i=0; i<s2.size(); i++) {ind[s2[i]] -= i;}for(int i=0; i<s2.size(); i++) for(int j=0; j<i; j++){ans += ind[s2[i]]==ind[s2[j]]?3ll:2ll;}printf("%I64d\n",ans);return 0; }

總結(jié)

以上是生活随笔為你收集整理的Codeforces 1338E JYPnation (图论)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。