Codeforces Round #439 (Div. 2) E. The Untended Antiquity(二维BIT)
2017-10-07 16:31
330 查看
题意:在 n×m 的二维图上,有三种操作:
1 r1 c1 r2 c2 表示沿着 (r1, c1, r2, c2) 所表示的矩形的外边框建围墙。(其中 (r1, c1) 为矩形左上角,(r2, c2) 表示矩形右下角)。
2 r1 c1 r2 c2 表示取消 (r1, c1, r2, c2) 所示矩形的围墙。(保证最初图不存在围墙,删除的围墙一定是之前通过操作 1 建立的)。
3 r1 c1 r2 c2 表示询问 (r1, c1) 到 (r2, c2) 是否可以不翻越围墙到达。对于每个操作 3,可以输出 Yes ,否则输出 No 。
(n, m <= 2500, q <= 1e5, 保证围墙没有相交)
思路:因为围墙之间不相交,所以我们可以把每个围墙内部都设置成一个值,询问的时候只要看两个点的值是否相同即可。那么怎么
将一个围墙内设为一个值呢,我们可以利用二维BIT,利用前缀和,进行区间更新,单点查询,跟一维的时候区间更新单点更新一
样。那么删除的时候怎么快速得到这个围墙原来设置的是什么值呢,我们可以用哈希,将四个坐标哈希成一个值,具体见代码。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2505;
const int seed = 2333;
ll tree[maxn][maxn], n, m, q;
int lowbit(int x)
{
return x&(-x);
}
void update(int x, int y, ll val)
{
for(int i = x; i <= n; i += lowbit(i))
for(int j = y; j <= m; j += lowbit(j))
tree[i][j] += val;
}
void update(int x1, int y1, int x2, int y2, ll val)
{
update(x1, y1, val);
update(x1, y2+1, -val);
update(x2+1, y1, -val);
update(x2+1, y2+1, val);
}
ll query(int x, int y)
{
ll res = 0;
for(int i = x; i; i -= lowbit(i))
for(int j = y; j; j -= lowbit(j))
res += tree[i][j];
return res;
}
int main(void)
{
while(~scanf("%I64d%I64d%I64d", &n, &m, &q))
{
memset(tree, 0, sizeof(tree));
int cmd, x1, y1, x2, y2;
while(q--)
{
scanf("%d%d%d%d%d", &cmd, &x1, &y1, &x2, &y2);
ll val = x1;
val = val*seed+y1;
val = val*seed+x2;
val = val*seed+y2;
if(cmd == 1)
update(x1, y1, x2, y2, val);
else if(cmd == 2)
update(x1, y1, x2, y2, -val);
else
{
ll tmp1 = query(x1, y1);
ll tmp2 = query(x2, y2);
puts(tmp1 == tmp2 ? "Yes" : "No");
}
}
}
return 0;
}
1 r1 c1 r2 c2 表示沿着 (r1, c1, r2, c2) 所表示的矩形的外边框建围墙。(其中 (r1, c1) 为矩形左上角,(r2, c2) 表示矩形右下角)。
2 r1 c1 r2 c2 表示取消 (r1, c1, r2, c2) 所示矩形的围墙。(保证最初图不存在围墙,删除的围墙一定是之前通过操作 1 建立的)。
3 r1 c1 r2 c2 表示询问 (r1, c1) 到 (r2, c2) 是否可以不翻越围墙到达。对于每个操作 3,可以输出 Yes ,否则输出 No 。
(n, m <= 2500, q <= 1e5, 保证围墙没有相交)
思路:因为围墙之间不相交,所以我们可以把每个围墙内部都设置成一个值,询问的时候只要看两个点的值是否相同即可。那么怎么
将一个围墙内设为一个值呢,我们可以利用二维BIT,利用前缀和,进行区间更新,单点查询,跟一维的时候区间更新单点更新一
样。那么删除的时候怎么快速得到这个围墙原来设置的是什么值呢,我们可以用哈希,将四个坐标哈希成一个值,具体见代码。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2505;
const int seed = 2333;
ll tree[maxn][maxn], n, m, q;
int lowbit(int x)
{
return x&(-x);
}
void update(int x, int y, ll val)
{
for(int i = x; i <= n; i += lowbit(i))
for(int j = y; j <= m; j += lowbit(j))
tree[i][j] += val;
}
void update(int x1, int y1, int x2, int y2, ll val)
{
update(x1, y1, val);
update(x1, y2+1, -val);
update(x2+1, y1, -val);
update(x2+1, y2+1, val);
}
ll query(int x, int y)
{
ll res = 0;
for(int i = x; i; i -= lowbit(i))
for(int j = y; j; j -= lowbit(j))
res += tree[i][j];
return res;
}
int main(void)
{
while(~scanf("%I64d%I64d%I64d", &n, &m, &q))
{
memset(tree, 0, sizeof(tree));
int cmd, x1, y1, x2, y2;
while(q--)
{
scanf("%d%d%d%d%d", &cmd, &x1, &y1, &x2, &y2);
ll val = x1;
val = val*seed+y1;
val = val*seed+x2;
val = val*seed+y2;
if(cmd == 1)
update(x1, y1, x2, y2, val);
else if(cmd == 2)
update(x1, y1, x2, y2, -val);
else
{
ll tmp1 = query(x1, y1);
ll tmp2 = query(x2, y2);
puts(tmp1 == tmp2 ? "Yes" : "No");
}
}
}
return 0;
}
相关文章推荐
- Codeforces Round #439 (Div. 2) E. The Untended Antiquity 二维树状数组 随机化
- E. The Untended Antiquity[二维BIT更新区间] 好题!
- Codeforces Round #439 (Div. 2) E. The Untended Antiquity (hash+数状数组)
- Codeforces Round #439 (Div. 2) E. The Untended Antiquity
- Codeforces Round #439 (Div. 2) E. The Untended Antiquity(Hash)
- 【CodeForces - 869E】 The Untended Antiquity 【二维树状数组 + 坐标hash】
- Codeforces 869 E. The Untended Antiquity 二维树状数组
- Codeforces Round #439 (Div. 2) E. The Untended Antiquity
- CF869 E. The Untended Antiquity
- Codeforces Round #439 E. The Untended Antiquity (树状数组+随机化)
- codeforces—— 869E —— The Untended Antiquity
- Codeforces Round #384(Div. 2)B. Chloe and the sequence【思维+lowbit】
- Wunder Fund Round 2016 (Div. 1 + Div. 2 combined) B. Guess the Permutation 水题
- Codeforces Round #437 (Div. 2) B. Save the problem!
- Codeforces Round #195 (Div. 2) A. Vasily the Bear and Triangle
- Codeforces Round #437 (Div. 2, based on MemSQL Start[c]UP 3.0 - Round 2) B.Save the Problem!
- Codeforces Round #375 (Div. 2) Polycarp at the Radio 优先队列模拟题 + 贪心
- 【Codeforces Round #426 (Div. 2) A】The Useless Toy
- Codeforces Round #342 (Div. 2)-B. War of the Corporations
- Codeforces Round #439 (Div. 2) C. The Intriguing Obsession 组合数学