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 *询问某个节点的值 解题思路 这是一道裸的树链剖分题 ...
随机推荐
- Android 4.4及以上系统下应用的状态栏颜色渐变效果的实现
上一篇转载的博文里讲到了怎么开启状态栏透明的效果,不过如果在有ActionBar的情况下,会出现状态栏透明而ActionBar横亘在状态栏和内容之间的丑陋情况,如下图: 通过百度之后,发现了GitHu ...
- Qt 4.6: A Quick Start to Qt Designer
Qt 4.6: A Quick Start to Qt Designer A Quick Start to Qt Designer Using Qt Designer involves four ba ...
- 关于android源码中的APP编译时引用隐藏的API出现的问题
今天在编译android源码中的计算器APP时发现,竟然无法使用系统隐藏的API,比如android.os.ServiceManager中的API,引用这个类时提示错误,记忆中在android源码中的 ...
- hdu 3966 Aragorn's Story(树链剖分+树状数组)
pid=3966" target="_blank" style="">题目链接:hdu 3966 Aragorn's Story 题目大意:给定 ...
- 如何在UILable上添加点击事件?
最近开始学习iOS开发,今天上来写第一个iOS笔记 昨天碰到一个需求,在UILable上添加点击事件,网上找了写资料,有人建议用透明的UIButton覆盖,有人建议写一个集成自UILable的类,扩展 ...
- linux shell: 搜索字符串,剔除包含特定字符的行
搜索代码中出现CONFIG_BOOTARGS的行,但又不希望有#define和#undef, 暂时不知带如何直接用一个语句做到,因此用了如下三个语句. find . -type f | xargs g ...
- 设计模式值六大原则——里氏替换原则(LSP)
里氏替换原则(Liskov Substitution Principel)是解决继承带来的问题. 继承的优点: 代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性: 提高代码的重用性: 子类 ...
- java中printf中用法详解
目前printf支持以下格式: %c 单个字符 %d 十进制整数 %f 十进制浮点数 %o 八进制数 %s 字符串 %u 无符号十进制数 %x 十六进制数 %% 输出百分号% printf的格式控制的 ...
- 2013 南京邀请赛 K题 yet another end of the world
/** 大意:给定一组x[],y[],z[] 确定有没有两个不同的x[i], x[j] 看是否存在一个ID使得 y[i]<=ID%x[i]<=z[i] y[j]<=ID%x[j]&l ...
- C语言之辗转相除法
最大公约数和最小公倍数 从键盘输入两个正整数,求出其最大公约数和最小公倍数.代码如下: #include<stdio.h>int ss(int);int main(void){ int a ...