一道好題的標準:
從常規的知識點中敲擊出新火花,但並不是偏題。
不卡常,不卡溢位……
首先看乙個弱化的問題,乙個固定的
n 元
n項模方程怎麼求解每個變數。高斯消元? 太慢啦!!
如果我們把x→
px連邊,我們可以得到乙個基環森林。對於每個聯通塊,找到環並求出環中某乙個變數的值,顯然當乙個變數的值求出來了,整個聯通塊就okay啦。
接下來我們考慮修改操作,考慮到這玩意是個基環森林,乙個常見的思路是拆環成樹。所以我們考慮用 lc
t 來維護一些資訊。
但當務之急是如何處理我們忽略掉的那些邊!我們讓每個聯通塊的根節點是這種邊的某一端點,然後每個根節點記錄這條邊的另一端點, 我們叫他sp
ecia
lfat
her 。 sp
lay 中每條樹鏈 (x→
y ,其中
x 的深度較淺) 維護乙個二元組(k , b): 令:
f=x→
fay=
f×k+
b 就是如何用
x 的父親表示y。(其中根節點的父親就是那個神奇的sp
ecia
lfat
her)
那麼不難想到如果用將根節點和sp
ecia
lfat
her 的樹鏈調出來,那麼就可以求出sp
ecia
lfat
her 的值啦!其實s
peci
alfa
ther
的存在並不影響所有的 lc
t 的操作。但是要注意在修改邊的時候,要先刪邊再加邊,這樣邏輯更清晰。
幾點啟發:
1. 任何對父親或者自身的操作之前,都需要lo
cate
2. lc
t 記錄的量應該只和點權與樹鏈本身有關,而不應該與此時的根節點有任何聯絡。
3. 在需要利用根節點資訊的時候,我們所有操作都不能ma
kero
ot
#include
using namespace std;
const
int maxn = 110000;
const
int modu = 10007;
struct line
line operator +(const line& b)
int f(int x)
};struct node
};node *null = new node();
node pool[maxn];
bool isroot(node *o)
void rotate(node *&o , int d)
void _splay(node* &o)
rotate(o , o->c^1);
}}void splay(node *o)
_splay(o);
}node* access(node *x)
while(y->ch[0] != null) y = y->ch[0];
return y;
}int p[maxn] , book[maxn] , cnt;
void dfs(int x)
void locate(node *x)
int inv(int x)
return res;
}int query(node *x)
locate(x);
return x->sum.f( ((modu - b)*inv(k+modu-1)) % modu );
}void modify(node *x , node *fa , line l)
// then build the new one!
// aparently x is a root of some tree
if(access(fa) != access(x)) locate(x) , x->fa = fa;
else locate(x) , x->sfa = fa;
}int re()
int main()
for(int i=1;i<=n;i++) if(!book[i]) ++cnt , dfs(i);
int q;
cin>>q;
char op[2];
while(q--)
}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
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 否則輸出...
BZOJ2759 乙個動態樹好題 LCT
題解 的確是動態樹好題 首先由於每個點只有乙個出邊 這個圖構成了基環內向樹 我們觀察那個同餘方程組 一旦形成環的話我們就能知道環上點以及能連向環上點的值是多少了 所以我們只需要用一種結構來維護兩個不是直接相連點的狀態 由於有刪邊連邊操作,比較容易想到lct 我們按照套路將它拆掉一條邊形成一顆樹 因為...