SPOJ太慢了,SPOJ太慢了,

题意:给定n(n<=10000)个节点的树,每条边有边权,有两种操作:1.修改某条变的边权;2.查询u,v之间路径上的最大边权。

分析:树链剖分入门题,看这里:http://blog.sina.com.cn/s/blog_6974c8b20100zc61.html

轻重链剖分,线段树维护,复杂度 O(nlogn + q* logn * logn )

SPOJ太慢了,我知道我写的应该是没错了,

最后把自己宏定义的max和min去掉之后终于过了,傻逼笑呵呵了。。为啥宏定义max,min占用这么长时间,求指教。

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;
#define maxn 10010 int w[maxn],son[maxn],sz[maxn],top[maxn],fa[maxn],dep[maxn];
int d1[maxn][];
int z;
int n ;
char str[];
struct node
{
int v ,next;
}; node e[maxn * ];
int cnt ;
int head[maxn];
int tt[maxn * ]; inline void add(int u ,int v)
{
e[cnt].v = v;
e[cnt].next = head[u];
head[u] = cnt ++ ;
return ;
}
void push_up(int root )
{
tt[root] = max(tt[root*],tt[root*+]);
}
inline void dfs1(int u ) // 计算 sz[],son[],dep[],fa[];
{
sz[u] = ;
son[u] = ;
for(int i = head[u] ; i != - ; i = e[i].next)
if(e[i].v != fa[u])
{
fa[e[i].v] = u;
dep[e[i].v] = dep[u] + ;
dfs1(e[i].v);
if(sz[e[i].v] > sz[son[u]] ) son[u] = e[i].v;
sz[u] += sz[e[i].v];
}
} void dfs2(int u,int tp) // 计算 w[],top[]
{
w[u] = ++ z ;
top[u] = tp;
if(son[u] != ) dfs2(son[u] , top[u]);
for(int i = head[u] ; i!= - ;i = e[i].next)
if(e[i].v != fa[u] && e[i].v != son[u] )
dfs2(e[i].v,e[i].v);
return ;
}
void update(int root,int l,int r,int pos,int val)
{
if(l == r )
{
tt[root] = val;
return ;
}
int mid = (l + r ) / ;
if(pos <= mid)
update(root + root ,l,mid, pos , val);
else
update(root + root + ,mid + , r , pos ,val);
push_up(root);
return ;
}
int query(int root,int l1,int r1,int l,int r)
{
if(l <= l1 && r1 <= r)
return tt[root];
int mid = (l1 + r1 ) / ;
int res = ;
if(l <= mid )
res = max(res , query(root + root,l1 , mid , l , r ));
if(r > mid )
res = max(res , query(root + root + ,mid + , r1 , l , r ));
return res;
}
int find(int a,int b)
{
int f1 = top[a] , f2 = top[b] , tmp = ;
while( f1 != f2 )
{
if(dep[f1] < dep[f2])
swap(f1,f2),swap(a,b);
tmp = max(tmp , query(,,z,w[f1],w[a]) );
a = fa[f1],f1 = top[a];
}
if(a == b) return tmp ;
if(dep[a] > dep[b]) swap(a,b);
return max(tmp , query(,,z,w[son[a]],w[b]) ); // 父边
} int main()
{
int root;
int u,v,w1;
int cas;
scanf("%d",&cas);
while(cas -- )
{
scanf("%d",&n);
cnt = ;
memset(head,-,sizeof(head));
memset(tt,,sizeof(tt));
for(int i = ; i < n ; i ++ )
{
scanf("%d%d%d",&u,&v,&w1);
d1[i][] = u;
d1[i][] = v;
d1[i][] = w1;
add(u,v);
add(v,u);
}
root = ;
dep[root] = ;
fa[root] = ;
dfs1(root);
z = ;
dfs2(root,root);
for(int i = ; i < n ; i ++ )
{
if(dep[d1[i][]] > dep[d1[i][]] ) swap(d1[i][],d1[i][]);
update(,,z,w[d1[i][]] ,d1[i][]);
}
scanf("%s",str);
while(str[] != 'D')
{
scanf("%d%d",&u,&v);
if(str[] == 'Q')
printf("%d\n",find(u,v));
else update(,,z,w[d1[u][]],v);
scanf("%s",str);
}
}
return ;
}
/*
tle
建树费时删去->tle
// luangao -> tle
去掉自己宏定义的max和min -> AC!!!!!!!!!!!!
*/

