hdu 5465 (树状数组 + 博弈)
2015-09-28 18:25
232 查看
题意:基于矩阵的NIM游戏,求异或和。
思路:在x1,y1 到 x2, y2的异或和 = A[ x2 ][ y2 ] ^ A[x1-1][ y2 ] ^ A[ x2 ][y1 - 1] ^ A[ x1-1 ][ y1 - 1 ]
先普通来了两次,结果都超时。 上个二维树状数组AC
思路:在x1,y1 到 x2, y2的异或和 = A[ x2 ][ y2 ] ^ A[x1-1][ y2 ] ^ A[ x2 ][y1 - 1] ^ A[ x1-1 ][ y1 - 1 ]
先普通来了两次,结果都超时。 上个二维树状数组AC
#include <cstdio> #include <cstring> #define MAXN 100010 using namespace std; int a[505][505]; int sum[505][505]; int n,m,qq; int lowbit(int x) { return x&(-x); } void inser(int x,int y,int k) { for(int i = x; i <= n; i+=lowbit(i)) for(int j = y; j <= m; j+=lowbit(j)) { sum[i][j] ^= k; } } int query(int x,int y) { int ans = 0; for(int i = x; i >= 1; i-=lowbit(i)) for(int j = y; j >= 1; j-=lowbit(j)) { ans ^= sum[i][j]; } return ans; } int main() { int T; scanf("%d",&T); while(T--) { int q; scanf("%d%d%d",&n,&m,&q); memset(sum,0,sizeof(sum)); for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) { scanf("%d",&a[i][j]); inser(i,j,a[i][j]); } for(int i = 1; i <= q; i++) { int qq,x1,y1,x2,y2,tt; scanf("%d",&qq); if(qq == 1) { scanf("%d%d%d%d",&x1,&y1,&x2,&y2); int ans = 0; ans ^= query(x2, y2); if(y1 > 1) ans ^= query(x2, y1 - 1); if(x1 > 1) ans ^= query(x1 - 1, y2); if(x1 > 1 && y1 > 1) ans ^= query(x1 - 1, y1 - 1); if(ans) printf("Yes\n"); else printf("No\n"); } else { scanf("%d%d%d",&x1,&y1,&tt); inser(x1,y1,a[x1][y1]^tt); a[x1][y1] = tt; } } } return 0; }
相关文章推荐
- ANR log 日志的抓取
- 10个顶级的CSS UI开源框架
- hdu 5465 (树状数组 + 博弈)
- 个人博客作业-Week1
- 阿里2015暑期实习生业务型产品笔试题(附部分参考答案)
- 让IE6 IE7 IE8 IE9 IE10 IE11支持Bootstrap的解决方法
- uva 489
- Java基础知识强化之IO流笔记05:try...catch...finally包含的代码是运行期的
- 价格输入框的校验(数字,两个小数)
- Git服务器搭建全过程
- Chrome浏览器扩展开发系列之十二:Content Scripts
- 【Leetcode】Linked List Cycle II
- 汉诺塔系列问题: 汉诺塔II、汉诺塔III、汉诺塔IV、汉诺塔V、汉诺塔VI、汉诺塔VII
- 两个栈实现队列的功能
- angular jsonp调用及后台java返回
- 通过反射获取,修改对象变量
- 我不知道你是在一个多线程out该--【ITOO】
- Java线程编程中的主线程讲解
- EventBus使用详解
- cocos2d-js 安卓自定义本地通知功能