线段数涂色
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 100005
struct node
{
int left,right;
int color;
}tree[maxn*4];
bool visit[40];
int sum;
void build(int left,int right,int id)
{
tree[id].left =left,tree[id].right =right;
if(left==right)
{
tree[id].color =1;
return;
}
tree[id].color =1;
int mid=(left+right)>>1;
build(left,mid,id*2);
build(mid+1,right,id*2+1);
}
void insert(int st,int ed,int color,int id)
{
if(tree[id].left ==st&&tree[id].right==ed)
{
tree[id].color =color;
return;
}
if(tree[id].color)
{
tree[id*2].color =tree[id].color;
tree[id*2+1].color =tree[id].color ;
tree[id].color =0;
}
//tree[id].color =0;
int mid=(tree[id].left +tree[id].right )>>1;
if(mid>=ed)
insert(st,ed,color,id*2);
else if(mid<st)
insert(st,ed,color,id*2+1);
else
{
insert(st,mid,color,id*2);
insert(mid+1,ed,color,id*2+1);
}
}
void query(int st,int ed,int id)
{
if(tree[id].color)
{
if(!visit[tree[id].color ])
{
sum++;
visit[tree[id].color]=true;
}
return;
}
int mid=(tree[id].left +tree[id].right )>>1;
if(mid>=ed)
query(st,ed,id*2);
else if(mid<st)
query(st,ed,id*2+1);
else
{
int mid=(tree[id].left +tree[id].right )>>1;
query(st,mid,id*2);
query(mid+1,ed,id*2+1);
}
}
int main()
{
char ch[5];
int L,T,O,a,b,c;
scanf("%d%d%d",&L,&T,&O);
build(1,L,1);
while(O--)
{
scanf("%s",&ch);
scanf("%d%d",&a,&b);
if(a>b)
swap(a,b);
if(ch[0]=='C')
{
scanf("%d",&c);
insert(a,b,c,1);
}
else if(ch[0]=='P')
{
sum=0;
memset(visit,0,sizeof(visit));
query(a,b,1);
printf("%d\n",sum);
}
}
return 0;
}
分享到:
相关推荐
POJ题解 个人写法 线段树每个人都不一样
NULL 博文链接:https://128kj.iteye.com/blog/1740501
NULL 博文链接:https://128kj.iteye.com/blog/1739064
POJ2528-Mayor's posters 【区间映射压缩(离散化)+线段树】 解题报告+AC代码 http://hi.csdn.net/!s/83XZJU ========> 我的所有POJ解题报告链接: http://blog.csdn.net/lyy289065406/article/details/6642573
poj2823,使用线段树进行查询区域间最大最小值,线段树初步
这是一道很不错的题目,即可以用线段树做也可以用树状数组,可谓经典。不过当然了线段树是比较难搞,而树状数组是极其简洁的,构造很简单,下面就分别来介绍一下两种方法...
问题:求平面上多个矩形的总面积。 算法:线段树(经典的线段树题目)
NULL 博文链接:https://128kj.iteye.com/blog/1739733
poj 2777 线段覆盖 poj 2528 需要离散化,建树不同,需要处理不同->注意这组数据 3 1 10 1 3 6 10 the ans is 3. hdu 1754 求区间最大值 hdu 1166 求区间和 hdu 1698 成段更新 poj 3468 成段更新 ural 1019 覆盖加...
线段树、树状数组算法入门 加 poj解题报告 pdf文档
此为本人在poj做过的经典题目的代码与一些经典数据结构算法的模板程序,如线段树,拓扑排序等
poj 2763 程序 线段树 LCA 2000MS AC
NULL 博文链接:https://128kj.iteye.com/blog/1733777
先利用prim算法求出最小生成树,然后通过往MST里加边来判断新生成的最小生成树是否具有最小的权值,POJ上The Unique MST(1679)题是要求判断最小生成树是否唯一,此题其实根本不用这样做,但是为了练习球次小生成树...
POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类
NULL 博文链接:https://128kj.iteye.com/blog/1746750
poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题...
大家都用树状数组,但是有人只会用线段树呢? 而且我可以轻易改出一道不能用树状数组的题 在线段树一次次TLE后,有一个ID发帖抱怨 “下次写一个汇编版非递归线段树,再超时?” 可是大家都知道,超时的代码已经2k了...
POJ第1861题源码 POJ第1861题源码 POJ第1861题源码
史上最全poj题目分类及原题 包括:基本算法:贪心、递归、递推、枚举;基本数据结构,链表、栈;动态规划;搜索;高级数据结构:二叉搜索树、线段树、树状数组;数学:数论