LOJ3462 WC2021 括號路徑

2022-05-31 11:06:10 字數 1083 閱讀 7413

一張圖,給出若干個三元組\((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...