您的位置:首页 > 其它

ZOJ - 1610 Count the Colors(区间更新)

2017-06-06 22:21 288 查看
题意:给(a,b)线段染色为c,这种操作有n次!所有的点不超过8000。输出index的颜色能看见几次。

思路:区间更新。 所以我在结构体里直接上了map来存颜色,感觉有点蠢。。。但是好歹写出来了不是。。(只能这么安慰自己了)

因为有区间更新,所以也涉及到下推tag。这里要维护的要想到的一点就是,左儿子的尾和右儿子的头如果同色,这个算出现一次。其余的都很好想了,尤其是我这种弃疗写法。。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;

#define itr map<int,int>::iterator

const int maxn = 8010;
const int inf = 0x3f3f3f3f;
int n;
int data[maxn][3];

struct node
{
int l,r,tag,b,e;
map<int,int> col;
}tr[maxn << 2];

void reset(int id,int l,int r)
{
tr[id].l = l; tr[id].r = r; tr[id].tag = 0;
tr[id].col.clear(); tr[id].e = tr[id].b = 0;
}
void build(int l,int r,int id)
{
reset(id,l,r);
if(l == r) return;
int mid = l+r>>1;

build(l,mid,id<<1);
build(mid+1,r,id<<1|1);
}
void usetag(int id,int tag)
{
tr[id].col.clear();
tr[id].col.insert(pair<int ,int>(tag,1));
tr[id].e = tr[id].b = tag;
tr[id].tag = tag;
}

int push(int id,int tag)
{
if(tag)
{
usetag(id<<1,tag);
usetag(id<<1|1,tag);
tr[id].tag = 0;
}
return 0;
}
void useson(int id)
{
tr[id].col.clear();
for(itr it = tr[id<<1].col.begin(); it != tr[id<<1].col.end(); it++)
{
int a = it->first, b = it->second;
tr[id].col[a] = b;
}
for(itr it = tr[id<<1|1].col.begin(); it != tr[id<<1|1].col.end(); it++)
{
int a = it->first, b = it->second;
tr[id].col[a] += b;
}
tr[id].b = tr[id<<1].b, tr[id].e = tr[id<<1|1].e;
if(tr[id<<1].e == tr[id<<1|1].b)    tr[id].col[tr[id<<1].e] --;

}
void add(int al,int ar,int c,int id)
{
int l = tr[id].l, r = tr[id].r;
if(r <  al || l >  ar)    return;
if(l >= al && r <= ar)
{
tr[id].tag = c;
tr[id].col.clear();
tr[id].col.insert(pair<int,int>(c,1));
tr[id].b = tr[id].e = c;
return;
}
push(id,tr[id].tag);

add(al,ar,c,id<<1);
add(al,ar,c,id<<1|1);

useson(id);
}
int main()
{
while(~scanf("%d",&n))
{
int r,a,b,c;
r = 0;
for(int i = 0; i < n; i++)
{
scanf("%d%d%d",&a,&b,&c);
a++;b;c++;
data[i][0] = a,data[i][1] = b, data[i][2] = c;
r = max(r,b);
}
build(1,r,1);
for(int i = 0; i < n ; i++)
{
a = data[i][0], b = data[i][1], c = data[i][2];
add(a,b,c,1);
}
itr it = tr[1].col.begin();
for(; it != tr[1].col.end(); it++)
printf("%d %d\n",it->first-1,it->second);
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: