瞎扯兩句吧
先從序列上理解,維護鏈的最大獨立集。
放在樹上的話,兒子都可以轉移,把輕兒子的轉移放在子鏈鏈頭更新,然後每條鏈都處理成序列就行了。
注意一點,因為維護的是序列,所以單點存放的矩陣是只含輕兒子和自己的貢獻,相當於把輕兒子的子樹縮給了自己,而重兒子維護的東西是通過線段樹上維護的區間貢獻過來的。
咕咕模板,最大全獨立集
code:
#include #include #include using std::max;
const int n=1e5+10;
const int inf=0x3f3f3f3f;
int n,m,v[n];
int read()
while(isdigit(c))
return x*f;
}int head[n],to[n<<1],next[n<<1],cnt;
void add(int u,int v)
int dfn[n],top[n],bot[n],siz[n],ha[n],f[n],ws[n],dfsclock,dp[n][2],len;
void dfs1(int now)
}void dfs2(int now,int anc)
struct matrixmx[n<<2],upt[n];
matrix operator *(matrix a,matrix b)
#define ls id<<1
#define rs id<<1|1
void build(int id,int l,int r)
; return;
}int mid=l+r>>1;
build(ls,l,mid),build(rs,mid+1,r);
mx[id]=mx[ls]*mx[rs];
}matrix query(int id,int l,int r,int l,int r)
void change(int id,int l,int r,int p)
int mid=l+r>>1;
if(p<=mid) change(ls,l,mid,p);
else change(rs,mid+1,r,p);
mx[id]=mx[ls]*mx[rs];
}void modify(int now,int w)
}int main()
{ n=read(),m=read();
for(int i=1;i<=n;i++) v[i]=read();
for(int u,v,i=1;i2019.1.2
數字dp 板子題
題目傳送 存乙個狀態就可以了,用來判斷前一位是不是6的情況 具體看 注釋 ac include inline long long read while c 0 c 9 return x s using namespace std define newnode treenode malloc size...
不要62(數字dp板子題)
傳送門 hdu 2089 杭州人稱那些傻乎乎粘嗒嗒的人為62 音 laoer 杭州交通管理局經常會擴充一些的士車牌照,新近出來乙個好訊息,以後上牌照,不再含有不吉利的數字了,這樣一來,就可以消除個別的士司機和乘客的心理障礙,更安全地服務大眾。不吉利的數字為所有含有4或62的號碼。例如 62315 7...
石子合併(區間DP板子題)
設有n堆石子排成一排,其編號為1,2,3,n。每堆石子有一定的質量,可以用乙個整數來描述,現在要將這n堆石子合併成為一堆。每次只能合併相鄰的兩堆,合併的代價為這兩堆石子的質量之和,合併後與這兩堆石子相鄰的石子將和新堆相鄰,合併時由於選擇的順序不同,合併的總代價也不相同。例如有4堆石子分別為 1 3 ...