題面
題意:有一棵n個點的數,要支援新增路徑,刪除路徑,路徑有權值。詢問所有不經過某個點的路徑的權值的最大值,沒有路徑或全部過這個點輸出-1。可離線。
聽kscla說線段樹+路徑交,一直t,所以就想整體二分吧。
根據圖論的套路,一條路徑(u,v)若過點x,則有u或v在x的子樹內,lca為x或x的祖先。那就是點修改,子樹查詢。在u,v+1,lca-1,father[lca]-1,然後區間查詢。用bit可以維護。
假設只有乙個詢問x,就二分乙個權值mid。若權值大於mid的路徑並沒有全部經過x(用上述的方法判斷),則x的答案大於mid。
對於可離線的多個詢問整體二分即可。
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define mmst(a, b) memset(a, b, sizeof(a))
#define mmcp(a, b) memcpy(a, b, sizeof(b))
typedef
long
long ll;
const
int n=200200;
int n,m,ans[n];
int to[n],head[n],nex[n],cnt;
int fa[n][20],times,l[n],r[n];
int bit[n];
void add(int x,int ad)
int sum(int x)
struct yy
f[n],le[n],ri[n];
void link(int u,int v)
void dfs(int x)
r[x]=times;
}int lca(int x,int y)
void update(int x,int hy)
void work(int x,int y,int ll,int rr)
int mid=(ll+rr)/2,t1=0,t2=0,now=0;
for(int i=x;i<=y;i++)
if(f[i].num!=0)
else
if(f[i].k>mid)
else
le[++t1]=f[i];
}for(int i=x;i<=y;i++)
if(f[i].ops!=0&&f[i].k>mid)
update(i,-1);
for(int i=1;i<=t1;i++)
f[x+i-1]=le[i];
for(int i=1;i<=t2;i++)
f[x+t1+i-1]=ri[i];
work(x,x+t1-1,ll,mid);
work(x+t1,x+t1+t2-1,mid+1,rr);
}int main()
dfs(1);
fa[1][0]=1;
for(int j=1;j<=19;j++)
for(int i=1;i<=n;i++)
fa[i][j]=fa[fa[i][j-1]][j-1];
int edge=0;
for(int i=1;i<=m;i++)
if(op==1)
f[i].num=i;
if(op==2)}}
mmst(bit,0);
work(1,m,1,1000000000);
for(int i=1;i<=m;i++)
if(ans[i])
printf("%d\n",ans[i]);
return
0;}
**都是模板,但我卻調了很久。可能是我最近沉迷電學,天天怠惰。 BZOJ1146 網路管理,整體二分
傳送門 logn 查詢時二分答案,查詢路徑上重鏈中的平衡樹,複雜度 log3n 總複雜度o nlogn qlog3n log2n 查詢時把 log 個主席樹放在一起查做到 log2n 感謝lucida的提醒 總複雜度o nlog2n qlog2n o q n23logn log2n 基本過不了,離線...
BZOJ 1305 二分 網路流
思路 建圖我根本沒有想到啊 我是不會告訴你我借鑑了一下題解的思路 把每個人拆成喜歡的和不喜歡的點 男 喜歡 向 男 不喜歡 連 邊權為k的邊 如果男喜歡女 那麼 男喜歡向 女喜歡 連 1 如果男 不喜歡女 那麼 男不喜歡 向 女不喜歡 連1 男 喜歡 向 男不喜歡 連k 女 不喜歡 向 女喜歡 連k...
CTSC2008 網路管理 樹剖 整體二分
這題的複雜度可以到達驚人的 log 4 據說還能跑過去 差點沒嚇死我 直接二分 樹剖樹套樹 n log 4 n 乙個 log 也不少的4 log 但是我有個 log 3 的樹剖上面整體二分 線段樹的做法 不過據說有個 log 做法,我不會,反正我菜就是了 然後的話 就直接考慮個消除貢獻 然而並不需要...