HNOI2019 校園旅行

2022-07-13 19:12:12 字數 1988 閱讀 8268

某學校的每個建築都有乙個獨特的編號。一天你在校園裡無聊,決定在校園內隨意地漫步。

你已經在校園裡呆過一段時間,對校園內每個建築的編號非常熟悉,於是你情不自禁的把周圍每個建築的編號都記了下來——但其實你沒有真的記下來,而是把每個建築的編號除以 2 取餘數得到 0 或 1,作為該建築的標記,多個建築物的標記連在一起形成乙個 01 串。

你對這個串很感興趣,尤其是對於這個串是回文串的情況,於是你決定研究這個問題。

學校可以看成一張圖,建築是圖中的頂點,而某些頂點之間存在無向邊。對於每個頂點我們有乙個標記(0 或者 1)。每次你會選擇圖中兩個頂點,你想知道這兩個頂點之間是否存在一條路徑使得路上經過的點的標記形成乙個回文串。

乙個回文串是乙個字串使得它逆序之後形成的字串和它自己相同,比如「010」,「1001」都是回文串,而「01」,「110」不是。注意長度為 1 的串總是回文串,因此如果詢問的兩個頂點相同,這樣的路徑總是存在。此外注意,經過的路徑不一定為簡單路徑,也就是說每條邊每個頂點都可以經過任 意多次。

非常巧妙的一道題。

先考慮樸素的做法,記\(dp[l][r]\)表示\(l\)到\(r\)能否構成乙個回文串,這個可以用\(bfs\)擴充套件。

分析一下複雜度,發現它是\(m^2\)的。

考慮到邊數很多而點數很少,所以考慮把不必要的邊去掉。

考慮連線顏色相同的邊構成的聯通塊,然後有結論,如果這是乙個二分圖,那麼我們只需要保留其中的一顆生成樹,如果不是,那麼給其中的乙個點加上乙個自環就好了。

那麼對於連線兩種顏色的邊也一樣,因為它本身是乙個二分圖,所以就保留乙個生成樹就好了。

至於原因,考慮如果是乙個二分圖,從\((x,y)\)擴充套件到\((x',y')\),那麼\(x\)走的步數和\(y\)走的步數的奇偶性是一樣的,所以我們需要證明當走的步數足夠大的時候,只要奇偶性不變,從\(x\)一定能夠走到\(x'\),

因為是二分圖,我們多的邊可以來回走就好了。

如果不是二分圖,我們可以通過自環來調整奇偶性。

這樣我們就把邊數調整到了\(o(n)\)級別。

#include#define n 5009

using namespace std;

typedef long long ll;

int n,m,q,head[n],tot,f[n];

char s[n];

bool ans[n][n],co[n],tag[n];

inline ll rd()

while(isdigit(c))

return f?-x:x;

}struct node;

vectorvec[2],nw;

vector::iterator it;

queueq;

struct edgee[n*n];

inline void add(int u,int v)

int find(int x)

int main());

ans[x][y]=ans[y][x]=1;q.push(node);

} else nw.push_back(node);

} for(int i=1;i<=n;++i)f[i]=i,co[i]=tag[i]=0;

for(it=vec[0].begin();it!=vec[0].end();++it)

else if(co[x.x]==co[x.y]&&!tag[yy])

} for(it=vec[1].begin();it!=vec[1].end();++it)

else if(co[x.x]==co[x.y]&&!tag[yy])

} for(int i=1;i<=n;++i)f[i]=i;

for(it=nw.begin();it!=nw.end();++it)

} for(int i=1;i<=n;++i)ans[i][i]=1,q.push(node);

while(!q.empty()));

}} while(q--)

return 0;

}

HNOI2019 校園旅行

人生第一道黑題祭 本題偏重思維 判斷回文可以考慮它的遞迴定義 只有乙個字元的串是回文串。只有兩個字元的串,如果這兩個字元相同,也是回文串 如果 s 是回文串,那麼在 s 的開頭和末尾插入乙個相同的字元,形成的新串也是回文串。乙個可以想到的方法是設 f 表示從 x 到 y 可不可行 然後 text 列...

HNOI2019 校園旅行 DP

給定n nn個點,m mm條邊的圖。每個點有0 1 0 10 1的標號,有q qq個詢問,每次詢問點對 u,v u,v u,v 間是否一條路徑 不一定是簡單路徑 滿足路徑經過的點的標號所形成的串是回文串。n 5000,m 5000000 n leq 5000,m leq 5000000 n 5000...

HNOI2019 校園旅行 構造 生成樹 動規

hnoi2019 校園旅行 最樸素的做法就是點對擴充套件 o m 2 發現 n 比較小,我們是否能從 n 下手減少邊數呢?是肯定的 單獨看乙個顏色的聯通塊,如果是二分圖,我們生產樹和原來的效果相同 如果不是二分圖,是會有乙個環的,在樹上隨便圈乙個自環和原來的效果相同 而看不同顏色的連邊,一定是二分圖...