http://www.lydsy.com/JudgeOnline/problem.php?id=4515

把lca带进式子,得到新的式子

然后就是 维护树上一次函数取min

一个调了一下午的错误:

当一条线段完全在另一条线段之下时,用下面的完全覆盖上面的

判断条件为  两线段在范围内没有交点

然后若 新的线段的某一个端点<原来线段的对应的一个端点,就覆盖

错误的写法:

判断的时候 把两条线段在端点处相等也加了进去

即判断条件为  两线段在范围内没有交点 或 交点 在线段端点出

那么 若 新的线段的某一个端点<=原来线段的对应的一个端点,就覆盖

不对!!

因为交点在一个端点, 某一个端点<=原来线段的对应的一个端点,这个某一个交点 如果恰好是交点

那么这两条线段谁覆盖谁都有可能

所以应该是 若新线段有一个端点<原线段的对应端点,就覆盖

因为 一直没有找出上面的错误,而且是后10个点WA,所以一气之下把所有的int替换成了long long。。。。

#include<cstdio>
#include<iostream>
#include<algorithm> using namespace std; #define N 100001 #define min(x,y) ((x)<(y) ? (x) : (y)) typedef long long LL; const LL inf=; long long n,m; long long front[N],nxt[N<<],to[N<<],val[N<<],tot; long long fa[N],siz[N];
LL dep[N]; long long bl[N];
long long id[N],tim,dy[N]; LL mi[N<<];
LL mi_dep[N<<],mx_dep[N<<];
int who[N<<];
LL tagA[N<<],tagB[N<<];
long long L[N<<],R[N<<];
bool have[N<<]; LL A,B; LL ans; bool zero; void read(long long &x)
{
x=; long long f=; char c=getchar();
while(!isdigit(c)){ if(c=='-') f=-; c=getchar(); }
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
x*=f;
} void add(long long u,long long v,long long w)
{
to[++tot]=v; nxt[tot]=front[u]; front[u]=tot; val[tot]=w;
to[++tot]=u; nxt[tot]=front[v]; front[v]=tot; val[tot]=w;
} void init()
{
read(n); read(m);
long long u,v,w;
for(long long i=;i<n;++i)
{
read(u); read(v); read(w);
add(u,v,w);
}
} void dfs1(long long x)
{
siz[x]=;
for(long long i=front[x];i;i=nxt[i])
if(to[i]!=fa[x])
{
fa[to[i]]=x;
dep[to[i]]=dep[x]+val[i];
dfs1(to[i]);
siz[x]+=siz[to[i]];
}
} void dfs2(long long x,long long top)
{
bl[x]=top;
id[x]=++tim;
dy[tim]=x;
long long y=;
for(long long i=front[x];i;i=nxt[i])
if(to[i]!=fa[x] && siz[to[i]]>siz[y]) y=to[i];
if(!y) return;
dfs2(y,top);
for(long long i=front[x];i;i=nxt[i])
if(to[i]!=fa[x] && to[i]!=y) dfs2(to[i],to[i]);
} void build(long long k,long long l,long long r)
{
mi[k]=inf;
L[k]=l;
R[k]=r;
if(l==r)
{
mi_dep[k]=mx_dep[k]=dep[dy[l]];
who[k]=dy[l];
return;
}
long long mid=l+r>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
mi_dep[k]=min(mi_dep[k<<],mi_dep[k<<|]);
mx_dep[k]=max(mx_dep[k<<],mx_dep[k<<|]);
if(mx_dep[k]==mx_dep[k<<]) who[k]=who[k<<];
else who[k]=who[k<<|];
} double get_point(LL k1,LL b1,LL k2,LL b2)
{
if(k1==k2)
{
zero=true;
return ;
}
return 1.0*(b2-b1)/(k1-k2);
} void unionn_tag(long long k,LL tA,LL tB)
{
if(!have[k])
{
LL v;
if(tA>) v=tA*mi_dep[k]+tB;
else v=tA*mx_dep[k]+tB;
int kk=who[k];
if(v<mi[k]) mi[k]=v;
tagA[k]=tA;
tagB[k]=tB;
have[k]=true;
return;
}
if(!(R[k]-L[k]))
{
if(tA>) mi[k]=min(mi[k],tA*mi_dep[k]+tB);
else mi[k]=min(mi[k],tA*mx_dep[k]+tB);
return;
}
zero=false;
double foot=get_point(tA,tB,tagA[k],tagB[k]);
LL v1now=tA*dep[dy[R[k]]]+tB;
LL v2now=tA*dep[dy[L[k]]]+tB;
LL v1pre=tagA[k]*dep[dy[R[k]]]+tagB[k];
LL v2pre=tagA[k]*dep[dy[L[k]]]+tagB[k];
if(zero)
{
if(tB<tagB[k])
{
LL v;
if(tA>) v=tA*mi_dep[k]+tB;
else v=tA*mx_dep[k]+tB;
mi[k]=min(mi[k],v);
tagA[k]=tA;
tagB[k]=tB;
}
return;
}
if(foot<=dep[dy[L[k]]] || foot>=dep[dy[R[k]]])
{
if(v2now<v2pre || v1now<v1pre)
{
tagA[k]=tA;
tagB[k]=tB;
if(v1now>v2now) swap(v1now,v2now);
mi[k]=min(mi[k],v1now);
}
return;
}
long long mid=L[k]+R[k]>>;
if(foot<=dep[dy[mid]])
{
if(v1now<=v1pre)
{
unionn_tag(k<<,tagA[k],tagB[k]);
tagA[k]=tA;
tagB[k]=tB;
if(v1now>v2now) swap(v1now,v2now);
mi[k]=min(mi[k],v1now);
}
else
{
unionn_tag(k<<,tA,tB);
if(v1now>v2now) swap(v1now,v2now);
mi[k]=min(mi[k],v1now);
}
}
else
{
if(v1now<=v1pre)
{
unionn_tag(k<<|,tA,tB);
if(v1now>v2now) swap(v1now,v2now);
mi[k]=min(mi[k],v1now);
}
else
{
unionn_tag(k<<|,tagA[k],tagB[k]);
tagA[k]=tA;
tagB[k]=tB;
if(v1now>v2now) swap(v1now,v2now);
mi[k]=min(mi[k],v1now);
}
}
} void down(long long k)
{
if(!have[k]) return;
unionn_tag(k<<,tagA[k],tagB[k]);
unionn_tag(k<<|,tagA[k],tagB[k]);
tagA[k]=tagB[k]=;
have[k]=false;
} void change(long long k,long long l,long long r,long long opl,long long opr)
{
if(l>=opl && r<=opr)
{
unionn_tag(k,A,B);
return;
}
down(k);
long long mid=l+r>>;
if(opl<=mid) change(k<<,l,mid,opl,opr);
if(opr>mid) change(k<<|,mid+,r,opl,opr);
mi[k]=min(mi[k<<],mi[k<<|]);
} void Change(long long u,long long v)
{
while(bl[u]!=bl[v])
{
if(dep[bl[u]]<dep[bl[v]]) swap(u,v);
change(,,n,id[bl[u]],id[u]);
u=fa[bl[u]];
}
if(dep[u]>dep[v]) swap(u,v);
change(,,n,id[u],id[v]);
} void query(long long k,long long l,long long r,long long opl,long long opr)
{
if(l>=opl && r<=opr)
{
ans=min(ans,mi[k]);
return;
}
down(k);
long long mid=l+r>>;
if(opl<=mid) query(k<<,l,mid,opl,opr);
if(opr>mid) query(k<<|,mid+,r,opl,opr);
} void Query(long long u,long long v)
{
while(bl[u]!=bl[v])
{
if(dep[bl[u]]<dep[bl[v]]) swap(u,v);
query(,,n,id[bl[u]],id[u]);
u=fa[bl[u]];
}
if(dep[u]>dep[v]) swap(u,v);
query(,,n,id[u],id[v]);
} long long get_lca(long long u,long long v)
{
while(bl[u]!=bl[v])
{
if(dep[bl[u]]<dep[bl[v]]) swap(u,v);
u=fa[bl[u]];
}
return dep[u]<dep[v] ? u : v;
} void out(LL x)
{
if(x>=) out(x/);
putchar(x%+'');
} void solve()
{
long long ty,s,t,a,b;
long long lca;
while(m--)
{
read(ty); read(s); read(t);
lca=get_lca(s,t);
if(ty==)
{
ans=inf;
Query(t,s);
if(ans<) putchar('-'),ans=-ans;
out(ans);
putchar('\n');
}
else
{
read(a); read(b);
lca=get_lca(s,t);
A=-a; B=a*dep[s]+b;
// printf("%I64d\n",(dep[s]-dep[7])*a+b);
Change(lca,s);
A=a; B=(dep[s]-*dep[lca])*a+b;
// printf("%I64d\n",(dep[s]+dep[7]-2*dep[lca])*a+b);
Change(lca,t);
}
}
} int main()
{
init();
dfs1();
dfs2(,);
//for(int i=1;i<=n;++i) printf("%d\n",bl[i]);
build(,,n);
solve();
return ;
}

