【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)得到答案,否则对该段暴力答案。
给出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; }
相关文章推荐
- HDU 4391 Paint The Wall
- Hdu 4391 Paint The Wall
- hdu 4391 Paint The Wall 线段树
- HDU 4391 Paint The Wall(分块HASH||线段树)
- HDU 4391 Paint The Wall 段树(水
- HDU 4391 Paint the Wall(块状链表 | 分段哈希)
- HDU 4391 Paint The Wall [分块哈希]
- hdu 4391 Paint The Wall
- HDU 4391 Paint The Wall 线段树(水
- hdu 4391 Paint The Wall(根N分段哈希)
- HDU 4391 Paint The Wall
- hdu 1543 Paint the Wall
- hdu 1543 Paint the Wall
- hdu1543 Paint the Wall
- HDU 1543 Paint the Wall(离散化+暴力)
- hdu Paint the Wall 1543
- hdu 1543 Paint the Wall
- hdu 1543 Paint the Wall(线段树)
- hdu-1543 Paint the Wall
- HDU 4931 Paint The Wall