这是我的第一个边权链剖

COGS上和SPOJ有点不一样就是没有多组数据了本质还是一样的

我写的是COGS那个事实上改一改就能够去SPOJ AC了= -=

(但是我如今上不去SPOJ卧槽(╯‵□′)╯︵┻━┻)

【题目描写叙述】

一天机房的夜晚,无数人在MC里奋斗着。。。

大家都知道矿产对于MC来说是多么的重要。但因为矿越挖越少,勇士们不得不跑到更远的地方挖矿,但这样路途上就会花费相当大的时间。导致挖矿效率低下。

cjj提议修一条铁路。大家一致允许。

大家都被CH分配了一些任务:

zjmfrank2012负责绘制出一个矿道地图,这个地图包含家(当然这也是一个矿。毕竟不把家掏空我们是不会走的)。和无数个矿。所以大家应该能够想出这是一个无向无环图,也就是一棵树。

Digital_T和cstdio负责铺铁路。

所以这里没他们什么事。两位能够劳作去了。

这个时候song526210932和RMB突然发现有的矿道会刷怪,而且怪的数量会发生变化。作为採矿主力,他们想知道从一个矿到还有一个矿的路上哪一段会最困难。

。(困难值用zjm的死亡次数表示)。

【输入格式】

输入文件的第一行有一个整数N。代表矿的数量。矿的编号是1到N。

接下来N-1行每行有三个整数a,b,c。代表第i号矿和第j号矿之间有一条路。在初始时这条路的困难值为c。

接下来有若干行,每行是“CHANGE i ti”或者“QUERY a b”,前者代表把第i条路(路按所给顺序从1到M编号)的困难值改动为ti,后者代表查询a到b所经过的道路中的最大困难值。

输入数据以一行“DONE”结束。

【输出格式】

对每一个“QUERY”操作,输出一行一个正整数,即最大困难值。

【例子输入】

3

1 2 1

2 3 2

QUERY 1 2

CHANGE 1 3

QUERY 1 2

DONE

【例子输出】

1

3

【提示】

对于60%的数据。1≤N≤50

对于100%的数据。1≤N≤10000,1≤c≤1000000,1≤操作次数≤100000

【来源】

由GDFRWMY 改编自SPOJ 375 QTREE

数据by cstdio

边权链剖略蛋疼

我用每条边两个端点里深度比較大的那个以点权继承这条边的边权

最后在Query_max函数在树的统计Count基础上略微改了改即可了

(直接暴力用LCA会出傻逼的错误我一開始居然没注意到多亏zky学长提醒QUQ)

