默默一看提交时间 ……

这是我以前的代码风格……

#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#define N 10005
#define lson(x) ((x<<1))
#define rson(x) ((x<<1)+1)
#define Del(a,b) memset(a,b,sizeof(a))
using namespace std; int dep[N],siz[N],fa[N],id[N],son[N],val[N],top[N];
int num;
vector<int> v[N]; struct tree {
int x,y,val;
void read()
{
scanf("%d%d%d",&x,&y,&val);
}
}e[N]; void dfs1(int u, int f, int d)
{
dep[u] = d;
siz[u] = 1;
son[u] = 0;
fa[u] = f;
for (int i = 0; i < v[u].size(); i++)
{
int ff = v[u][i];
if (ff == f) continue;
dfs1(ff, u, d + 1);
siz[u] += siz[ff];
if (siz[son[u]] < siz[ff])
son[u] = ff;
}
}
void dfs2(int u, int tp) {
top[u] = tp;
id[u] = ++num;
if (son[u]) dfs2(son[u], tp);
for (int i = 0; i < v[u].size(); i++) {
int ff = v[u][i];
if (ff == fa[u] || ff == son[u]) continue;
dfs2(ff, ff);
}
} struct Tree
{
int l,r,val;
};
Tree tree[4*N]; void pushup(int x)
{
tree[x].val = max(tree[lson(x)].val, tree[rson(x)].val);
} void build(int l,int r,int v)
{
tree[v].l=l;
tree[v].r=r;
if(l==r)
{
tree[v].val=val[l];
return ;
}
int mid=(l+r)>>1;
build(l,mid,v*2);
build(mid+1,r,v*2+1);
pushup(v);
} void update(int o,int v,int val)
{
if(tree[o].l==tree[o].r)
{
tree[o].val = val;
return ;
}
int mid = (tree[o].l+tree[o].r)/2;
if(v<=mid)
update(o*2,v,val);
else
update(o*2+1,v,val);
pushup(o);
} int query(int x,int l, int r)
{
if (tree[x].l >= l && tree[x].r <= r)
{
return tree[x].val;
}
int mid = (tree[x].l + tree[x].r) / 2;
int ans = 0;
if (l <= mid) ans = max(ans, query(lson(x),l,r));
if (r > mid) ans = max(ans, query(rson(x),l,r));
return ans;
} int Yougth(int u, int v)
{
int tp1=top[u],tp2=top[v];
int ans=0;
while (tp1!=tp2)
{
if (dep[tp1] < dep[tp2])
{
swap(tp1, tp2);
swap(u,v);
}
ans=max(query(1,id[tp1],id[u]),ans);
u=fa[tp1];
tp1=top[u];
}
if(u==v)return ans;
if(dep[u]>dep[v])swap(u, v);
ans=max(query(1,id[son[u]],id[v]),ans);
return ans;
} void Clear(int n)
{
for(int i=1;i<=n;i++)
v[i].clear();
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
for(int i=1;i<n;i++)
{
e[i].read();
v[e[i].x].push_back(e[i].y);
v[e[i].y].push_back(e[i].x);
}
num = 0;
dfs1(1,0,1);
dfs2(1,1);
for (int i = 1; i < n; i++)
{
if (dep[e[i].x] < dep[e[i].y]) swap(e[i].x, e[i].y);
val[id[e[i].x]]=e[i].val;
}
build(1,num,1);//构造线段树
char s[200];
while(~scanf("%s",&s)&&s[0]!='D')
{
int x,y;
scanf("%d%d",&x,&y);
if(s[0]=='Q')
printf("%d\n",Yougth(x,y));
if (s[0] == 'C')
update(1,id[e[x].x],y);
}
Clear(n);
}
return 0;
}

好像不太对

