zju1610Count the Colors
Time Limit: 2 Seconds Memory Limit: 65536 KB
Painting some colored segments on a line, some previously painted segments may be covered by some the subsequent ones.
Your task is counting the segments of different colors you can see at last.
Input
The first line of each data set contains exactly one integer n, 1 <= n <= 8000, equal to the number of colored segments.
Each of the following n lines consists of exactly 3 nonnegative integers separated by single spaces:
x1 x2 c
x1 and x2 indicate the left endpoint and right endpoint of the segment, c indicates the color of the segment.
All the numbers are in the range [0, 8000], and they are all integers.
Input may contain several data set, process to the end of file.
Output
Each line of the output should contain a color index that can be seen from the top, following the count of the segments of this color, they should be printed according to the color index.
If some color can't be seen, you shouldn't print it.
Print a blank line after every dataset.
Sample Input
5
0 4 4
0 3 1
3 4 2
0 2 2
0 2 3
4
0 1 1
3 4 1
1 3 2
1 3 1
6
0 1 0
1 2 1
2 3 1
1 2 0
2 3 0
1 2 1
Sample Output
1 1
2 1
3 1
1 1
0 2
1 1
Author: Standlove
Source: ZOJ Monthly, May 2003
乱的代码
#include <bits/stdc++.h>
const int MAXN=;
using namespace std;
struct node{
int l,r;
int c;//color
}tree[MAXN];
int n;
int color[MAXN];
//每个节点左右端点的颜色
int leftC[MAXN];
int rightC[MAXN]; void print(){
for(int i=;i<=;i++) cout<<tree[i].l<<" "<<tree[i].r<<" "<<tree[i].c<<endl;
} void build(int p,int l,int r){
tree[p].l=l;
tree[p].r=r;
tree[p].c=;
//拓展节点
if(l+<r){
int mid=(l+r)/;
build(*p,l,mid);
build(*p+,mid,r);
}
} void insert(int p,int l,int r,int c){//这里的l和r代表线段的左端点和右端点
//颜色不同才有涂色的必要
if(tree[p].c!=c){
cout<<c<<endl;
int mid=(tree[p].l+tree[p].r)/;//日常拆区间
if(l==tree[p].l&&r==tree[p].r){ tree[p].c=c;
}
else if(tree[p].l+==tree[p].r) return;//树的叶子节点
//区间不合适,我这是要拆区间的节奏,肯定会给加一种颜色造成混色
//可能没有交集么???不可能没有交集,不在左,毕在右,第一轮就给你分好了,所以肯定要进行母树颜色往下分的操作
else if(tree[p].c>=) {
//母树的颜色往下分
tree[*p].c=tree[p].c;
tree[*p+].c=tree[p].c;
tree[p].c=-;
if(r<mid) insert(*p,l,r,c);
else if(l>mid) insert(*p+,l,r,c);
else{//把线段拆了
insert(*p,l,mid,c);
insert(*p+,mid,r,c);
}
} }
} void count1(int p,int lc,int rc){
cout<<"p:"<<p<<" lc:"<<lc<<" rc"<<rc<<endl;
int tl=,tr=;
//单一颜色才计数
if(tree[p].c>=){
cout<<""<<endl;
cout<<"tree[p].c:"<<tree[p].c<<endl;
lc=tree[p].c;
rc=tree[p].c;
color[tree[p].c]++;//这种颜色的线段数加1
cout<<"p:"<<p<<" lc:"<<lc<<" rc"<<rc<<endl;
}
else if(tree[p].r-tree[p].l>){
count1(*p,lc,tl);
count1(*p+,tr,rc);
}
//每一轮做完就看p的左右孩子是否同色或者部分同色
if(tree[*p].r==tree[*p+].l){
color[tree[p].c]--;
}
} void count2(int p){
//单一颜色才计数
if(tree[p].c>=){
leftC[p]=tree[p].c;
rightC[p]=tree[p].c;
color[tree[p].c]++;//这种颜色的线段数加1
return;
}
else if(tree[p].r-tree[p].l>){
count2(*p);
leftC[p]=leftC[*p];
count2(*p+);
rightC[p]=rightC[*p+];
}
//每一轮做完就看p的左右孩子是否同色或者部分同色
if(rightC[*p]==leftC[*p+]){
color[rightC[*p]]--;
}
} void printColor(){
for(int i=;i<=;i++) cout<<color[i]<<" "; cout<<endl;
} int main(){
build(,,);
insert(,,,);
insert(,,,);
count2();
print();
printColor();
return ;
}
题解/solution:
这题大体和我写的解题报告(PPT1 例2)相同,只是在统计算法上要改一下。Look down!
图,come out. (懒得画树,将就一下)
用ls表示上一个颜色,如果当前颜色与ls不同,那给这个颜色加一。例:
ls颜色为空,而一区间为红,红加一,ls=红。
ls颜色为红,而三区间为蓝,蓝加一,ls=蓝。
以此类推......
type
arr=record
l,r:longint;
color:longint;
end;
var
tree:array [..] of arr;
ans:array [..] of longint;
n,m,ls,max_co:longint;
procedure cre(p,b,e:longint);
var
m:longint;
begin
with tree[p] do
begin
l:=b; r:=e; color:=-;
if e-b= then exit;
m:=(b+e) div ;
cre(p*,b,m);
cre(p*+,m,e);
end;
end; procedure ins(p,a,b,c:longint);
var
m:longint;
begin
with tree[p] do
begin
if color<>c then
begin
m:=(l+r) div ;
if (a=l) and (b=r) then color:=c else
begin
if color>= then
begin
tree[p*].color:=color;
tree[p*+].color:=color;
end;
color:=-;
if b<=m then ins(p*,a,b,c) else
if a>=m then ins(p*+,a,b,c) else
begin
ins(p*,a,m,c);
ins(p*+,m,b,c);
end;
end;
end;
end;
end; procedure count(p:longint);
begin
with tree[p] do
begin
if color>= then
begin
if color<>ls then
begin
inc(ans[color]);
ls:=color;
end;
exit;
end;
if color=- then
begin
ls:=color;
exit;
end;
count(p*);
count(p*+);
end;
end; procedure main;
var
i,x,y,z:longint;
begin
m:=;
while not eof do
begin
fillchar(ans,sizeof(ans),);
readln(n);
ls:=-; max_co:=-(maxlongint div );
cre(,,m);
for i:= to n do
begin
readln(x,y,z);
ins(,x,y,z);
if z>max_co then max_co:=z;
end;
count();
for i:= to max_co do
if ans[i]> then
writeln(i,' ',ans[i]);
writeln;
end;
end; begin
main;
end.
zju1610Count the Colors的更多相关文章
- Sort Colors
Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ...
- [LeetCode] Sort Colors 颜色排序
Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ...
- Leetcode 75. Sort Colors
Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ...
- CF444C. DZY Loves Colors[线段树 区间]
C. DZY Loves Colors time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Codeforces444C DZY Loves Colors(线段树)
题目 Source http://codeforces.com/problemset/problem/444/C Description DZY loves colors, and he enjoys ...
- Sort Colors [LeetCode]
Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ...
- 【LeetCode】Sort Colors
Sort Colors Given an array with n objects colored red, white or blue, sort them so that objects of t ...
- PAT (Advanced Level) Practise:1027. Colors in Mars
[题目链接] People in Mars represent the colors in their computers in a similar way as the Earth people. ...
- LintCode Sort Colors
For this problem we need to sort the array into three parts namely with three numbers standing for t ...
随机推荐
- 如何稀释 流事件 (如,onscroll、change、input、mouseover 等 事件)
1.问题引入:https://segmentfault.com/q/1010000000707337?_ea=62905 2.javascript中的函数节流和函数去抖:https://www.cnb ...
- [CSP-S模拟测试]:chemistry(期望DP+组合数学)
题目传送门(内部题27) 输入格式 第一行有$4$个整数$n,k,p,q$.第二行有$n$个整数$a_i$.接下来有$n-1$行,每行有两个整数$u,v$,表示$u$与$v$之间通过化学单键连接. 输 ...
- Java程序执行的过程
ava程序执行的过程: Step1:将字节码加入内存: Step2:对字节码进行合法性检查: Step3:jvm会为每个字节码文件都生成一个对象(class): Step4:执行静态代码块,初始化静态 ...
- (转)教你分分钟搞定Docker私有仓库Registry
转:https://www.cnblogs.com/Javame/p/7389093.html 一.什么是Docker私有仓库Registry 官方的Docker hub是一个用于管理公共镜像的好地方 ...
- T-SQL 创建触发器 禁止插入空值
---假设在SQL SERVER 2005里面有一张表,其中有两个字段需要做唯一性约束, ---不能有重复值,但是允许其为空值,如果都是空值,则允许重复 CREATE TRIGGER [dbo].[i ...
- 高并发大流量专题---3、前端优化(减少HTTP请求次数)
高并发大流量专题---3.前端优化(减少HTTP请求次数) 一.总结 一句话总结: 图片地图:使用<map><area></area></map>标签. ...
- Go的struct
1. 前言 Go的struct声明允许字段附带Tag来对字段做一些标记. 该Tag不仅仅是一个字符串那么简单,因为其主要用于反射场景,reflect包中提供了操作Tag的方法,所以Tag写法也要遵循一 ...
- [MAC]配置Jenkins 开机自启动
如果是将jenkins.war放在tomcat中运行的, 则可以配置开机启动tomcat,脚本如下: XXX表示是你安装Tomcat所在目录 #启动tomcat cd XXX/Tomcat8/bin ...
- 测开之路五十:monggodb安装与初步使用
mongodb下载地址:https://www.mongodb.com/download-center Robo3T下载地址:https://robomongo.org/ 安装mongodb 双击无脑 ...
- python可变参数类型 a,*args,**kwargs
a - int *args --tuple **kwargs -- dict *args是非关键字参数,用于元组,**kw是关键字参数,用于字典 可变参数 在Python函数中,还可以定义可变参数.顾 ...