博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CodeForces 191C 树链剖分 第4遍
阅读量:7144 次
发布时间:2019-06-29

本文共 2470 字,大约阅读时间需要 8 分钟。

非常无奈,模板重新无奈的打错了。。

只是,非常快便找到了。。

题意:给一些边,有一些操作,每次操作,都要在这些边上加上1,求每一个边的边权。。

#include
#include
#include
#include
using namespace std;#define lson id << 1#define rson id << 1|1const int M = 100008;int top[M],siz[M],son[M],father[M],ti[M],dep[M];int e[M][2],idx,tp;struct { int head;}H[M];struct{ int v,next;}E[M*2];void init(){ memset(H,-1,sizeof(H)); memset(E,-1,sizeof(E)); tp = 0,idx = 0;}void add(int u,int v){ E[tp].v =v; E[tp].next = H[u].head; H[u].head = tp++;}void dfs_1(int u,int fa){ son[u] = 0;siz[u] = 1;father[u] = fa;dep[u] = dep[fa] + 1; for(int i=H[u].head;i!=-1;i=E[i].next){ int v = E[i].v; if(v == fa)continue; dfs_1(v,u); siz[u] += siz[v]; if(siz[v] > siz[son[u]])son[u] = v; }}void dfs_2(int u,int fa){ ti[u] = idx++; top[u] = fa; if(son[u])dfs_2(son[u],fa); for(int i=H[u].head;i!=-1;i=E[i].next){ int v = E[i].v; if(v == father[u]|| v == son[u])continue; dfs_2(v,v); }}struct M_tree{ int mark,l,r; int mid(){ return (l+r) /2; }}node[M*4];void build_tree(int id,int l,int r){ node[id].l = l;node[id].r = r;node[id].mark = 0; if(l == r)return; int mid = node[id].mid(); build_tree(lson,l,mid); build_tree(rson,mid+1,r);}void push_down(int id){ if(node[id].l == node[id].r)return; if(node[id].mark){ node[lson].mark += node[id].mark ; node[rson].mark += node[id].mark ; node[id].mark = 0; }}void nede(int id,int l,int r){ if(node[id].l == l&&node[id].r == r){ node[id].mark += 1; return; } push_down(id); int mid = node[id].mid(); if(r <=mid)nede(lson,l,r); else if(l > mid)nede(rson,l,r); else{ nede(lson,l,mid); nede(rson,mid+1,r); }}int ans = 0;int query(int id,int r){ if( node[id].l == r&&node[id].r == r)return node[id].mark; push_down(id); int mid= node[id].mid(); if(r <=mid)return query(lson,r); else return query(rson,r);}void negat(int u,int v){ int f1 = top[u]; int f2 = top[v]; while(f1 != f2){ if(dep[f1] < dep[f2]){ swap(f1,f2); swap(u,v); }//cout << ti[f1] << "<---->" << ti[u]<
dep[v])swap(u,v); nede(1,ti[son[u]],ti[v]);}int main(){ int u,v,n,m; while(~scanf("%d",&n)){ init(); for(int i=0;i
dep[e[i][1]]){ swap(e[i][0],e[i][1]); } } for(int i=0;i

转载地址:http://mywgl.baihongyu.com/

你可能感兴趣的文章
RxJava2源码分析(一):基本流程分析
查看>>
iOS两种颜色的线性渐变 --DDGBannerScrollView
查看>>
实战PHP数据结构基础之栈
查看>>
大数据与云计算的关系,Hadoop、Nosql如何参与其中?
查看>>
HTML5拖放的详解以及实例分享
查看>>
阿里巴巴前端工程师一面二面三面终面面经总结
查看>>
Python正则表达式初识(七)
查看>>
Cocos Creator踩坑日记(一)
查看>>
webpack之代码拆分
查看>>
.NET Core容器化@Docker
查看>>
(1)Linux性能调优之Linux进程管理
查看>>
每周一个 Python 模块 | operator
查看>>
【Android视图效果】仿QQ空间滑动改变标题栏颜色
查看>>
Synchronized原理
查看>>
服务化改造实践(三) | Dubbo + Zipkin
查看>>
Mysql 隔离级别
查看>>
图片加载之SDWebImage(上)
查看>>
iOS逆向之旅(进阶篇) — 代码注入
查看>>
Xcode 创建自定义模板
查看>>
非常经典的Java编程面试题!
查看>>