#include <algorihtm>
#include <iostream>
#include <cstring>
#include <vector>
#include <cstdio>
#define N 100005
using namespace std; void read(int &s){
char ch=getchar();int f=1;
for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1;
for(s=0;isdigit(ch);s=s*10+ch-'0',ch=getchar());
s*=f;
} int son[N],val[N],top[N];
int dep[N],siz[N];
int fa[N],id[N];
int num; struct Edge{
int u,v,nxt,val;
}e[N]; void AddEdge(int u,int v,int value){
e[++tot].v=v;e[tot].nxt=head[u];
head[u]=tot;e[tot].val=value;e[tot].u=u;
e[++tot].v=u;e[tot].nxt=head[v];
head[v]=tot;e[tot].val=value;e[tot].u=v;
} void dfs1(int u,int f){
dep[u]=dep[f]+1;int to;
siz[u]=1;son[u]=0;fa[u]=f;
for(int i=head[u];i;i=e[i],nxt){
to=e[i].v;
if(f=to)continue;
dfs1(to,u);size[u]+=siz[to];
if(siz[son[u]]<siz[to])son[u]=to;
}
} void dfs2(int u,int to){
top[u]=to;id[u]=++num;int v;
if(son[u])dfs(son[u],to);
for(int i=head[u];i;i=e[i].nxt){
int v=e[u].v;
if(v==fa[u]||v==son[u])continue;
dfs2(v,v);
}
} struct T{
int l,r,val;
}t[N<<2]; void pushup(int x){
t[x].val=max(t[x<<1].val,t[x<<1|1].val);
} void build(int l,int r,int ret){
t[ret].l=l;t[ret].r=r;
if(l==r){
t[ret].val=val[l];
return ;
}
int mid=(l+r)>>1;
build(l,mid,ret<<1);
build(mid+1,r,ret<<1|1);
pushup(ret);
} void update(int ret,int pos,int val){
if(t[ret].l==t[ret].r){
t[ret].val=val;
return;
}
int mid=(t[ret].l+t[ret].r)>>1;
if(pos<=mid)update(ret<<1,pos,val);
else update(ret<<1|1,pos,val);
pushup(ret);
} int query(int L,int R,int ret){
if(t[ret].l>=l&&t[ret].r<=r)
return t[ret].val;
int mid=(t[ret].l+t[ret].r)>>1;
int ans=0;
if(L<=mid)ans=max(ans,query(ret<<1,L,R));
if(R>mid)ans=max(ans,query(ret<<1|1,L,R));
return ans;
} int Youth(int u,int v){
int t1=top[u],t2=top[v];
int ans=0;
while(t1!=t2){
if(dep[t1]<dep[t2]){
swap(t1,t2);
swap(u,v);
}
ans=max(query(id[t1],id[u],1),ans);
u=fa[t1];
t1=top[u];
}
if(u==v)return ans;
if(dep[u]>dep[v])swap(u,v);
ans=max(query(id[son[u]],id[v],1),ans);
return ans;
} void Clear(int n){
for(int i=1;i<=n;++i)
head[i]=0;
tot=0;
} int main(){
int T,a,b,c,;read(T);
while(T--){
int n;read(n);
for(int i=1;i<n;++i){
read(a),read(b),read(c);
AddEdge(a,b,c);
}
num=0;
dfs1(1,0,1);
dfs2(1,1);
for(int i=1;i/2<n;++i){
if(dep[e[i].u]<dep[e[i].y])swap(e[i].x,e[i].y);
val[id[e[i].u]]=e[i].val;
}
build(1,num,1);
char s[200];
while(~scanf("%s",&s)&&s[0]!='D'){
int x,y;
scanf("%d%d",&x,&y);
if(s[0]=='Q')
printf("%d\n",Youth(x,y));
if(s[0]=='C')
update(1,id[e[x].u],y);
}
Clear(n);
}
return 0;

SPOJ 375的更多相关文章

  1. SPOJ 375. Query on a tree (树链剖分)

    Query on a tree Time Limit: 5000ms Memory Limit: 262144KB   This problem will be judged on SPOJ. Ori ...

  2. SPOJ 375 树链剖分

    SPOJ太慢了,SPOJ太慢了, 题意:给定n(n<=10000)个节点的树,每条边有边权,有两种操作:1.修改某条变的边权:2.查询u,v之间路径上的最大边权. 分析:树链剖分入门题,看这里: ...

  3. SPOJ 375. Query on a tree (动态树)

    375. Query on a tree Problem code: QTREE You are given a tree (an acyclic undirected connected graph ...

  4. spoj 375 query on a tree LCT

    这道题是树链剖分的裸题,正在学LCT,用LCT写了,发现LCT代码比树链剖分还短点(但我的LCT跑极限数据用的时间大概是kuangbin大神的树链剖分的1.6倍,所以在spoj上是850ms卡过的). ...

  5. SPOJ 375 Query on a tree 树链剖分模板

    第一次写树剖~ #include<iostream> #include<cstring> #include<cstdio> #define L(u) u<&l ...

  6. SPOJ 375 Query on a tree

    Description 给出一个树,每条边有边权,支持两种操作,询问 \(u,v\) 路径上边权最大值,修改第 \(i\) 条边的边权,\(n\leqslant 10^4,T\leqslant 10\ ...

  7. spoj 375 Query on a tree(树链剖分,线段树)

      Query on a tree Time Limit: 851MS   Memory Limit: 1572864KB   64bit IO Format: %lld & %llu Sub ...

  8. SPOJ 375 (树链剖分 - 边权剖分 - 修改单边权)

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28982#problem/I 给你一棵有边权的树,有两个操作:一个操作是输出l到 ...

  9. SPOJ 375 (树链剖分+线段树)

    题意:一棵包含N 个结点的树,每条边都有一个权值,要求模拟两种操作:(1)改变某条边的权值,(2)询问U,V 之间的路径中权值最大的边. 思路:最近比赛总是看到有树链剖分的题目,就看了论文,做了这题, ...

  10. 动态树(Link Cut Tree) :SPOJ 375 Query on a tree

    QTREE - Query on a tree #number-theory You are given a tree (an acyclic undirected connected graph) ...

随机推荐

  1. Hyperledger Fabric 实战(十): Fabric node SDK 样例 - 投票DAPP

    Fabric node SDK 样例 - 投票DAPP 参考 fabric-samples 下的 fabcar 加以实现 目录结构 . ├── app │ ├── controllers │ │ └─ ...

  2. BZOJ3238:[AHOI2013]差异——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3238 https://www.luogu.org/problemnew/show/P4248 参考 ...

  3. BZOJ3526 [Poi2014]Card 【线段树】

    题目链接 BZOJ3526 题解 思来想去,发现很显然可以用线段树维护 每个区间保存所有合法方案的左右端点[当左端点一定是,右端点当然存最小的那个就行了] 这么整的数,\(\frac{1}{1000} ...

  4. Cows POJ - 2481 树状数组

    Farmer John's cows have discovered that the clover growing along the ridge of the hill (which we can ...

  5. PowerDesigner逆向生成

    人越长大话越少,我们不再说今天受了委屈,不再说谁谁谁不理我了我好难过,不再分享生活中的琐事. 我知道人和人之间没法互相理解,大家都很忙,针也没扎在别人身上. 所以把那些还没说出口的话消化在每一步走过的 ...

  6. 在MVC5中使用Ninject 依赖注入

    各大主流.Net的IOC框架性能测试比较 : http://www.cnblogs.com/liping13599168/archive/2011/07/17/2108734.html 使用NuGet ...

  7. nginx 负载均衡实现

    https://www.cnblogs.com/wang-meng/p/5861174.html

  8. MyBatis框架的使用及源码分析(六) MapperRegistry

    我们先Mapper接口的调用方式,见<MyBatis框架中Mapper映射配置的使用及原理解析(一) 配置与使用>的示例: public void findUserById() { Sql ...

  9. javascript「篱式」条件判断

    我们已经知道,null 没有任何的属性值,并且无法获取其实体(existence)值.所以 null.property 返回的是错误(error)而不是 undefined . 考虑下面的代码 if ...

  10. Bat 命令相关

    1. bat 里面怎么sleep 等待: ping 127.0.0.1 -n 2000 > nul 2. net use 建立映射: net use Y: \\172.16.10.240\Inf ...