BZOJ4911 Sdoi2017 切樹遊戲

2022-04-30 10:45:06 字數 1710 閱讀 9918

重構了三次.jpg

每次都把這個問題想簡單了.jpg

果然我還是太菜了.jpg

這種題的題解可以一眼秒掉了,fwt+動態dp簡直是裸的一批...

那麼接下來,考慮如何維護資訊。

每個點維護$4$個資訊,分別表示,這條鏈自底向上,自上向底,兩端都在這條鏈的輕兒子裡,和兩端為鏈頭的方案數。

這樣的話,正常詢問就沒啥問題了,只需要每次修改和初始化的時候fwt一下,然後最後fwt回來即可。

然後這樣做的話,因為fwt沒有可減性(沒法求逆),所以每次需要將輕兒子用線段樹維護一下,然後每次重建即可

(是我菜了,fwt之間求每個對應位置的逆元然後乘起來就行...

剩下的就是ddp正常操作了...

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

#define n 30005

#define m 128

#define mod 10007

#define inv2 5004

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

int n,m,q,a[n];

struct nodee[n<<1];

int head[n],cnt,fa[n],anc[n],son[n],siz[n],idx[n],tims,p[n],sson[n];

// ploy

struct ploy

int m=(l+r)>>1;build(x,lson);build(x,rson);tr[x][rt]=tr[x][rt<<1]*tr[x][rt<<1|1];

}// segment_tree of ddp

struct segment

segment(ploy x,ploy y)

segment operator + (const segment &a) const

}tr[n<<2];

void build(int l,int r,int rt)

int m=(l+r)>>1;build(lson);build(rson);tr[rt]=tr[rt<<1]+tr[rt<<1|1];

}segment query(int l,int r,int l,int r,int rt)

void update(int x,int l,int r,int rt)

int m=(l+r)>>1;if(x<=m)update(x,lson);else update(x,rson);tr[rt]=tr[rt<<1]+tr[rt<<1|1];

}void update(int x)

x=fa[x]; }}

// graph

void add(int x,int y);head[x]=cnt++;}

void dfs1(int x,int from)

h[x]=h[x]+f[x];

}void dfs2(int x,int top)

if(!lsn[x].size())return ;

tr[x].resize(lsn[x].size()*4+5);

build(x,1,lsn[x].size(),1);

}char opt[10];

int main()

}}

Bzoj 2726 SDOI 任務安排

memory limit 131072kb 64bit io format lld llu description 機器上有n個需要處理的任務,它們構成了乙個序列。這些任務被標號為1到n,因此序列的排列為1,2,3.n。這n個任務被分成若干批,每批包含相鄰的若干任務。從時刻0開始,這些任務被分批加工...

BZOJ 3991 SDOI2015 尋寶遊戲

題目大意 給定一棵樹,其中有若干個關鍵點,任意選擇起點,求從起點出發訪問所有關鍵點又回到起點的最小邊權總和,有m個修改操作,每次修改乙個關鍵點。假如沒有修改操作的話,就像乙個簡單的樹形dp,方程如下 f i sigma sigma.觀察一下dp的過程,就是不斷地從前面的點走到後面的點,所以我們可以不...

SDOI2013 BZOJ3203 保護出題人

description input 第一行兩個空格隔開的正整數n和d,分別表示關數和相鄰殭屍間的距離。接下來n行每行兩個空格隔開的正整數,第i 1行為ai和 xi,分別表示相比上一關在殭屍佇列排頭增加血量為ai 點的殭屍,排頭殭屍從距離房子xi公尺處開始接近。output 乙個數,n關植物攻擊力的最...