如果了解過支配樹是什麼,其實這道題會相當簡單。
明顯建立支配樹。
考慮連線 \((s,t)\) 帶來的影響。
對於 \(t\) 而言,它的最近支配點會變為 \(lca(s,t)\)。
考慮哪些點的受支配集會改變。顯然是存在 \((u,v)\) 如果 \(u\) 的支配集被改變,那麼 \(v\) 才可能會因為 \(u\) 而改變。
考慮如何改變。即,如果存在邊 \((u,v)\),那麼顯然 \(u\) 和 \(v\) 的最近支配點在一條鏈上。
如果 \(v\) 的最近支配點是 \(u\) 的新的最近支配點的祖先,那 \(v\) 必不可能被影響。否則 \(v\) 的最近支配點就會變得和 \(u\) 的一樣。
不會快速建立支配樹,但不影響總複雜度,掃一遍 \(o(n^2+nq)\)。
#include #include #include #include #include #include #include #include #include #define pii pair #define pll pair #define mp make_pair
#define fs first
#define sc second
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
//const int mxdt=100000;
//static char buf[mxdt],*p1=buf,*p2=buf;
//#define getchar() p1==p2&&(p2=(p1=buf)+fread(buf,1,mxdt,stdin),p1==p2)?eof:*p1++;
template void read(t &x)
while(s>='0'&&s<='9')
x *= f;
}template void write(t x , char s='\n')
if(x<0)
t tmp[25]={},t=0;
while(x) tmp[t++]=x%10,x/=10;
while(t-->0) putchar(tmp[t]+'0');
putchar(s);
}const int maxn = 3e3 + 5;
int n , m , q , head[maxn] , to[maxn * maxn] , nxt[maxn * maxn] , cnt;
void add(int u , int v)
int deg[maxn] , tmpd[maxn] , f[maxn][22] , dep[maxn] , pre[maxn];
int lca(int x , int y)
for (int i = 20; i >= 0; --i) if(f[x][i] != f[y][i])
return f[x][0];
}int ans;
int vis[maxn];
void dfs(int x , int v)
}void ddfs(int x)
}vector g[maxn];
int main()
for (int i = 2; i <= n; ++i)
queue q;
q.push(1);
while(!q.empty()) }
while(q -- > 0)
return 0;
}
場外模擬 省選聯考(B卷) 2020 遊記
同步 上次模擬 a aa 卷只有 155 15515 5 分,很不爽!所以,洛谷上已經有了 b bb 卷,抽空看一下吧!聽說 b bb 卷在 jx text jx 和少數省用了,總之挺少的,還挺簡單。還聽說大眾分是 350 35035 0,加油吧!day1 t1 text day1 t1 一看是個橙...
場外模擬 省選聯考(A卷重考) 2020 遊記
同步 上次 a aa 卷 155 15515 5,bb b 卷 360 36036 0 乙個退役,乙個進隊。所以說很不爽,來把 a aa 卷的題再看一遍。上次只看了 10 1010 分的暴力,認真了才發現答案是 2 min 2 times min 2 min,隨便弄個資料結構二分維護就可以搞到 o ...
省選聯考 2020 A 卷 組合數問題
前言 這是我退役賽省選中唯一一道答得令自己滿意的題目。也就是 skyh 難道你沒 ac 的那道題。這道題我想了大概二十多分鐘。覺得不是很簡單。然而考後出來才發現,大神們都是用數學推導 ac 的這道題。而我,眾所周知,退役在即的我菜的不行,自然不會數學推導。所以說如果你什麼也不會,你怎麼做這道題呢?於...