博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU-水饺基情 二维树状数组
阅读量:4310 次
发布时间:2019-06-06

本文共 2019 字,大约阅读时间需要 6 分钟。

该题就是简单的二维树状数组,保留一份棋盘的最新状态即可,树状数组里面就只保留在原有基础上增加或者减少的某一种饺子的数量。

代码如下:

#include 
#include
#include
using namespace std;char op[5];char G[1050][1050];int cc[1050][1050];// 数组中存储韭菜饺的数量,白菜饺的数量通过总数量减去韭菜饺来求void init(){ int k = 0; // 定义韭菜为1,白菜为0 for (int i = 1; i <= 1024; ++i) { for (int j = 1; j <= 1025; ++j) { // 由于一行的结束和另一行的开始种类相同,所以多加了一列来翻转k G[i][j] = (k ^= 1); } }}int lowbit(int x){ return x & -x;}void modify(int x, int y, int val){ for (int i = x; i <= 1024; i += lowbit(i)) { for (int j = y; j <= 1024; j += lowbit(j)) { cc[i][j] += val; } }}int sum(int x, int y){ int tot = 0; for (int i = x; i > 0; i -= lowbit(i)) { for (int j = y; j > 0; j -= lowbit(j)) { tot += cc[i][j]; } } return tot;}int main(){ int T, a, b, c, d, k; int A, B, C, S; while (scanf("%d", &T) == 1) { init(); memset(cc, 0, sizeof (cc)); while (T--) { scanf("%s", op); if (op[0] == 'R') { scanf("%d %d %d %d", &a, &b, &c, &d); A = sum(c, d) - sum(c, b-1) - sum(a-1, d) + sum(a-1, b-1); if ((a + b) & 1) { // 白菜多数 S = (c-a+1)*(d-b+1) / 2; } else { S = ((c-a+1)*(d-b+1) + 1)/ 2; } B = S + A; C = (c-a+1)*(d-b+1) - B; printf("%d %d\n", B, C); } else { // 'A' 为韭菜,‘B’ 为白菜 scanf("%d %d", &a, &b); k = op[0] == 'A'; // 1为韭菜,0为白菜 if (k != G[a][b]) { G[a][b] = k; if (k) { modify(a, b, 1); } else { modify(a, b, -1); } } } } } return 0;}

转载于:https://www.cnblogs.com/Lyush/archive/2012/08/01/2617694.html

你可能感兴趣的文章
How it works(1) winston3源码阅读(A)
查看>>
How it works(2) autocannon源码阅读(A)
查看>>
How it works(3) Tilestrata源码阅读(A)
查看>>
How it works(12) Tileserver-GL源码阅读(A) 服务的初始化
查看>>
uni-app 全局变量的几种实现方式
查看>>
echarts 为例讲解 uni-app 如何引用 npm 第三方库
查看>>
uni-app跨页面、跨组件通讯
查看>>
springmvc-helloworld(idea)
查看>>
JDK下载(百度网盘)
查看>>
idea用得溜,代码才能码得快
查看>>
一篇掌握python魔法方法详解
查看>>
数据结构和算法5-非线性-树
查看>>
数据结构和算法6-非线性-图
查看>>
数据结构和算法7-搜索
查看>>
数据结构和算法8-排序
查看>>
windows缺少dll解决办法
查看>>
JPA多条件动态查询
查看>>
JPA自定义sql
查看>>
BigDecimal正确使用了吗?
查看>>
joplin笔记
查看>>