CodeForces 191C 树链剖分 第4遍
非常无奈,模板重新无奈的打错了。。
只是,非常快便找到了。。
题意:给一些边,有一些操作,每次操作,都要在这些边上加上1,求每一个边的边权。。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define lson id << 1
#define rson id << 1|1
const 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]<<endl;
nede(1,ti[f1],ti[u]);
u = father[f1];f1 = top[u];
}
if(u == v)return;
if(dep[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<n-1;i++){
scanf("%d%d",&e[i][0],&e[i][1]);
add(e[i][0],e[i][1]);
add(e[i][1],e[i][0]); }
dfs_1(1,1);
dfs_2(1,1);
build_tree(1,0,idx-1);
//cout <<idx<<endl;
scanf("%d",&m);
while(m--){
scanf("%d%d",&u,&v); negat(u,v);
}
for(int i=0;i<n-1;i++)
{
if(dep[e[i][0]] > dep[e[i][1]]){
swap(e[i][0],e[i][1]);
}
}
for(int i=0;i<n-1;i++){
printf("%d",query(1,ti[e[i][1]]));
if(i!=n-2)printf(" ");
}
printf("\n");
}
}
CodeForces 191C 树链剖分 第4遍的更多相关文章
- Water Tree CodeForces 343D 树链剖分+线段树
Water Tree CodeForces 343D 树链剖分+线段树 题意 给定一棵n个n-1条边的树,起初所有节点权值为0. 然后m个操作, 1 x:把x为根的子树的点的权值修改为1: 2 x:把 ...
- Codeforces Round #425 (Div. 2) Problem D Misha, Grisha and Underground (Codeforces 832D) - 树链剖分 - 树状数组
Misha and Grisha are funny boys, so they like to use new underground. The underground has n stations ...
- CodeForces - 343D 树链剖分
题目链接:http://codeforces.com/problemset/problem/343/D 题意:给定一棵n个n-1条边的树,起初所有节点权值为0,然后m个操作. 1 x:把x为根的子树的 ...
- Educational Codeforces Round 3 E. Minimum spanning tree for each edge (最小生成树+树链剖分)
题目链接:http://codeforces.com/contest/609/problem/E 给你n个点,m条边. 问枚举每条边,问你加这条边的前提下组成生成树的权值最小的树的权值和是多少. 先求 ...
- Codeforces Round #329 (Div. 2) D. Happy Tree Party 树链剖分
D. Happy Tree Party Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/593/p ...
- 【Codeforces】【网络流】【树链剖分】【线段树】ALT (CodeForces - 786E)
题意 现在有m个人,每一个人都特别喜欢狗.另外还有一棵n个节点的树. 现在每个人都想要从树上的某个节点走到另外一个节点,且满足要么这个人自带一条狗m,要么他经过的所有边h上都有一条狗. 2<=n ...
- Codeforces 704E Iron Man [树链剖分,计算几何]
Codeforces 这题--真是搞死我了-- 好不容易下定了决心要不颓废,要写题,结果一调就调了十几个小时-- 思路 我们发现在树上做非常不舒服,于是树链剖分之后一次在重链上的移动就可以看做是在df ...
- D. Happy Tree Party CodeForces 593D【树链剖分,树边权转点权】
Codeforces Round #329 (Div. 2) D. Happy Tree Party time limit per test 3 seconds memory limit per te ...
- Codeforces 343D Water Tree & 树链剖分教程
原题链接 题目大意 给定一棵根为1,初始时所有节点值为0的树,进行以下三个操作: 将以某点为根的子树节点值都变为1 将某个节点及其祖先的值都变为0 *询问某个节点的值 解题思路 这是一道裸的树链剖分题 ...
随机推荐
- 在Livemedia的基础上开发自己的流媒体客户端
一.背景 二.Livemedia框架介绍 1.总体框架 2.客户端框架 2.1 客户端openRTSP流程 2.2增加一种新的媒体 2.2.1增加媒体的format 2.2.2 新媒体需要考虑的问题 ...
- ORACLE中date类型字段的处理
(1)在英文版本的ORACLE中默认日期格式为'DD-MON-YY',例如'01-JAN-98' 在汉化的中文版本中ORACLE默认日期格式为'日-月-年',例如'21-8月-2003'或'21-8月 ...
- 禁止apache显示目录索引
1)修改目录配置: 复制代码 代码如下: <Directory "D:/Apache/blog.phpha.com">Options Indexes FollowSym ...
- SharePoint 2010 用Event Receiver将文件夹自动变成approved状态 (1)
当开发一个sharepoint门户网站,或者是一个内容管理的网站的时候,站点的模板通常会选用publish portal,或者是开启了publishing feature来对内容进行版本控制和流程控制 ...
- 【Android病毒分析报告】 - ZxtdPay 吸费恶魔
本文章由Jack_Jia编写,转载请注明出处. 文章链接:http://blog.csdn.net/jiazhijun/article/details/11581543 作者:Jack_Jia ...
- android编译系统的makefile文件Android.mk写法如下
(1)Android.mk文件首先需要指定LOCAL_PATH变量,用于查找源文件.由于一般情况下Android.mk和需要编译的源文件在同一目录下,所以定义成如下形式:LOCAL_PATH:=$(c ...
- BZOJ 1664: [Usaco2006 Open]County Fair Events 参加节日庆祝( dp )
先按时间排序( 开始结束都可以 ) , 然后 dp( i ) = max( dp( i ) , dp( j ) + 1 ) ( j < i && 节日 j 结束时间在节日 i 开 ...
- js中访问对象的方法
如果在js中定义了一个变量obj1,如 var obj1 = 234; 那么访问这个边个两的方式至少有两种, 1 window["obj1"],那么值为234, 2 var tar ...
- php随笔8-thinkphp OA系统 客户管理
Action: CustomerinfosAction.class.php <?php /* * 客户信息 控制器 * @author lifu <504861378@qq.com> ...
- Linux解压缩总结
看文件名的后缀名,不同的后缀的文件解压和压缩的命令都不一样总结如下: *.tar 用 tar –xvf 解压 *.gz 用 gzip -d或者gunzip 解压 *.tar.gz和*.tgz 用 ta ...