Codeforces Round #439 (Div. 2)E详解
来源:互联网 发布:fastjson解析json数据 编辑:程序博客网 时间:2024/06/05 02:18
题意:给出一个n行m列的矩形,现在有q个询问,输入t,r1,c1,r2,c2.
当t=1时,在r1行c1列格子上左边界到r2行c2列的下右边界划一个矩形边界。
当t=2时,将r1行c1列格子上左边界到r2行c2列的下右边界的矩形矩形边界删掉。
当t=3时,问能不能从r1行c1列这个格子到r2行c2列。能输出YES,否则输出NO.
思路:一开始想到的利用前缀和,但维护前缀和不知道怎么维护,从来没写过2维树状数组。。
如果会2维树状数组,那么就简单了,可以把一个范围的点都加上某个值然后判断查询的两个点的值是不是一样的就行了。这里就相当于区间修改,单点查询了。
思路:
#include<bits/stdc++.h>using namespace std;int hashvalue=233;#define lowbit(x) (x)&(-x)typedef long long ll;ll sum[2505][2505];int n,m,q;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)) sum[i][j]+=val;}void update(int x1,int y1,int x2,int y2,ll val){ update(x1,y1,val); update(x2+1,y1,-val); update(x1,y2+1,-val); update(x2+1,y2+1,val);}ll query(int x1,int y1){ ll ans=0; for(int i=x1;i>0;i-=lowbit(i)) for(int j=y1;j>0;j-=lowbit(j)) ans+=sum[i][j]; return ans;}int main(){ cin>>n>>m>>q; int t,r1,c1,r2,c2; for(int i=1;i<=q;i++) { scanf("%d %d %d %d %d",&t,&r1,&c1,&r2,&c2); if(t==1) { ll value=r1; value=(value+c1)*hashvalue; value=(value+r2)*hashvalue; value=(value+c2)*hashvalue; update(r1,c1,r2,c2,value); } else if(t==2) { ll value=r1; value=(value+c1)*hashvalue; value=(value+r2)*hashvalue; value=(value+c2)*hashvalue; update(r1,c1,r2,c2,-value); } else { ll res1=query(r1,c1); ll res2=query(r2,c2); if(res1==res2)puts("Yes"); else puts("No"); } } return 0;}
思路2:这个思路查询的时候比较暴力,但修改的时候很巧妙。所以在这里提一下。。
在添加边界的时候其实可以给左边界的行j从r1行到r2的值state[j][c1]都变成i,右边界的行j从r1行到r2的值state[j][c2]都变成-1.那么查询的时候可以维护一个穿过几次右边界的系数t,从列i从c1一直到0遍历。当碰到右边界t++,碰到左边界时t–,那么当t=0时该点state[r1][i]有值时,查询的这个点就在这个值所构成的矩阵中,同理(r2,c2)也这样计算在哪个矩阵里。如果相等就是YES。
#include<bits/stdc++.h>using namespace std;int state[2505][2505];int main(){ int n,m,q; cin>>n>>m>>q; int t,r1,c1,r2,c2; for(int i=1;i<=q;i++) { scanf("%d %d %d %d %d",&t,&r1,&c1,&r2,&c2); if(t==1) { for(int j=r1;j<=r2;j++) { state[j][c1]=i; state[j][c2+1]=-1; } } else if(t==2) { for(int j=r1;j<=r2;j++) { state[j][c1]=state[j][c2+1]=0; } } else { int res1=0,res2=0; int t=0; for(int i=c1;i>=1;i--) { if(state[r1][i]>0) { if(t==0) { res1=state[r1][i]; break; } else t--; } else if(state[r1][i]<0) t++; } t=0; for(int i=c2;i>=1;i--) { if(state[r2][i]>0) { if(t==0) { res2=state[r2][i]; break; } else t--; } else if(state[r2][i]<0) t++; } if(res1==res2)printf("Yes\n"); else printf("No\n"); } }}
阅读全文
0 0
- Codeforces Round #439 (Div. 2)E详解
- Codeforces Round #432 (Div. 2)C,D,E题目详解
- Codeforces Round #433(Div.2) C,D,E题目详解
- Codeforces Round #430(Div.2) C,D,E题目详解
- Codeforces Round #436 (Div. 2)E,F详解
- Codeforces Round #439 (Div. 2) E. The Untended Antiquity
- Codeforces Round #439 (Div. 2) E. The Untended Antiquity
- Codeforces 405E Codeforces Round #238 (Div. 2)E
- Codeforces Round #103 (Div. 2) E题
- Codeforces Round #147 (Div. 2) E
- Codeforces Round #184 (Div. 2) D、E
- Codeforces Round #197 (Div. 2) (C~E)
- Codeforces Round #102 (Div. 2) //缺E
- Codeforces Round #104 (Div. 2) //缺E
- Codeforces Round #105 (Div. 2) //缺E
- Codeforces Round #103 (Div. 2) //缺E
- Codeforces Round #106 (Div. 2) //缺E
- Codeforces Round #223 (Div. 2) E
- POI CSV方式处理大数据excel文件
- 回文最少分割数
- 请问JSP是用JAVA编写的吗?
- LeetCode 319 Bulb Switcher
- ECLIPSE下JAVA 项目配置动态WEB项目失败的解决
- Codeforces Round #439 (Div. 2)E详解
- 《SSO系列一》初识SSO
- 学习阿里巴巴开发手册-11
- Android 隐藏APP图标
- 2 Java IO:InputStream 和 OutputStream
- 乐视IPO的证监会内鬼遭调查,令完成幕后操纵丑闻曝光
- 总结1
- 改善java程序的151个建议
- mysql windows 系统服务