Description

HY Star是一个处处充满和谐,人民安居乐业的星球,但是HYStar却没有被评上宇宙文明星球,很大程度上是因为星球的形象问题。

HY Star由N个国家组成,并且在一些国家之间修建了道路以方便交流。由于HY Star是一个和谐的

星球,因此任意两个国家有且仅有一条路径连接它们。而让HYStar备受诟病的便是他们修建的道路的颜色过于单调,全部是使用灰色。

经过了一年又一年的宇宙文明星球的落选,HY Star的首领BOSS决定改变这种状况,但是他并

不想重新修建新的道路,因为这太耗费人力物力,他决定将已有的道路重新涂色。在各方的讨论下,BOSS决定将现有的道路涂成彩虹的颜色。每一天,BOSS都会选择两个国家A,B和一种颜色C,并将A,B之间颜色不是C的道路的颜色都涂成C。

BOSS将涂色的具体计划预先告诉了颜料厂,以便有充足的时间来准备颜料。作为颜料厂的负责人,你需要知道每种颜色被使用了多少次。

Input

第一行,一个整数N,表示HY Star的国家的编号是1~N。

下面若干行,每行两个数A,B,表示A,B之间有道路直接连接。

下面一行,一个整数Q,表示计划的持续天数。

下面Q行,每行三个正整数,S,T,C(1<=S,T<=N,1<=C<=7),表示将S,T之间颜色不是C的道路的颜色都涂成C。

1 < = N,Q < = 200000

Output

共包含7行,第i行包含一个整数,表示颜色i的使用次数。

Sample Input:

4

1 2

2 3

3 4

3

1 4 1

2 4 2

1 3 1

Out put:

4

2

0

0

0

0

0

Solution:

本题可以用树链剖分来解决,线段树的维护方法有两种:

每个区间记录7个颜色的值每个区间记录当前颜色值

第一种方法我们不在此讨论,我们来讲第二种方法

若当前区间的颜色为同一种,则记录这种颜色,否则为0

每次更新之前,就把这条区间长度减去原有的颜色数量,在把答案加到数组里去就行了

更新时就按照普通线段树来更新,要注意的是,本题细节很重要

Code:

#include<bits/stdc++.h>
#define N 2000001
#define inf 19260817
#define ls q<<1
#define rs q<<1|1
using namespace std;
int n,m,tl,ans[10];
int fa[N],top[N],son[N],sz[N],dep[N];
int cnt,seg[N],tag[N<<2];
int tot,head[N],nxt[N<<1],to[N<<1];
void ins(int x,int y){
nxt[++tot]=head[x];
to[tot]=y;head[x]=tot;
}
void update(int q){tag[q]=(tag[ls]==tag[rs])?tag[ls]:0;}
void pushdown(int q,int l,int r){
if(!tag[q])return ;
tag[ls]=tag[rs]=tag[q];
}
void change(int q,int l,int r,int L,int R,int v){
if(tag[q]==v)return ;
if(l>=L&&r<=R){
tag[q]=v;
return ;
}
pushdown(q,l,r);
int mid=(l+r)>>1;
if(mid>=L)change(ls,l,mid,L,R,v);
if(mid<R)change(rs,mid+1,r,L,R,v);
update(q);
}
int query(int q,int l,int r,int L,int R,int col){
if(l>=L&&r<=R&&tag[q]==col)return r-l+1;
if(tag[q]!=0&&tag[q]!=col)return 0;
if(l==r)return 0;
pushdown(q,l,r);
int mid=(l+r)>>1,res=0;
if(mid>=L)res+=query(ls,l,mid,L,R,col);
if(mid<R)res+=query(rs,mid+1,r,L,R,col);
return res;
}
void dfs1(int x,int f){
int mxsz=0;
fa[x]=f;dep[x]=dep[f]+1;sz[x]=1;
for(int i=head[x];i;i=nxt[i]){
int y=to[i];
if(y==f)continue;
dfs1(y,x);sz[x]+=sz[y];
if(sz[y]>mxsz)son[x]=y,mxsz=sz[y];
}
}
void dfs2(int x,int topx){
seg[x]=++cnt;top[x]=topx;
if(!son[x])return ;
if(son[x])dfs2(son[x],topx);
for(int i=head[x];i;i=nxt[i]){
int y=to[i];
if(y==fa[x]||y==son[x])continue;
dfs2(y,y);
}
}
int Query(int x,int y,int col){
int ans=0;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
ans+=query(1,1,n,seg[top[x]],seg[x],col);
x=fa[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
ans+=query(1,1,n,seg[x]+1,seg[y],col);
return ans;
}
int Tot(int x,int y){
int t=0;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
t+=seg[x]-seg[top[x]]+1;
x=fa[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
t+=seg[y]-seg[x];
return t;
}
void Change(int x,int y,int col){
int lst=Query(x,y,col);
int xx=x,yy=y;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
change(1,1,n,seg[top[x]],seg[x],col);
x=fa[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
change(1,1,n,seg[x]+1,seg[y],col);
ans[col]+=Tot(xx,yy)-lst;
}
int read(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int main(){
n=read();
for(int i=1;i<n;i++){
int x=read(),y=read();
ins(x,y);ins(y,x);
}
m=read();dfs1(1,0);dfs2(1,1);
for(int i=1;i<=m;i++){
int x=read(),y=read(),col=read();
Change(x,y,col);
}
for(int i=1;i<=7;i++)printf("%d\n",ans[i]);
return 0;
}

[Ispc2009]Let there be rainbows!的更多相关文章

  1. puma vs passenger vs rainbows! vs unicorn vs thin 适用场景 及 performance

    ruby的几个web server,按照开发活跃度.并发方案及要点.适用场景等分析puma vs passenger vs rainbows! vs unicorn vs thin. 1. thin: ...

  2. ZOJ 3967 Colorful Rainbows --栈的应用

    题意:给出n条y=ai*x+bi的直线.对于这些直线,如果存在x使得该直线y大于其他任意一直线,那么这条直线可以被看见,问有多少条直线可以被看见. 做法什么的不讲了,参见:http://blog.cs ...

  3. ZOJ 2967 Colorful Rainbows 【Stack】

    解决此题方法类似于凸包,先把所有直线按照斜率a由小到大排序 斜率相同取b较大的,扔掉b小的 (可以在遍历的时候忽视).于是所有直线斜率不同. 准备一个栈 (手动模拟), 栈里面存放上一次能看到的“最上 ...

  4. ZOJ 2967 Colorful Rainbows

    暴力. 先删掉一些边,平行的线只保留$b$最大的.然后暴力,每次放入第$i$条边,和还没有被完全覆盖的边都算一遍,更新一下. #pragma comment(linker, "/STACK: ...

  5. 7个高性能JavaScript代码高亮插件

    本文由码农网 – 小峰原创,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划! 对于喜欢写技术博客的同学来说,一定对代码高亮组件非常熟悉.一款优秀的JavaScript代码高亮插件,将会帮助你渲染 ...

  6. [转]7个高性能JavaScript代码高亮插件

    对于喜欢写技术博客的同学来说,一定对代码高亮组件非常熟悉.一款优秀的JavaScript代码高亮插件,将会帮助你渲染任何一种编程语言,包括一些关键字的着色,以及每行代码的缩进等.今天我们要来分享一些高 ...

  7. Angular中使用Rainbow

    在使用js类库和框架的时候,大家都习惯于编写自己的使用示例,如果能将示例中的html,js和css 进行展示, 并进行高亮显示,效果会很棒,例如在html高亮显示jquery代码 上面的示例是使用ra ...

  8. 快速破解哈希密文findmyhash

    快速破解哈希密文findmyhash   Kali Linux提供各种哈希密文破解工具,如hashcat.john.rainbows.不论哪一种,实施破解都不太容易.每种方式都需要花费大量的时间.破解 ...

  9. 美丽的阴影(剖析jquery主页)

    jquery Download API Documentation Blog Plugins Browser Support jquery主页第一眼看到的就是这个玻璃渣效果,设计者利用高光和阴影制造出 ...

随机推荐

  1. centos7 上安装mysql5.7后登录报错ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: Yes 或者No)

    原文转载自以下链接:https://blog.csdn.net/keepd/article/details/77151006 安装完mysql后会有个临时密码去日志查看,但是查看登录修改密后还是不行 ...

  2. Swing的概述

    Swing在Java中是一个包,下面就是它的基本概述:简介: Java为了方便图形界面的实现, 专门设计了类库来满足各种各样的图形元素和用户交互事件, 该类库即为抽象窗口工具箱(Abstract Wi ...

  3. 【坚持】Selenium+Python学习之从读懂代码开始 DAY4

    2018/05/21 [生成器详解:廖雪峰的官方网站](https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d ...

  4. 第33次Scrum会议(11/21)【欢迎来怼】

    一.小组信息 队名:欢迎来怼小组成员队长:田继平成员:李圆圆,葛美义,王伟东,姜珊,邵朔,阚博文 小组照片 二.开会信息 时间:2017/11/21 11:35~11:57,总计22min.地点:东北 ...

  5. Daily Scrum10 11.14

    昨天的任务已经完成,但是我们在完成任务的过程中确实遇到了困难.昨天我们发现无法连接sqlserver的时候,给罗杰老师发了邮件.老师也给我们提出了建议,给我们提供了一些参考.所以今天大家都在研究如何解 ...

  6. Daily Scrumming* 2015.10.27(Day 8)

    一.总体情况总结 今日项目总结: 前后端同一了API设计以及API权限认证.用户状态保存的开发方案 API以及后端模型已经开始开发,前端UEditor开始学习,本周任务有良好的起步 前后端完成分工,后 ...

  7. 《Spring2之站立会议5》

    <Spring2之站立会议5> 昨天,接着对主界面进行代码的编写,实现了界面的美化,从图片库中调了一些图片对其进行优化: 今天,向主界面中加入语音功能部分的代码: 遇到的问题:发现虽然是调 ...

  8. 我对git的认识

    Git 真的是不了解 也没听说过git 所以真的不知道从何谈起 所以就参考度娘啦! Git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的项目版本管理.Git 是 Linus To ...

  9. bata6

    目录 组员情况 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:恺琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示组内最新成果 团队签入记 ...

  10. myeclipse 导入 import maven web project

    用google才收到了这个.. http://stackoverflow.com/questions/12197662/maven-java-web-project-not-recognised-wh ...