据说这题还可用link_cut tree做,论文没看懂。。。

看这里 QTREE解法的一些研究

这类问题是动态树问题:算法合集之《动态树问题及其应用》 ,也没看懂。。。。

SPOJ 375 树链剖分的更多相关文章

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

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

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

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

  3. SPOJ 375 树链剖分 QTREE - Query on a tree

    人生第一道树链剖分的题目,其实树链剖分并不是特别难. 思想就是把树剖成一些轻链和重链,轻链比较少可以直接修改,重链比较长,用线段树去维护. 貌似大家都是从这篇博客上学的. #include <c ...

  4. spoj 375 树链剖分模板

    /* 只是一道树链刨分的入门题,作为模板用. */ #include<stdio.h> #include<string.h> #include<iostream> ...

  5. spoj 375 树链剖分 模板

    QTREE - Query on a tree #tree You are given a tree (an acyclic undirected connected graph) with N no ...

  6. SPOJ QTREE 树链剖分

    树链剖分的第一题,易懂,注意这里是边. #include<queue> #include<stack> #include<cmath> #include<cs ...

  7. Spoj Query on a tree SPOJ - QTREE(树链剖分+线段树)

    You are given a tree (an acyclic undirected connected graph) with N nodes, and edges numbered 1, 2, ...

  8. 【学术篇】SPOJ QTREE 树链剖分

    发现链剖这东西好久不写想一遍写对是有难度的.. 果然是熟能生巧吧.. WC的dalao们都回来了 然后就用WC的毒瘤题荼毒了我们一波, 本来想打个T1 44分暴力 然后好像是特判写挂了还是怎么的就只能 ...

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

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

随机推荐

  1. Node.js 博客实例(五)编辑与删除功能

    原教程 https://github.com/nswbmw/N-blog/wiki/_pages的第五章,因为版本号等的原因,在原教程基础上稍加修改就可以实现. 如今给博客加入编辑文章与删除文章的功能 ...

  2. JAVA技术交流群

    推荐:组[八方扑灭]:http://jq.qq.com/?_wv=1027&k=RFLXu0. QQ: 292352612  集团专注于技术.软件project.JAVA.c\c++.WEB. ...

  3. MVC过滤器的详细讲解和示范样本

    MVC共有4个过滤器:ActionFilter(方法过滤器),ResultFilter(结果过滤器.感觉是不是很好,所以称它为),AuthorizationFilter(授权过滤器).Exceptio ...

  4. UVA 11388-GCD LCM(数学)

    I I U C   O N L I N E   C  Problem D: GCD LCM Input: standard input Output: standard output The GCD ...

  5. Apache+Tomcat部署负载均衡(或集群)

    本来只打算写Tomcat集群部署,简化Apache和Tomcat整合过程的.后来想了想,这样不便于没有用过Apache的朋友来学习本文内容.于是干脆加大篇幅,让对Apache不了解的朋友能对Apach ...

  6. 玩转Web之easyui(三)-----easy ui dataGird 重新指定url以获取不同数据源信息

    如果已经写了一个dataGird并且已经通过url绑定数据源,能不能在其他地方改变url使其从不同数据源获取信息,从而实现查询等操作?答案当然是肯定的,而且仅需要几行代码 $('#btnq').bin ...

  7. Flappy bird源代码(略吊)

    #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<time.h> #inc ...

  8. 有向图的邻接矩阵表示法(创建,DFS,BFS)

    package shiyan; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; publi ...

  9. android使用XmlPullParser来解析XML文件

    解析下面的一个XML: <?xml version="1.0" encoding="utf-8" ?> <rss><sid> ...

  10. FPGA 时序问题

    近期 做一个项目------4个 1080p(1920 x 1080) 合成 一个 4K(3840 x 2160,297M)的接口板.当 1080p 进去, 1080p出来的时候,视频正常 播放出来. ...