一張圖,給出若干個三元組\((u,v,w)\),表示有\(u\to v\)的顏色為\(w\)的左括號和\(v\to u\)的顏色為\(w\)的右括號。詢問多少對\((u,v),u使得\(u\)到\(v\)存在路徑使得這個路徑上的括號序合法。
\(n\le 3*10^5,m\le 6*10^5\)
在比賽最後乙個小時前一直在想怎麼字首和不小於零……於是連暴力都不會寫……
後來忽然發現可以記\(f_\)表示\(u\)可以到\(v\),然後暴力擴充套件。估分32,實際水了48。
比賽之後才發現這個東西是雙向的,也就是說\(f_=f_\)。
於是如果\(f_=1\),可以把\(u,v\)看成等價類。
用並查集+啟發式合併維護搞出所有等價類即可。
具體:把等價類縮點,並且記錄這些點的每種顏色的入邊。把點丟到乙個佇列裡,操作某個點的時候,找到所有入邊大於等於\(2\)的邊,將這些邊連向的點縮起來,然後丟到佇列中。
注意細節。
using namespace std;
#include #define n 300005
#define m 600005
#define ll long long
int n,m,k;
int dsu[n];
int getdsu(int x)
map> e[n];
setb[n];
int sz[n];
queueq;
bool inq[n];
vectoro[n];
bool cmpo(int x,int y)
void merge(int x,int y)
e[y].clear();
dsu[y]=x;
sz[x]+=sz[y];
}void bfs()
b[x].clear();
static int bz[n],bz;
for (int i=0;isz[mx]) mx=y;
}for (int j=0;j>1;
printf("%lld\n",ans);
return 0;
}
LOJ 2340 WC2018 州區劃分
感覺是比較基礎的子集 dp.令 dp s 表示點集 s 構成的價值和,然後列舉最後乙個區域就行.也就是 dp s sum dp s t times frac k 化簡得 dp s times sum s k sum dp s t times sum t k 如何判斷尤拉迴路 所有點的度數都是偶數,就...
Loj10166 數字遊戲2
題目描述 由於科協裡最近真的很流行數字遊戲,某人又命名了一種取模數,這種數字必須滿足各位數字之和 modn 為 000。現在大家又要玩遊戲了,指定乙個整數閉區間 a,b a,b a,b 問這個區間內有多少個取模數。列舉每一位,記錄每一次列舉 n的餘數,當列舉完時,如果餘數是0,就 1,否則 0.in...
Loj10166 數字遊戲2
題目描述 由於科協裡最近真的很流行數字遊戲,某人又命名了一種取模數,這種數字必須滿足各位數字之和 modn 為 000。現在大家又要玩遊戲了,指定乙個整數閉區間 a,b a,b a,b 問這個區間內有多少個取模數。列舉每一位,記錄每一次列舉 n的餘數,當列舉完時,如果餘數是0,就 1,否則 0.in...