Paint The Wall

Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3427    Accepted Submission(s): 955

Problem Description
As a amateur artist, Xenocide loves painting the wall. The wall can be considered as a line consisting of n nodes. Each node has its own color.

Xenocide spends all day in front of the wall. Sometimes, he paints some consecutive nodes so that these nodes have the same color. When he feels tired, he focuses on a particular color and counts the number of nodes that have this color within a given interval.

Now Xenocide is tired of counting, so he turns to you for help.

 
Input
The input consists of several test cases.
The first line of each test case contains two integer n, m(1<=n, m<=100000) indicating the length of the wall and the number of queries.
The following line contains N integers which describe the original color of every position.
Then m lines follow. Each line contains 4 non-negative integers a, l, r, z(1<=a<=2, 0<=l<=r<n ,0<=z<231).
a = 1 indicates that Xenocide paints nodes between l and r and the resulting color is z.
a = 2 indicates that Xenocide wants to know how many nodes between l and r have the color z.
 
Output
Print the corresponding answer for each queries.
 
Sample Input
5 5
1 2 3 4 0
2 1 3 3
1 1 3 1
2 1 3 3
2 0 3 1
2 3 4 1
 
Sample Output
1
0
4
1
 

题目链接:HDU 4391

一开始一看以为是线段树,虽然这题有很多人线段树+剪枝过的,如果用的是区间最大值最小值剪枝,粗略一想确实剪枝挺强,它用了一种二分的思想——区间大小跟最大值最小值之差肯定是存在单调不减的关系,但是对于特殊数据就没戏了,比如151515151515,然后查询1,n,3,这样一来3确实一直在1~5之间,但是会一直递归到根节点,最后却连发现一个3都没有,因此这题正解之一应该是分块算法,每一个块维护这个块所控制区间的颜色及每一个颜色的数量信息,此处有分块的区间更新操作,因此需要lazy的思想,跟线段树一样,整块打标记,标记传递时把信息传递到真实数组里去,学习一个分块下的延迟标记的用法,最后注意一下题目中的数组都是从0开始的

代码:

#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define LC(x) (x<<1)
#define RC(x) ((x<<1)+1)
#define MID(x,y) ((x+y)>>1)
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);
typedef pair<int, int> pii;
typedef long long LL;
const double PI = acos(-1.0);
const int N = 100010;
const int M = sqrt(N) + 10;
struct block
{
int color, l, r;
map<int, int>info;
inline int len()
{
return r - l + 1;
}
};
block B[M];
int arr[N], belong[N];
int unit, bcnt; void init(int n)
{
unit = sqrt(n);
bcnt = n / unit;
if (n % unit)
++bcnt;
for (int i = 1; i <= bcnt; ++i)
{
B[i].l = (i - 1) * unit + 1;
B[i].r = i * unit;
B[i].color = -1;
B[i].info.clear();
}
B[bcnt].r = n;
for (int i = 1; i <= n; ++i)
{
belong[i] = (i - 1) / unit + 1;
++B[belong[i]].info[arr[i]];
}
}
void pushdown(int x)
{
if (~B[x].color)
{
for (int i = B[x].l; i <= B[x].r; ++i)
arr[i] = B[x].color;
B[x].info.clear();
B[x].info[B[x].color] = B[x].len();
B[x].color = -1;
}
}
void update(int l, int r, int c)
{
int bl = belong[l], br = belong[r];
for (int i = bl + 1; i < br; ++i)
B[i].color = c;
if (bl != br)
{
pushdown(bl);
pushdown(br);
for (int i = l; i <= B[bl].r; ++i)
{
--B[bl].info[arr[i]];
++B[bl].info[c];
arr[i] = c;
}
for (int i = B[br].l; i <= r; ++i)
{
--B[br].info[arr[i]];
++B[br].info[c];
arr[i] = c;
}
}
else
{
pushdown(bl);
for (int i = l; i <= r; ++i)
{
--B[bl].info[arr[i]];
++B[bl].info[c];
arr[i] = c;
}
}
}
int query(int l, int r, int c)
{
int ret = 0;
int bl = belong[l], br = belong[r];
for (int i = bl + 1; i < br; ++i) //先处理中间
{
if (~B[i].color)
ret += B[i].len() * (B[i].color == c);
else
{
if (B[i].info.find(c) != B[i].info.end())
ret += B[i].info[c];
}
}
if (bl == br)
{
pushdown(bl);
for (int i = l; i <= r; ++i)
ret += (arr[i] == c);
}
else
{
pushdown(bl);
pushdown(br);
for (int i = l; i <= B[bl].r; ++i)
ret += (arr[i] == c);
for (int i = B[br].l; i <= r; ++i)
ret += (arr[i] == c);
}
return ret;
}
int main(void)
{
int n, m, a, l, r, z, i;
while (~scanf("%d%d", &n, &m))
{
for (i = 1; i <= n; ++i)
scanf("%d", &arr[i]);
init(n);
while (m--)
{
scanf("%d%d%d%d", &a, &l, &r, &z);
++l, ++r;
if (a == 1)
update(l, r, z);
else
printf("%d\n", query(l, r, z));
}
}
return 0;
}

