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. 【转】iOS 文件下载及断点续传

    ios的下载我们可以使用的方法有:NSData.NSURLConnection.NSURLSession还有第三方框架AFNetworking和ASI 利用NSData方法和NSURLConnecti ...

  2. js 实现纯前端将数据导出excel两种方式,亲测有效

    由于项目需要,需要在不调用后台接口的情况下,将json数据导出到excel表格,兼容chrome没问题,其他还没有测试过 通过将json遍历进行字符串拼接,将字符串输出到csv文件,输出的文件不会再是 ...

  3. python读取excel中的数据

    import numpy as np import matplotlib.pyplot as plt import pandas as pd #df = pd.read_excel('/Users/N ...

  4. SQLServer事务的原理

    1.事务的概念 是数据库管理系统执行过程中的一个逻辑单元,由一个有限的数据库操作序列组成: 由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操 ...

  5. XGBoost算法原理小结

    在两年半之前作过梯度提升树(GBDT)原理小结,但是对GBDT的算法库XGBoost没有单独拿出来分析.虽然XGBoost是GBDT的一种高效实现,但是里面也加入了很多独有的思路和方法,值得单独讲一讲 ...

  6. java算法面试题:递归算法题1

    递归算法题1 一个整数,大于0,不用循环和本地变量,按照n,2n,4n,8n的顺序递增,当值大于5000时,把值按照指定顺序输出来.例:n=1237则输出为:1237,2474,4948,9896,9 ...

  7. 【转载】SQLServer中char、varchar、nchar、nvarchar的区别:

    (1)       定义: char:    固定长度,存储ANSI字符,不足的补英文半角空格. nchar:   固定长度,存储Unicode字符,不足的补英文半角空格 varchar:  可变长度 ...

  8. 【C++学习笔记】强大的算法——spfa

    spfa的定义 PFA算法的全称是:Shortest Path Faster Algorithm,用于求单源最短路,由西南交通大学段凡丁于1994年发表.当给定的图存在负边时,Dijkstra算法就无 ...

  9. 5.7 并行复制配置 基于GTID 搭建中从 基于GTID的备份与恢复,同步中断处理

    5.7 并行复制配置 基于GTID 搭建中从 基于GTID的备份与恢复,同步中断处理 这个文章包含三个部分 1:gtid的多线程复制2:同步中断处理3:GTID的备份与恢复 下面文字相关的东西 大部分 ...

  10. 对比传统方式访问数据库和SpringData访问数据库

    我们在写代码的时候应该一边写一边测试,这样的话可以尽快的找到错误,在代码写多了之后去找错误的话不容易给错误定位 传统方式访问数据库 1:创建一个Maven web项目 2:修改pom.xml为以下内容 ...