bzoj 4515 遊戲 樹鏈剖分 線段樹

2022-02-27 11:43:39 字數 2293 閱讀 4639

先讓我%一發lych大佬點我去看dalao的題解

講的很詳細.

這裡糾正乙個地方,lych大佬的式子中有乙個\(a*(d[s]-d[x])+b=-a*d[x]+(b-a*d[s])\)

應該是\(a*(d[s]-d[x])+b = -a*d[x] + (b+a*d[s])\)

看來是大爺敲式子的時候敲錯了...

除去這個就很完美啦

新get了線段樹標記永久化的姿勢

#include #include #include using namespace std;

typedef long long ll;

templateinline void read(t &x)

const ll maxn = 210010;

const ll inf = 123456789123456789ll;

struct edgeg[maxn<<1];

ll head[maxn],cnt;

void add(ll u,ll v,ll d)

ll son[maxn],siz[maxn],fa[maxn],top[maxn];

ll dfn[maxn],dfs_clock,num[maxn],dep[maxn];

ll d[maxn];

#define v g[i].to

void dfs(ll u)

}void dfs(ll u,ll tp)

}#undef v

struct node

}t[maxn<<2];

ll k,b,l,r;ll n;

ll query(ll rt,ll l,ll r)

inline ll query(ll l,ll r)

void update(ll rt,ll l,ll r,ll k,ll b)

ll mid = l+r >> 1;

ll y1 = k*d[num[r]] + b;

ll y2 = t[rt].k*d[num[r]] + t[rt].b;

ll y3 = k*d[num[l]] + b;

ll y4 = t[rt].k*d[num[l]] + t[rt].b;

if(y3 <= y4 && y1 <= y2) t[rt].k = k,t[rt].b = b;

else if(y3 >= y4 && y1 >= y2) return;

else if(t[rt].k > k)else update(rt<<1|1,mid+1,r,k,b);

}elseelse update(rt<<1,l,mid,k,b);

} if(l < r) t[rt].minn = min(t[rt<<1].minn,t[rt<<1|1].minn);

if(t[rt].lazy) t[rt].minn = min(t[rt].minn,

min(t[rt].k*d[num[l]],t[rt].k*d[num[r]])+t[rt].b);

}void ins(ll rt,ll l,ll r)

ll mid = l+r >> 1;

if(l <= mid) ins(rt<<1,l,mid);

if(r > mid) ins(rt<<1|1,mid+1,r);

t[rt].minn = min(t[rt<<1].minn,t[rt<<1|1].minn);

if(t[rt].lazy) t[rt].minn = min(t[rt].minn,

min(t[rt].k*d[num[l]],t[rt].k*d[num[r]])+t[rt].b);

}inline void ins(ll l,ll r)

inline ll lca(ll u,ll v)return dep[u] < dep[v] ? u : v;

}inline void insert(ll u,ll v,ll a,ll b)ins(dfn[rt],dfn[u]);

k = a;b -= (d[rt]<<1)*a;

while(top[v] != top[rt])ins(dfn[rt],dfn[v]);

}inline ll query_all(ll u,ll v)if(dep[u] < dep[v]) swap(u,v);

ret = min(ret,query(dfn[v],dfn[u]));

return ret;

}int main(){

ll m;read(n);read(m);

for(ll i=1,u,v;i我能說我從昨天下午調到了今天上午,調了6個小時嗎?

BZOJ 2243 樹鏈剖分 線段樹

include define n 101000 define frei freopen in.txt r stdin define freo freopen out.txt w stdout define mem a,b memset a,b,sizeof a define lson root 1 ...

BZOJ 4811 樹鏈剖分 線段樹

思路 感覺這題也可神了.還是我太弱 首先發現每一位不會互相影響,可以把每一位分開考慮,然後用樹鏈剖分或者lct維護這個樹 修改直接修改,詢問的時候算出來每一位填0,1經過這條鏈的變換之後得到的值 考慮貪心,從高往低,如果這一位填0可以得到1,那麼填0一定是最優的 否則如果可以填1,就把這一位填為1 ...

BZOJ 3531(樹鏈剖分 線段樹)

problem 旅行 bzoj 3531 題目大意 給定一顆樹,樹上的每個點有兩個權值 x,y 要求維護4種操作 操作1 更改某個點的權值x。操作2 更改某個點的權值y。操作3 求a b路徑上所有x屬性與a,b相同的點y屬性的和。操作4 求a b路徑上所有x屬性與a,b相同的點y屬性的最大值。n,q...