HDU 4391 Paint The Wall(分块+延迟标记)的更多相关文章

  1. HDU 4391 - Paint The Wall - 分块哈希入门

    题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=4391 题意 : 给一段区间, 有两种操作 1 : 给 x 到 y 的区间染色为 z 2 : 查询 ...

  2. HDU 4391 Paint The Wall(分块的区间维护)

    题意:给出几个操作,把l-r赋值为z,询问l-r有几个z,其中z < INT_MAX 思路:因为z很大,所以很难直接用线段树去维护.这里可以使用分块来解决.我们可以让每个块用map去储存map[ ...

  3. HDU 4391 Paint The Wall 段树(水

    意甲冠军: 特定n多头排列.m操作 以下是各点的颜色 以下m一种操纵: 1 l r col 染色 2 l r col 问间隔col色点 == 通的操作+区间内最大最小颜色数的优化,感觉非常不科学... ...

  4. NBUT校赛 J Alex’s Foolish Function(分块+延迟标记)

    Problem J: Alex’s Foolish Function Time Limit: 8 Sec  Memory Limit: 128 MB Submit: 18  Solved: 2 Des ...

  5. hdu 1543 Paint the Wall

    http://acm.hdu.edu.cn/showproblem.php?pid=1543 #include <cstdio> #include <cstring> #inc ...

  6. 线段树 扫描线 L - Atlantis HDU - 1542 M - City Horizon POJ - 3277 N - Paint the Wall HDU - 1543

    学习博客推荐——线段树+扫描线(有关扫描线的理解) 我觉得要注意的几点 1 我的模板线段树的叶子节点存的都是 x[L]~x[L+1] 2 如果没有必要这个lazy 标志是可以不下传的 也就省了一个pu ...

  7. 杭电 HDU ACM 1698 Just a Hook(线段树 区间更新 延迟标记)

    欢迎"热爱编程"的高考少年--报考杭州电子科技大学计算机学院 Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memor ...

  8. HDU 5785 Interesting manacher + 延迟标记

    题意:给你一个串,若里面有两个相邻的没有交集的回文串的话,设为S[i...j] 和 S[j+1...k],对答案的贡献是i*k,就是左端点的值乘上右端点的值. 首先,如果s[x1....j].s[x2 ...

  9. HDU 3468:A Simple Problem with Integers(线段树+延迟标记)

    A Simple Problem with Integers Case Time Limit: 2000MS Description You have N integers, A1, A2, ... ...

随机推荐

  1. fold - 折叠输入行, 使其适合指定的宽度

    总览 (SYNOPSIS) ../src/fold [OPTION]... [FILE]... 描述 (DESCRIPTION) 折叠(wrap) 每个 文件 FILE 中 的 输入行 (缺省为 标准 ...

  2. python_19_编码解码

    msg="我爱北京天安门" #字符串转成Byte类型 print(msg.encode())#encode 编码 print(msg.encode(encoding="u ...

  3. NUMA的原理与局限

    为什么要有NUMA 在NUMA架构出现前,CPU欢快的朝着频率越来越高的方向发展.受到物理极限的挑战,又转为核数越来越多的方向发展.如果每个core的工作性质 都是share-nothing(类似于m ...

  4. Java算法面试题:编写一个程序,将e:\neck目录下的所有.java文件复制到e:\jpg目录下,并将原来文件的扩展名从.java改为.jpg

    package com.swift; import java.io.File; import java.io.FileFilter; import java.io.FileInputStream; i ...

  5. Dtree 添加 checkbox 复选框 可以默认选中

    一:目标 要实现用一个树形结构的展示数据,每个节点(除了根节点)前有一个checkbox,同时,点击父节点,则子节点全选或者全不选,当选中了全部子节点,父节点选中:如下图所示: 同时可以在创建的时候, ...

  6. Uva 组装电脑 12124 - Assemble

    主要运用二分法查找最优解 #include<iostream> #include<string> #include<vector> #include<map& ...

  7. SSH密钥验证

    基于密钥验证 1. 在客户端生成密钥对 可以先进入用户的.ssh 目录 cd ~/.ssh ssh-keygen -t rsa [-P '' ] [-f "~/.ssh/id_rsa&quo ...

  8. linux磁盘满了怎么办??删掉无用的大文件

    今天公司网站突然无法访问,因为之前遇到过是因为磁盘问题,所以使用 df 命令查看结果,结果果然是有100%的东西,那么怎么解决呢,我们想到得查找大文件,并删掉无用的大文件比如log 那么linux如何 ...

  9. Net core 轮子

    .net core 使用的人渐渐多了起来,轮子也渐渐多了起来,为了避免重复造轮子,以下列举了一些造好的轮子 1. IP 请求频率限制 git: https://github.com/stefanpro ...

  10. jupyter notebook(一)——anaconda安装后jupyter不能自动跳转网页

    1.问题描述 之前没有遇到过.这次重装系统,发现安装anaconda这个集成版python后,jupyter notebook打开后不能自动跳转打开的交互网页. 系统是windows7.anacond ...