先讓我%一發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...