//AC code by CreationAugust
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAXINT 0x7fffffff
#define MAXN 100010
#define lchild rt<<1,l,mid
#define rchild rt<<1|1,mid+1,r
#define ln rt<<1
#define rn rt<<1|1
using namespace std;
int w;
int val[MAXN];
int size[MAXN],deep[MAXN],chain[MAXN],num[MAXN],fa[MAXN][18];
bool vis[MAXN];
int top,tp;
int a,b;
int u,v;
int n,T;
int x[MAXN],y[MAXN],z[MAXN];
char ch[6];
struct edge
{
edge *next;
int val;
int to;
}*prev[MAXN],e[MAXN*2];
struct seg
{
int maxn;
int l;
int r;
}tree[MAXN*4];
inline void insert(int u,int v,int w)
{
e[++top].to=v;
e[top].val=w;
e[top].next=prev[u];
prev[u]=&e[top];
}
inline void dfs1(int x)
{
size[x]=1;
vis[x]=1;
for (int i=1;i<=17;i++)
{
if (deep[x]<(1<<i)) break;
fa[x][i]=fa[fa[x][i-1]][i-1];
}
for (edge *i=prev[x];i;i=i->next)
{
int t=i->to;
if (vis[t]) continue;
deep[t]=deep[x]+1;
fa[t][0]=x;
dfs1(t);
size[x]+=size[t];
}
}
inline void dfs2(int x,int last)
{
chain[x]=last;
num[x]=++tp;
int t=0;
for (edge *i=prev[x];i;i=i->next)
if (deep[i->to]>deep[x]&&size[t]<size[i->to])
t=i->to;
if (!t) return;
dfs2(t,last);
for (edge *i=prev[x];i;i=i->next)
if (deep[i->to]>deep[x]&&i->to!=t)
dfs2(i->to,i->to);
}
inline void push_up(int rt)
{
tree[rt].maxn=max(tree[ln].maxn,tree[rn].maxn);
}
inline void build(int rt=1,int l=1,int r=n)
{
tree[rt].l=l;
tree[rt].r=r;
if (l==r) return;
int mid=(l+r)>>1;
build(lchild);
build(rchild);
}
inline int lca(int a,int b)
{
if (deep[a]<deep[b]) swap(a,b);
int t=deep[a]-deep[b];
for (int i=0;i<=17;i++)
if (t&(1<<i)) a=fa[a][i];
for (int i=17;i>=0;i--)
if (fa[a][i]!=fa[b][i])
{
a=fa[a][i];
b=fa[b][i];
}
if (a==b) return a;
else return fa[a][0];
}
void modify(int rt,int l,int r,int w)
{
int L=tree[rt].l,R=tree[rt].r,mid=(L+R)>>1;
if (L==l&&r==R)
{
tree[rt].maxn=w;
return;
}
if (l>mid) modify(rn,l,r,w);
else
if (r<=mid) modify(ln,l,r,w);
else
{
modify(lchild,w);
modify(rchild,w);
}
push_up(rt);
}
void Modify(int a,int b,int w)
{
while (chain[a]!=chain[b])
{
modify(1,num[chain[a]],num[a],w);
a=fa[chain[a]][0];
}
modify(1,num[b],num[a],w);
}
inline int query_max(int rt,int l,int r)
{
int L=tree[rt].l,R=tree[rt].r,mid=(L+R)>>1;
if (L==l&&R==r)
{
return tree[rt].maxn;
}
if (l>mid) return query_max(rn,l,r);
else
if (r<=mid) return query_max(ln,l,r);
else
return max(query_max(lchild),query_max(rchild));
}
inline int Query_max(int a,int b)
{
int ret=-MAXINT;
while (chain[a]!=chain[b])
{
ret=max(ret,query_max(1,num[chain[a]],num[a]));
a=fa[chain[a]][0];
}
if (num[b]+1<=num[a])
ret=max(ret,query_max(1,num[b]+1,num[a]));
return ret;
}
int main()
{
freopen("qtree.in","r",stdin);
freopen("qtree.out","w",stdout);
scanf("%d",&n);
for (int i=1;i<n;i++)
{
scanf("%d%d%d",&u,&v,&w);
insert(u,v,w);
insert(v,u,w);
x[i]=u;
y[i]=v;
z[i]=w;
}
dfs1(1);
dfs2(1,1);
build();
for (int i=1;i<n;i++)
{
if (deep[x[i]]<deep[y[i]])
val[y[i]]=z[i];
else
val[x[i]]=z[i];
}
for (int i=1;i<=n;i++)
modify(1,num[i],num[i],val[i]);
while (1)
{
scanf("%s",ch);
if (ch[1]=='H')
{
scanf("%d%d",&a,&b);
if (deep[x[a]]<deep[y[a]])
modify(1,num[y[a]],num[y[a]],b);
else
modify(1,num[x[a]],num[x[a]],b);
}
else
if (ch[1]=='U')
{
scanf("%d%d",&a,&b);
int t=lca(a,b);
printf("%d\n",max(Query_max(a,t),Query_max(b,t)));
}
else
if (ch[1]=='O')
break;
}
}