bzoj千题计划276:bzoj4515: [Sdoi2016]游戏的更多相关文章

  1. bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块

    http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...

  2. bzoj千题计划202:bzoj3191: [JLOI2013]卡牌游戏

    http://www.lydsy.com/JudgeOnline/problem.php?id=3191 每个人获胜的概率只与其在排列中与庄家的相对位置有关 dp[i][j] 还剩i个人时,从庄家数第 ...

  3. bzoj千题计划116:bzoj1025: [SCOI2009]游戏

    http://www.lydsy.com/JudgeOnline/problem.php?id=1025 题目转化: 将n分为任意段,设每段的长度分别为x1,x2,…… 求lcm(xi)的个数 有一个 ...

  4. bzoj千题计划112:bzoj1022: [SHOI2008]小约翰的游戏John

    http://www.lydsy.com/JudgeOnline/problem.php?id=1022 http://www.cnblogs.com/TheRoadToTheGold/p/67448 ...

  5. bzoj千题计划310:bzoj5285: [Hnoi2018]寻宝游戏(思维题+哈希)

    https://www.lydsy.com/JudgeOnline/problem.php?id=5285 |0 和 &1 没有影响 若填‘|’,记为0,若填‘&’,记为1 先只考虑最 ...

  6. bzoj千题计划283:bzoj4516: [Sdoi2016]生成魔咒(后缀数组)

    http://www.lydsy.com/JudgeOnline/problem.php?id=4516 考虑在后面新加一个字母产生的影响 假设是第i个 如果不考虑重复,那么会增加i个不同的字符串 考 ...

  7. bzoj千题计划282:bzoj4517: [Sdoi2016]排列计数

    http://www.lydsy.com/JudgeOnline/problem.php?id=4517 组合数+错排公式 #include<cstdio> #include<ios ...

  8. bzoj千题计划277:bzoj4513: [Sdoi2016]储能表

    http://www.lydsy.com/JudgeOnline/problem.php?id=4513 f[i][0/1][0/1][0/1] 从高到低第i位,是否卡n的上限,是否卡m的上限,是否卡 ...

  9. bzoj千题计划176:bzoj1199: [HNOI2005]汤姆的游戏

    http://www.lydsy.com/JudgeOnline/problem.php?id=1199 求出圆x的范围 把要判断的点按x从小到大排序 枚举图形 二分出x满足这个图形的一段区间 枚举这 ...

