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 树链剖分 暴力的更多相关文章

  1. POJ3237 (树链剖分+线段树)

    Problem Tree (POJ3237) 题目大意 给定一颗树,有边权. 要求支持三种操作: 操作一:更改某条边的权值. 操作二:将某条路径上的边权取反. 操作三:询问某条路径上的最大权值. 解题 ...

  2. 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 ...

  3. poj3237树链剖分边权+区间取负

    树链剖分+线段树lazy-tag在树链上操作时千万不要写错.. /* 树链剖分+线段树区间变负 */ #include<iostream> #include<cstring> ...

  4. 【POJ3237】Tree(树链剖分)

    题意:在一棵N个节点,有边权的树上维护以下操作: 1:单边修改,将第X条边的边权修改成Y 2:区间取反,将点X与Y在树上路径中的所有边边权取反 3:区间询问最大值,询问X到Y树上路径中边权最大值 n& ...

  5. 【POJ3237】Tree(树链剖分+线段树)

    Description You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edg ...

  6. Cogs 1583. [POJ3237]树的维护 LCT,树链剖分

    题目:http://cojs.tk/cogs/problem/problem.php?pid=1583 1583. [POJ3237]树的维护 ★★★☆   输入文件:maintaintree.in  ...

  7. POJ3237 Tree 树链剖分 线段树

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ3237 题意概括 Description 给你由N个结点组成的树.树的节点被编号为1到N,边被编号为1 ...

  8. [POJ3237]Tree解题报告|树链剖分|边剖

    关于边剖 之前做的大多是点剖,其实转换到边剖非常简单. 我的做法是每个点的点权记录其到父亲节点的边的边权. 只要solve的时候不要把最上面的点记录在内就可以了. Tree Description Y ...

  9. POJ3237 Tree 树链剖分 边权

    POJ3237 Tree 树链剖分 边权 传送门:http://poj.org/problem?id=3237 题意: n个点的,n-1条边 修改单边边权 将a->b的边权取反 查询a-> ...

随机推荐

  1. selenium如何跳转到iframe

    处理iframe,selenium提供了3中方法: 1.html的frame有id,传入id 2.html的frame有name,传入name 3.先找到iframe的元素,再传入该元素对象 跳出if ...

  2. codeforces 713B B. Searching Rectangles(二分)

    题目链接: B. Searching Rectangles time limit per test 1 second memory limit per test 256 megabytes input ...

  3. HDU 4990 Ordered Subsequence --数据结构优化DP

    题意:给一串数字,问长度为m的严格上升子序列有多少个 解法:首先可以离散化为10000以内,再进行dp,令dp[i][j]为以第i个元素结尾的长度为j的上升子序列的个数, 则有dp[i][j] = S ...

  4. UVA 12380 Glimmr in Distress --DFS

    题意:给你一串数字序列,只包含0,1,2,一路扫描过去,遇到2则新开一个2x2的矩阵,然后如果扫到0或1就将其填入矩阵,注意不能四个方格全是0或者全是1,那样跟一个方格没区别,所以21111这种是不可 ...

  5. (转)priority_queue的用法

    priority_queue调用 STL里面的 make_heap(), pop_heap(), push_heap() 算法实现,也算是堆的另外一种形式.先写一个用 STL 里面堆算法实现的与真正的 ...

  6. MAC中设置android adb环境变量

    1.找到android sdk的本地路径, adb命令在platform-tool下面,记为XXXX 我的路径是(/Applications/eclipse/android-sdk-mac_x86/p ...

  7. C语言 百炼成钢17

    //题目49:老师将糖果分成若干份,让学生按任意次序领取,第一个领取的,得到1份加上剩余糖果的1/10, //第二个领取的,得到2份加上剩余糖果的1/10,第三个领取的,得到3份加上剩余糖果的1/10 ...

  8. [转]一个四叉树Demo学习

    程序代码: http://www.codeproject.com/Articles/30535/A-Simple-QuadTree-Implementation-in-C 四叉树: using Sys ...

  9. 1从零开始学习Xamarin.iOS安装篇

    安装和配置xamarin.ios 最近.net 开源新闻很火呀,于是想学习xamarin,早1年前就了解过这个东西,但是一直没有时间来学习,我这里装的是MAC上面的版本,废话不多说开始第一步安装. 概 ...

  10. 20145316GDB调试汇编堆栈

    GDB调试例子的汇编堆栈 代码 直接-m32编译出现问题 编译64位Linux版本32位的二进制文件,需要安装一个库,使用指令sudo apt-get install libc6-dev-i386 编 ...