【COGS1672】【SPOJ375】QTREE的更多相关文章

  1. 【疯狂造轮子-iOS】JSON转Model系列之二

    [疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...

  2. 【疯狂造轮子-iOS】JSON转Model系列之一

    [疯狂造轮子-iOS]JSON转Model系列之一 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 之前一直看别人的源码,虽然对自己提升比较大,但毕竟不是自己写的,很容易遗 ...

  3. 【原创分享·支付宝支付】HBuilder打包APP调用支付宝客户端支付

    前言 最近有点空余时间,所以,就研究了一下APP支付.前面很早就搞完APP的微信支付了,但是由于时间上和应用上的情况,支付宝一直没空去研究.然后等我空了的时候,发现支付宝居然升级了支付逻辑,虽然目前还 ...

  4. 【AutoMapper官方文档】DTO与Domin Model相互转换(上)

    写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) [Au ...

  5. 【Win 10 应用开发】应用预启动

    所谓预启动,其实你一看那名字就知道是啥意思了,这是直接译,也找不到比这个叫法更简练的词了.在系统资源允许的情况下(比如电池电量充足,有足够的内存空间),系统会把用户常用的应用程序在后台启动,但不会显示 ...

  6. 【Win 10 应用开发】启动远程设备上的应用

    这个功能必须在“红石-1”(build 14393)以上的系统版中才能使用,运行在一台设备上的应用,可以通过URI来启动另一台设备上的应用.激活远程应用需要以下前提: 系统必须是build 14393 ...

  7. 【开源】分享2011-2015年全国城市历史天气数据库【Sqlite+C#访问程序】

    由于个人研究需要,需要采集天气历史数据,前一篇文章:C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子),介绍了基本的采集思路和核心代码,经过1个星期的采集,历史数据库 ...

  8. 【原创分享·微信支付】C# MVC 微信支付教程系列之现金红包

            微信支付教程系列之现金红包           最近最弄这个微信支付的功能,然后扫码.公众号支付,这些都做了,闲着无聊,就看了看微信支付的其他功能,发现还有一个叫“现金红包”的玩意,想 ...

  9. 【原创分享·微信支付】 C# MVC 微信支付教程系列之扫码支付

    微信支付教程系列之扫码支付                  今天,我们来一起探讨一下这个微信扫码支付.何为扫码支付呢?这里面,扫的码就是二维码了,就是我们经常扫一扫的那种二维码图片,例如,我们自己添 ...

  10. 【原创分享·微信支付】 C# MVC 微信支付教程系列之公众号支付

    微信支付教程系列之公众号支付         今天,我们接着讲微信支付的系列教程,前面,我们讲了这个微信红包和扫码支付.现在,我们讲讲这个公众号支付.公众号支付的应用环境常见的用户通过公众号,然后再通 ...

随机推荐

  1. react-native-swiper苹果正常显示,Android不显示

    在使用react-native-swiper时,最好不要放到(FlatList , SectionList,ListView,ScrollView 等)组件中,否则Android 可能不会正常显示图片 ...

  2. qt qlineedit只输入数字

    lineEdit->setValidator(new QRegExpValidator(QRegExp("[0-9]+$")));

  3. HDU——T 1166 敌兵布阵

    http://acm.hdu.edu.cn/showproblem.php?pid=1166 Time Limit: 2000/1000 MS (Java/Others)    Memory Limi ...

  4. DataGirdView 常用操作

    1.将数据源的某列添加到已有DataGirdView的列 例如:将文件夹下所有文件名添加到DataGirdView 的文件名一列,图片如下: 首先在datagridview把文件名列的DATAPROP ...

  5. WIN10 10招

    还有不到两个月的时间,7 月 29 日 Windows 10 就将正式公布,在此之前已经有不少的用户已经使用上了 Windows 10 的预览版.对于那些苦等 Windows 10 的用户来说,幸福非 ...

  6. QQ 特效学习 二 侧滑删除

    上篇文章: http://www.cnblogs.com/xurui1995/p/5798631.html 今天来写不仅是qq而且在别的软件上也特别流行的侧滑删除 其实套路和前篇的一样,一个自定义Vi ...

  7. Python 面向对象 —— 多重继承

    多重继承(一个子类同时继承多个父类),容易造成混乱,即如果两个父类又相同的方法名和变量名时,无法确定继承哪一个. 正因如此,Java 等语言中并不支持多重继承(Java 是单继承多接口).Python ...

  8. JS面向对象系列教程 — 对象的基本操作

    面向对象概述  面向对象(Object Oriented)简称OO,它是一种编程思维,用于指导我们如何应对各种复杂的开发场景. 这里说的对象(Object),意思就是事物,在面向对象的思维中,它将一 ...

  9. FZU 1962 新击鼓传花游戏

    新击鼓传花游戏 Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on FZU. Original ID: 19 ...

  10. mysql判断一个字符串是否包含某子串 【转】

    文章出处:mysql判断一个字符串是否包含某子串 使用locate(substr,str)函数,如果包含,返回>0的数,否则返回0 例子:判断site表中的url是否包含'http://'子串, ...