随机推荐

  1. 【BZOJ3680】吊打XXX(模拟退火)

    [BZOJ3680]吊打XXX(模拟退火) 题面 BZOJ 题解 模拟退火... 就是模拟退火 然后这题有毒 各种调参数之后终于\(AC\)了.. 这种题就是玄学呀... 温度要调大 最后跑完还要向四 ...

  2. 【CJOJ2512】gcd之和(莫比乌斯反演)

    [CJOJ2512]gcd之和(莫比乌斯反演) 题面 给定\(n,m(n,m<=10^7)\) 求 \[\sum_{i=1}^n\sum_{j=1}^mgcd(i,j)\] 题解 首先把公因数直 ...

  3. 【Luogu2458】保安站岗(动态规划)

    [Luogu2458]保安站岗(动态规划) 题面 题目描述 五一来临,某地下超市为了便于疏通和指挥密集的人员和车辆,以免造成超市内的混乱和拥挤,准备临时从外单位调用部分保安来维持交通秩序. 已知整个地 ...

  4. python中的小知识点

    这里是一些小知识点的汇集,为的是以后查找的方便. 行与缩进: 物理行:实际看到的代码行数. 逻辑行:在意义上的函数(即解释器执行的行数) 如果一个物理行中包含了多个逻辑行,则每个逻辑行之间需要用分号 ...

  5. C#开发Open-Webkit-Sharp浏览器并支持前端alert显示

    看了网上的很多教程,但是总是总是只言片语的,可能不同的人遇到的问题不一样,他们就只列举了自己的问题,那么这里我来做一下总结吧,跟大家分享一下我的完整的开发过程 首先你需要准备Visual Studio ...

  6. [Linux][Madplay播放器移植mini2440(ARM9)]

    Madplay移植到mini2440全过程详解 madplay交叉编译 交叉编译器:arm-linux-gcc 3.4.1PC环境:RedHat-6 注意:最好在root权限下执行以下移植,否则在ma ...

  7. 21.jQuery

    简介 jQuery是一个快速.简洁的JavaScript框架,jQuery设计的宗旨是"write Less,Do More",即倡导写更少的代码,做更多的事情.它封装JavaSc ...

  8. 洛谷 P1017 进制转换

    推荐洛谷 题目描述 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之和的形式.例如:123可表示为 1*10^2+2*10^1+ ...

  9. C语言编程之道--读书笔记

    C语言语法 const int nListNum =sizeof(aPrimeList)/sizeof(unsigned);//计算素数表里元素的个数 1:#define INM_MAX 32767 ...

  10. 如何关闭常见浏览器的 HSTS 功能

    在安装配置 SSL 证书时,可以使用一种能使数据传输更加安全的Web安全协议,即在服务器端上开启HSTS (HTTP Strict Transport Security).它告诉浏览器只能通过HTTP ...