ZOJ1610 Count the Colors 线段树

Posted iat14

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZOJ1610 Count the Colors 线段树相关的知识,希望对你有一定的参考价值。

正常区间修改,然后最后一起暴力查一遍就行了。

区间修改有0,需要用-1做lzy标记....

 1 #include <cstdio>
 2 #include <map>
 3 #include <algorithm>
 4 using namespace std;
 5 int col[40000],lzy[40000],vec[10000],cnt[10000];
 6 int n;
 7 void build(int k,int l,int r)
 8 {
 9     col[k] = -1;
10     lzy[k] = -1;
11     if (l == r)
12     {
13         return;
14     }
15     int mid = l + r >> 1;
16     build(k << 1,l,mid);
17     build(k << 1 | 1,mid + 1,r);
18 }
19 void down(int k,int l,int r)
20 {
21     if (l == r)
22         return;
23     lzy[k << 1] = lzy[k];
24     lzy[k << 1 | 1] = lzy[k];
25     col[k << 1] = lzy[k];
26     col[k << 1 | 1] = lzy[k];
27     lzy[k] = -1;
28 }
29 void change(int k,int l,int r,int x,int y,int c)
30 {
31     if (x <= l && r <= y)
32     {
33         lzy[k] = c;
34         col[k] = c;
35         return;
36     }
37     if (lzy[k] != -1) 
38         down(k,l,r);
39     int mid = l + r >> 1;
40     if (x <= mid) change(k << 1,l,mid,x,y,c);
41     if (y >= mid + 1) change(k << 1 | 1,mid + 1,r,x,y,c);
42 }
43 int query(int k,int l,int r,int x)
44 {
45     if (l == r) 
46         return col[k];
47     if (lzy[k] != -1) 
48         down(k,l,r);
49     int mid = l + r >> 1;
50     if (x <= mid) 
51         return query(k << 1,l,mid,x);
52     if (x >= mid + 1) 
53         return query(k << 1 | 1,mid + 1,r,x);
54 }
55 int main()
56 {
57     while (scanf("%d",&n) > 0)
58     {
59         build(1,1,8001);
60         for (int i = 0;i <= 8000;i++)
61             cnt[i] = 0;
62         int tx,ty,tc;
63         for (int i = 1;i <= n;i++)
64         {
65             scanf("%d%d%d",&tx,&ty,&tc);
66             tx++;
67             change(1,1,8001,tx,ty,tc);
68         }
69         for (int i = 0;i <= 8000;i++)
70             vec[i] = query(1,1,8001,i + 1);
71         if (vec[0] != -1)
72             cnt[vec[0]]++;
73         for (int i = 1;i <= 8000;i++)
74             if (vec[i] != -1 && vec[i] != vec[i - 1])
75                 cnt[vec[i]]++;
76         for (int i = 0;i <= 8000;i++)
77             if (cnt[i] != 0)
78                 printf("%d %d
",i,cnt[i]);
79         printf("
");
80     }
81     return 0;
82 }

以上是关于ZOJ1610 Count the Colors 线段树的主要内容,如果未能解决你的问题,请参考以下文章

ZOJ - 1610 Count the Colors 线段树区间修改

zoj 1610 Count the Colors 区间覆盖 求染色段

Count the Colors ZOJ - 1610

kuangbin专题七 ZOJ1610 Count the Colors (灵活线段树)

ZOJ1610 Count the Colors 线段树

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