您的位置:首页 > 大数据 > 人工智能

【HDU】4391 Paint The Wall

2012-08-27 17:08 393 查看
题意:

给出n个节点,编号0~n-1。

1 把[x,y]颜色覆盖为z。

2 询问[x,y]颜色为z的有多少个。

题解:http://page.renren.com/601081183/note/867254911

懒得hash,直接用map搞。

把数列分成sqrt(n)段,如果每段在完整的查询区间内,可以O(1)得到答案,否则对该段暴力答案。

#include<cstdio>
#include<cmath>
#include<map>
#define EPS 1e-8
#define MAXM 331
#define MAXN 100010
using namespace std;
int col[MAXN], same[MAXM];
map<int, int> mymap[MAXM];
int n, block;
void Hash(int t) {
int nd, i;
mymap[t].clear();
nd = min(t * block + block, n);
for (i = t * block; i < nd; i++)
mymap[t][col[i]]++;
}
void PushDown(int t) {
int i, nd;
nd = min(t * block + block, n);
if (same[t] >= 0) {
for (i = t * block; i < nd; i++)
col[i] = same[t];
same[t] = -1;
}
}
void Update(int x, int y, int z) {
int t, i, nd;
t = x / block;
if (t == y / block) {
if (same[t] != z) {
PushDown(t);
for (i = x; i <= y; i++)
col[i] = z;
Hash(t);
}
} else {
if (x % block) {
if (same[t] != z) {
PushDown(t);
for (nd = min(t * block + block, n); x < nd; x++)
col[x] = z;
Hash(t);
} else
x = min(t * block + block, n);
}
if (y % block != block - 1) {
t = y / block;
if (same[t] != z) {
PushDown(t);
for (nd = t * block; y >= nd; y--)
col[y] = z;
Hash(t);
} else
y = t * block - 1;
}
for (t = x / block; x <= y; x += block, t++)
same[t] = z;
}
}
int Query(int x, int y, int z) {
int t, i, nd, ans;
t = x / block;
ans = 0;
if (t == y / block) {
if (same[t] == z)
ans += y - x + 1;
else if (same[t] == -1) {
for (i = x; i <= y; i++) {
if (col[i] == z)
ans++;
}
}
} else {
if (x % block) {
if (same[t] == z) {
ans += block - x % block;
x = min(t * block + block, n);
} else if (same[t] == -1) {
for (nd = min(t * block + block, n); x < nd; x++) {
if (col[x] == z)
ans++;
}
} else
x = min(t * block + block, n);
}
if (y % block != block - 1) {
t = y / block;
if (same[t] == z) {
ans += y % block + 1;
y = t * block - 1;
} else if (same[t] == -1) {
for (nd = t * block; y >= nd; y--) {
if (col[y] == z)
ans++;
}
} else
y = t * block - 1;
}
for (t = x / block; x <= y; x += block, t++) {
if (same[t] >= 0) {
if (same[t] == z)
ans += block;
} else {
if (mymap[t].count(z))
ans += mymap[t][z];
}
}
}
return ans;
}
int main() {
int q, i, j, cmd, x, y, z;
while (~scanf("%d%d", &n, &q)) {
block = (int) (ceil(sqrt((double) n)) + EPS);
for (i = 0; i < n; i++)
scanf("%d", &col[i]);
for (i = j = 0; i < n; i += block, j++) {
same[j] = -1;
Hash(j);
}
while (q--) {
scanf("%d%d%d%d", &cmd, &x, &y, &z);
if (cmd == 1)
Update(x, y, z);
else
printf("%d\n", Query(x, y, z));
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: