BZOJ2759 乙個動態樹好題 LCT

2022-03-31 15:52:44 字數 1549 閱讀 4905

-zhouzhendong

有n個未知數x[1..n]和n個等式組成的同餘方程組:

x[i]=k[i]*x[p[i]]+b[i] mod 10007

其中,k[i],b[i],x[i]∈[0,10007)∩z

你要應付q個事務,每個是兩種情況之一:

一.詢問當前x[a]的解

a a無解輸出-1

x[a]有多解輸出-2

否則輸出x[a]

二.修改乙個等式

c a k[a] p[a] b[a]

n下面n行,每行三個整數k[i] p[i] b[i]

q下面q行,每行乙個事務,格式見題目描述

對每個詢問,輸出一行乙個整數。

對100%的資料,1≤n≤30000,0≤q≤100000,時限2秒,其中詢問事務約佔總數的80%

這題不大會,基本上是抄的……

rev標記不用打,大概是因為不用link和cut吧。

大佬題解:

#include #include #include #include #include using namespace std;

const int n=30005,mod=10007;

struct fc

fc (int k_,int b_)

int calc(int x)

};fc operator + (fc a,fc b)

int pow(int x,int y)

int inv(int a)

int fa[n],son[n][2],sfa[n];

fc val[n],sum[n];

bool isroot(int x)

void pushup(int x)

int wson(int x)

void rotate(int x)

void splay(int x)

void access(int x)

}void link(int x,int y)

void cut(int x)

int find(int x)

int query(int x)

int oncirclr(int x,int rt)

void update(int x,int p,int k,int b)

else if (oncirclr(x,rt))

else

}int vis[n],in[n];

void dfs(int x)

if (!vis[y])

dfs(y);

in[x]=0;

}int n,m;

int main()

memset(vis,0,sizeof vis);

memset(in,0,sizeof in);

for (int i=1;i<=n;i++)

if (!vis[i])

dfs(i);

scanf("%d",&m);

for (int i=1;i<=m;i++)

else

} return 0;

}

Bzoj 2759 乙個動態樹好題

有n個未知數x 1.n 和n個等式組成的同餘方程組 x i k i x p i b i mod 10007 其中,k i b i x i 0,10007 z 你要應付q個事務,每個是兩種情況之一 一.詢問當前x a 的解 a a無解輸出 1 x a 有多解輸出 2 否則輸出x a 二.修改乙個等式 ...

BZOJ2759 乙個動態樹好題 LCT

題解 的確是動態樹好題 首先由於每個點只有乙個出邊 這個圖構成了基環內向樹 我們觀察那個同餘方程組 一旦形成環的話我們就能知道環上點以及能連向環上點的值是多少了 所以我們只需要用一種結構來維護兩個不是直接相連點的狀態 由於有刪邊連邊操作,比較容易想到lct 我們按照套路將它拆掉一條邊形成一顆樹 因為...

BZOJ 2759 一道動態樹的好題

一道好題的標準 從常規的知識點中敲擊出新火花,但並不是偏題。不卡常,不卡溢位 首先看乙個弱化的問題,乙個固定的 n 元 n項模方程怎麼求解每個變數。高斯消元?太慢啦!如果我們把x px連邊,我們可以得到乙個基環森林。對於每個聯通塊,找到環並求出環中某乙個變數的值,顯然當乙個變數的值求出來了,整個聯通...