ZOJ-1610-Count the Colors
生活随笔
收集整理的這篇文章主要介紹了
ZOJ-1610-Count the Colors
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
鏈接:https://vjudge.net/problem/ZOJ-1610#author=0
題意:
給n個區間,是區間,對區間進行染色。
區間的范圍是1-8000。
求每種最后存在的顏色能看到的有幾段。
思路:
因為是區間,所以范圍變成(l+1, r)。
原數組直接延遲操作。
最后將查詢的位置對應到color數組上,統計答案。
代碼:
#include <iostream> #include <memory.h> #include <vector> #include <map> #include <algorithm> #include <cstdio>using namespace std;typedef long long LL;const int MAXN = 8000 + 10; int segment[MAXN * 4]; int color[MAXN]; int res[MAXN];void Push_Down(int root) {if (segment[root] != -1){segment[root << 1] = segment[root];segment[root << 1 | 1] = segment[root];segment[root] = -1;} }void Update(int root, int l, int r, int ql, int qr, int c) {if (ql > r || l > qr)return;if (ql <= l && r <= qr){segment[root] = c;return;}if (segment[root] == c)return;Push_Down(root);int mid = (l + r) / 2;Update(root << 1, l, mid, ql, qr, c);Update(root << 1 | 1, mid + 1, r, ql, qr, c); }void Query(int root, int l, int r) {if (segment[root] != -1){for (int i = l;i <= r;i++)color[i] = segment[root];return ;}if (l < r){int mid = (l + r) / 2;Query(root << 1, l, mid);Query(root << 1 | 1, mid + 1, r);} }void Count() {int i = 1;while (i <= 8000){if (color[i++] == -1)continue;while (i <= 8000 && color[i] == color[i - 1])++i;res[color[i - 1]]++;} }int main() {int n;while (~scanf("%d", &n)){memset(segment, -1, sizeof(segment));memset(color, -1, sizeof(color));memset(res, 0, sizeof(res));int l, r, c;for (int i = 1;i <= n;i++){scanf("%d%d%d", &l, &r, &c);Update(1, 1, 8000, l + 1, r, c);}Query(1, 1, 8000);Count();for (int i = 0;i <= 8000;i++){if (res[i] != 0)printf("%d %d\n", i, res[i]);}printf("\n");}return 0; }
轉載于:https://www.cnblogs.com/YDDDD/p/10447677.html
總結
以上是生活随笔為你收集整理的ZOJ-1610-Count the Colors的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python内置函数中的zip,max,
- 下一篇: 什么是区块链钱包?区块链钱包如何运作?