您的位置:首页 > 其它

Poj 2777 Count Color

2012-01-19 16:25 309 查看
题目大意:给你一个长度为n的线段(n<1000000),还有t种颜料(t<30)。有以下两种操作:

C a b c :将从a到b的线段涂上c色;

P a b:询问从a到b的线段上有多少种颜色。

思路:线段树的应用,另外还用到了一个线段树常用的思路——lazy。lazy顾名思义就是懒惰——这里是指在更新的时候,不必更新到每条元线段。

#include <iostream>
using namespace std;
#include <stdio.h>
#include <string.h>
#include <memory.h>
const int MAXN = 100005;
const int COLOR_NUM=35;
const int DEFAULT_COLOR=0;

struct node {
int left;
int right;
int color;
};
node tree[MAXN*5];
bool visit[COLOR_NUM];
int l;

void build(const int &left, const int &right, const int &node_num=1) {
tree[node_num].left=left;
tree[node_num].right=right;
tree[node_num].color=DEFAULT_COLOR;

if (left==right)
return;
int mid = (left+right) >> 1;
build(left,mid,2*node_num);
build(mid+1,right,2*node_num+1);
}
void init() {
build(1,l);
tree[1].color=1;
}
void insert(const int &left, const int &right, const int &color, const int &node_num = 1 ) {
if (left==tree[node_num].left&&right==tree[node_num].right) {
tree[node_num].color=color;
return;
}
if (tree[node_num].color!=DEFAULT_COLOR) {
tree[node_num*2].color=tree[node_num].color;
tree[node_num*2+1].color=tree[node_num].color;
tree[node_num].color=DEFAULT_COLOR;
}
int mid=(tree[node_num].left+tree[node_num].right) >> 1;
if (right<=mid)
insert(left,right,color,node_num*2);
else if (left>mid)
insert(left,right,color,node_num*2+1);
else {
insert(left,mid,color,node_num*2);
insert(mid+1,right,color,node_num*2+1);
}
}

int query(const int &left, const int &right, const int &node_num=1) {
int ctr=0;
if (tree[node_num].color!=DEFAULT_COLOR) {
if (visit[tree[node_num].color]==false) {
ctr++;
visit[tree[node_num].color]=true;
}
return ctr;
}
int mid = (tree[node_num].left+tree[node_num].right) >> 1;
if (right<=mid)
ctr+=query(left,right,node_num*2);
else if (left>mid)
ctr+=query(left,right,node_num*2+1);
else {
ctr+=query(left,mid,node_num*2);
ctr+=query(mid+1,right,node_num*2+1);
}
return ctr;
}
int main()
{
int t,o,i;
char operation;
int a,b,c,temp;

scanf("%d%d%d",&l,&t,&o);
init();

while (o--) {
getchar();
scanf("%c",&operation);
if (operation=='C') {
scanf("%d%d%d",&a,&b,&c);
if (a>b) {
temp=a;
a=b;
b=temp;
}
insert(a,b,c);
}
else {
scanf("%d%d",&a,&b);
if (a>b) {
temp=a;
a=b;
b=temp;
}
memset(visit,false,sizeof(visit));
printf("%d\n",query(a,b));
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: