題解 洛谷 P6326 Shopping

2022-05-06 20:00:26 字數 1429 閱讀 9151

考慮若連通塊必須包含 \(x\),那麼就對以 \(x\) 為根的有根樹做樹形揹包。

設 \(f_\) 為考慮了 \(dfs\) 序中 \([i,n]\) 對應的節點,體積為 \(j\) 的最大價值。轉移分兩種情況:乙個是選 \(i\) 對應的節點,然後對該節點的物品跑多重揹包,我這裡用的是二進位制拆分來優化。另乙個是不選 \(i\) 對應的節點,然後從該節點子樹外轉移過來,這裡可以在 \(dfs\) 序上表示轉移的位置。

連通塊不包含 \(x\) 的情況可以用點分治來遞迴處理。

複雜度為 \(o(nm\log d\log n)\)。

#include#define maxn 1010

#define maxm 4010

using namespace std;

templateinline void read(t &x)

while(isdigit(c))

if(flag)x=-x;

}int t,n,m,ans,tot,root,cnt;

int w[maxn],c[maxn],d[maxn],f[maxn][maxm],siz[maxn],mx[maxn],out[maxn],rev[maxn];

bool vis[maxn];

struct edge

e[maxn];

int head[maxn],edge_cnt;

void add(int from,int to)

,head[from]=edge_cnt;

}struct node

p[maxn];

void dfs_root(int x,int fa)

mx[x]=max(mx[x],tot-siz[x]);

if(mx[x]=c[rev[i]];--j) f[i][j]=f[i+1][j-c[rev[i]]]+w[rev[i]];

for(int k=1;k<=num;++k)

for(int j=m;j>=p[k].w;--j)

f[i][j]=max(f[i][j],f[i][j-p[k].w]+p[k].v);

for(int j=0;j<=m;++j) f[i][j]=max(f[i][j],f[out[rev[i]]+1][j]);

}ans=max(ans,f[1][m]);

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

for(int j=0;j<=m;++j)

f[i][j]=0;

int now=tot;

for(int i=head[x];i;i=e[i].nxt)

}void clear()

int main()

tot=mx[0]=n,dfs_root(1,0),solve(root),printf("%d\n",ans);

}return 0;

}

洛谷 P1101 題解

這道題可以用深搜 回溯 來寫,相信大部分人都是這麼想的,但是有些人可能在一些地方饒了半天,所以這裡就貼一下我的思路,個人覺得自己的很好懂,除了tx和ty那裡,但是tx和ty的那種用法對於輸出路徑的題目一般很實用 這個算是比較簡單的吧,題目裡給出了具體要找的字串,我們要做的就是對它進行8個方向的搜尋,...

洛谷 P1169 題解

請你在乙個黑白矩陣中選出乙個長方形 含正方形 和正方形的子矩陣,使得所有相鄰的點顏色不一樣。矩陣大小 兩條邊都 2000 2000 2 000輸入 3 31 0 1 0 1 0 1 0 0輸出4 6解釋給定矩陣 正方形 長方形 我的控制台是萌萌噠 ffc0cb粉色 乙個小技巧 如果您的控制台是像我的...

題解 洛谷 P3332

題目描述 權值線段樹套線段樹板子題 首先觀察題目,判斷為二維偏序問題 操作1為區間修改,所以一定是外部線段樹維護權值,內部線段樹維護所在區間,否則時間複雜度 qwq 為方便查詢,雜湊時我採用雜湊每個數的相反數的方法將求第k大轉換為求第k小 詢問可以直接想到的做法就是二分答案,查詢1 ans在區間內的...