poj3237 树链剖分 暴力
NEGATE a,b 将a b间的线段取反,这题应该用线段树+成段更新。我成段更新写的挫了,试了暴力修改过了(数据水)。
也是简单的题目。不过要注意点和边的区别。
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define INF 99999999
#define ll __int64
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int MAXN = ;
struct node{
int to;
int v;
int next;
}edge[MAXN*];
int ind,pre[MAXN],top[MAXN],fa[MAXN],siz[MAXN],son[MAXN],w[MAXN],deq[MAXN],fn;
int n,tree[MAXN<<],val[MAXN][],mark[MAXN<<];
void add(int x,int y,int z)
{
edge[ind].to = y;
edge[ind].v = z;
edge[ind].next = pre[x];
pre[x] = ind++;
}
void dfs1(int rt,int pa,int d)
{
deq[rt] = d;
siz[rt] = ;
fa[rt] = pa;
son[rt] = ;
for(int i=pre[rt]; i!=-; i=edge[i].next){
int t = edge[i].to;
if(t != fa[rt]){
dfs1(t,rt,d+);
siz[rt] += siz[t];
if(siz[son[rt]] < siz[t]){
son[rt] = t;
}
}
}
}
void dfs2(int rt,int tp)
{
top[rt] = tp;
w[rt] = ++fn;
if(son[rt] != ){
dfs2(son[rt],tp);
} for(int i=pre[rt]; i!=-; i=edge[i].next){
int t = edge[i].to;
if(t != fa[rt] && t != son[rt]){
dfs2(t,t);
}
}
}
void pushup(int rt)
{
tree[rt] = max(tree[rt<<],tree[rt<<|]);
}
/*void pushdown(int rt)
{
if(mark[rt] != 0){
if(mark[rt]%2){
tree[rt<<1] *= -1;
tree[rt<<1|1] *= -1;
}
mark[rt<<1] += mark[rt];
mark[rt<<1|1] += mark[rt];
mark[rt] = 0;
}
}*/
void updata(int p,int v,int l,int r,int rt)
{
if(l == r){
tree[rt] = v;
return ;
} int m = (l+r)/;
if(m >= p){
updata(p,v,lson);
}
else {
updata(p,v,rson);
}
pushup(rt);
} void seg_updata(int L,int R,int l,int r,int rt)
{
if(l == r){
tree[rt] *= -;
return ;
}
int m = (l+r)/;
if(m >= L){
seg_updata(L,R,lson);
}
if(m < R){
seg_updata(L,R,rson);
}
pushup(rt);
}
void updata_all(int x,int y)
{
while(top[x] != top[y])
{
if(deq[top[x]] < deq[top[y]]){
swap(x,y);
}
seg_updata(w[top[x]],w[x],,fn,);
x = fa[top[x]];
}
if(x == y){
return ;
}
if(deq[x] < deq[y]){
swap(x,y);
}
seg_updata(w[son[y]],w[x],,fn,);
}
int query(int L,int R,int l,int r,int rt)
{
if(L<=l && r<=R){
return tree[rt];
}
int m = (l+r)/;
int ans = -INF;
if(m >= L){
ans = max(ans,query(L,R,lson));
}
if(m < R){
ans = max(ans,query(L,R,rson));
}
return ans;
}
int lca(int x,int y)
{
int ans = -INF;
while(top[x] != top[y])
{
if(deq[top[x]] < deq[top[y]]){
swap(x,y);
}
ans = max(ans,query(w[top[x]],w[x],,fn,));
x = fa[top[x]];
}
if(x == y)
return ans;
if(deq[x] < deq[y]){
swap(x,y);
}
ans = max(ans,query(w[son[y]],w[x],,fn,));
return ans;
}
int main()
{
int t,i,j;
scanf("%d",&t);
while(t--)
{
ind = ;
memset(pre,-,sizeof(pre));
scanf("%d",&n);
for(i=; i<n; i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
val[i][] = x;
val[i][] = y;
val[i][] = z;
}
dfs1(,,);
fn = ;
dfs2(,);
for(i=; i<n; i++){
if(deq[val[i][]] < deq[val[i][]]){
swap(val[i][],val[i][]);
}
updata(w[val[i][]],val[i][],,fn,);
}
char s[];
memset(mark,,sizeof(mark));
while()
{
scanf("%s",s);
if(s[] == 'D')
break;
if(s[] == 'C'){
int x,y;
scanf("%d%d",&x,&y);
updata(w[val[x][]],y,,fn,);
}
else if(s[] == 'N'){
int x,y;
scanf("%d%d",&x,&y);
updata_all(x,y);
}
else {
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",lca(x,y));
}
}
}
}
poj3237 树链剖分 暴力的更多相关文章
- POJ3237 (树链剖分+线段树)
Problem Tree (POJ3237) 题目大意 给定一颗树,有边权. 要求支持三种操作: 操作一:更改某条边的权值. 操作二:将某条路径上的边权取反. 操作三:询问某条路径上的最大权值. 解题 ...
- HDU 5840 This world need more Zhu 树链剖分+暴力
This world need more Zhu 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5840 Description As we all ...
- poj3237树链剖分边权+区间取负
树链剖分+线段树lazy-tag在树链上操作时千万不要写错.. /* 树链剖分+线段树区间变负 */ #include<iostream> #include<cstring> ...
- 【POJ3237】Tree(树链剖分)
题意:在一棵N个节点,有边权的树上维护以下操作: 1:单边修改,将第X条边的边权修改成Y 2:区间取反,将点X与Y在树上路径中的所有边边权取反 3:区间询问最大值,询问X到Y树上路径中边权最大值 n& ...
- 【POJ3237】Tree(树链剖分+线段树)
Description You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edg ...
- Cogs 1583. [POJ3237]树的维护 LCT,树链剖分
题目:http://cojs.tk/cogs/problem/problem.php?pid=1583 1583. [POJ3237]树的维护 ★★★☆ 输入文件:maintaintree.in ...
- POJ3237 Tree 树链剖分 线段树
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ3237 题意概括 Description 给你由N个结点组成的树.树的节点被编号为1到N,边被编号为1 ...
- [POJ3237]Tree解题报告|树链剖分|边剖
关于边剖 之前做的大多是点剖,其实转换到边剖非常简单. 我的做法是每个点的点权记录其到父亲节点的边的边权. 只要solve的时候不要把最上面的点记录在内就可以了. Tree Description Y ...
- POJ3237 Tree 树链剖分 边权
POJ3237 Tree 树链剖分 边权 传送门:http://poj.org/problem?id=3237 题意: n个点的,n-1条边 修改单边边权 将a->b的边权取反 查询a-> ...
随机推荐
- 【温故而知新-Javascript】使用事件
1. 使用简单事件处理器 可以用几种不同的方式处理事件.最直接的方式是用事件属性创建一个简单事件处理器(simple event handler).元素为它们支持的每一种事件都定义了一个事件属性.举个 ...
- 分层图+最短路算法 BZOJ 2763: [JLOI2011]飞行路线
2763: [JLOI2011]飞行路线 Time Limit: 10 Sec Memory Limit: 128 MB Description Alice和Bob现在要乘飞机旅行,他们选择了一家相 ...
- JAVASE笔记回顾
第一部分,JAVA基础和面向对象 part01 入门与开发环境搭建 1: 计算机基础知识(了解)(1)计算机(2)计算机硬件(3)计算机软件系统软件:windows,linux,mac应用软件:QQ, ...
- 漫谈计算摄像学 (一):直观理解光场(Light Field)
什么是计算摄像学 计算摄像学(Computational Photography)是近年来越来越受到注意的一个新的领域,在学术界早已火热.本来计算摄像学的业界应用在群众中一直没什么知名度,直到Lytr ...
- hdu-5496 Beauty of Sequence(递推)
题目链接: Beauty of Sequence Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java ...
- Android优化——UI优化(四) 使用stytle
使用style替换背景,防止Activity黑色背景闪过 1.原来的布局 <LinearLayout xmlns:android="http://schemas.android.com ...
- Centos7下修改默认网卡名(改为eth0)的操作记录
安装好centos7版本的系统后,发现默认的网卡名字有点怪,为了便于管理,可以手动修改.下面对centos7版本下网卡重命名操作做一记录:1)编辑网卡信息[root@linux-node2~]# cd ...
- html中的src与href的区别
写代码的时候就经常把这两个属性弄混淆,到底是href还是src,href标识超文本引用,用在link和a等元素上,href是引用和页面关联,是在当前元素和引用资源之间建立联系,src表示引用资源,表示 ...
- 给H5页面添加百分比的进度条,精确度高
进度条样式地址:http://sandbox.runjs.cn/show/6vxbxjrf SVG圆环样式地址:http://sandbox.runjs.cn/show/3ho1qpe9 原理:由于H ...
- rsyslog 日志统一搜集&message格式
日志格式修改: http://jiechao2012.blog.51cto.com/3251753/1143762 http://yulei7633.blog.51cto.com/149275 ...