题目链接

题目

题目描述

情人节到了,小芳和小明手牵手,打算过一个完美的情人节,但是小刚偏偏也来了,当了一个明晃晃的电灯泡,小明很尴尬,就和小刚说,我交给你个任务,你完成了我俩就带你玩,否则你就回家吧。小刚很有当单身狗的觉悟,他坚决不想让小明过好情人节,同为单身狗的你能帮帮他吗?现在有一个n×n(1 <= n <= 1000)的格子,每一个格子都有一个电灯泡,可能是亮的,也可能是灭的(1代表亮, 0代表灭),现在有两种操作,一种是给你一个坐标,对于那个坐标上的灯泡,如果他是亮的,那么熄灭他,反之如果他是灭的,那么打开它。第二种操作是给你两个坐标,第一个坐标代表一个子矩阵的左上角,另一个坐标是右下角,请你求出当前子矩阵中有多少个灯泡是亮着的。燥起来吧!!!单身狗们!!!!

输入描述

第一行两个整数,n(1 <= n <= 1000)和m(1 <= m <= 100000),分别代表正方形格子的边长和询问次数。

接下来n行,每一行有n个bool形数字(0或1),代表灯泡的状态。

接下来m行,每一行第一个数字f(1或2)代表操作的类型,如果f是1,那么接下来输入一个坐标(x, y)(1 <= x, y <= n),对于当前位置的灯泡状态进行改变,如果是2,那么接下来输入两个坐标(x1, y1)(1 <= x1, y1 <= n), (x2, y2)(1 <= x2, y2 <= n),确定子矩阵的位置,输出子矩阵中亮着的灯泡数量并换行。

输出描述

对于每一个2操作,输出子矩阵中亮着的灯泡数量并换行。

示例1

输入

6 4
0 0 1 0 1 0
1 0 1 1 0 1
1 0 0 0 0 0
1 1 0 0 1 0
0 0 0 0 1 1
0 0 0 0 1 0
2 2 2 4 5
1 1 1
2 1 1 6 6
1 2 6

输出

4
14

题解

方法一

知识点:线段树,枚举。

每行建立个线段树,维护单点异或修改、区间和查询即可。

这个能过纯属数据太烂。理论上可以采用树套树,不过太烦了,二维树状数组可以替代。

时间复杂度 \(O(mn \log n)\)

空间复杂度 \(O(n^2)\)

方法二

知识点:树状数组。

用二维树状数组维护子矩阵和即可,是板子题。

时间复杂度 \(O(m \log^2 n)\)

空间复杂度 \(O(n^2)\)

代码

方法一

#include <bits/stdc++.h>
using namespace std;
using ll = long long; template<class T, class F>
class SegmentTree {
int n;
vector<T> node; void update(int rt, int l, int r, int x, F f) {
if (r < x || x < l) return;
if (l == r) return node[rt] = f(node[rt]), void();
int mid = l + r >> 1;
update(rt << 1, l, mid, x, f);
update(rt << 1 | 1, mid + 1, r, x, f);
node[rt] = node[rt << 1] + node[rt << 1 | 1];
} T query(int rt, int l, int r, int x, int y) {
if (r < x || y < l) return T();
if (x <= l && r <= y) return node[rt];
int mid = l + r >> 1;
return query(rt << 1, l, mid, x, y) + query(rt << 1 | 1, mid + 1, r, x, y);
} public:
SegmentTree(int _n = 0) { init(_n); }
SegmentTree(const vector<T> &src) { init(src); } void init(int _n) {
n = _n;
node.assign(n << 2, T());
}
void init(const vector<T> &src) {
assert(src.size() >= 2);
init(src.size() - 1);
function<void(int, int, int)> build = [&](int rt, int l, int r) {
if (l == r) return node[rt] = src[l], void();
int mid = l + r >> 1;
build(rt << 1, l, mid);
build(rt << 1 | 1, mid + 1, r);
node[rt] = node[rt << 1] + node[rt << 1 | 1];
};
build(1, 1, n);
} void update(int x, F f) { update(1, 1, n, x, f); } T query(int x, int y) { return query(1, 1, n, x, y); }
}; struct T {
int sum = 0;
friend T operator+(const T &a, const T &b) { return { a.sum + b.sum }; }
};
struct F {
int vis;
T operator()(const T &x) { return { x.sum ^ vis }; }
}; int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n, m;
cin >> n >> m;
vector<SegmentTree<T, F>> v(n + 1);
for (int i = 1;i <= n;i++) {
vector<T> src(n + 1);
for (int j = 1;j <= n;j++) {
int x;
cin >> x;
src[j] = { x };
}
v[i].init(src);
}
while (m--) {
int op;
cin >> op;
if (op == 1) {
int x, y;
cin >> x >> y;
v[x].update(y, { 1 });
}
else {
int x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
int ans = 0;
for (int i = x1;i <= x2;i++) ans += v[i].query(y1, y2).sum;
cout << ans << '\n';
}
}
return 0;
}

方法二

#include <bits/stdc++.h>
using namespace std;
using ll = long long; template<class T>
class Fenwick {
int n, m;
vector<vector<T>> node; public:
Fenwick(int _n = 0, int _m = 0) { init(_n, _m); } void init(int _n, int _m) {
n = _n;
m = _m;
node.assign(n + 1, vector<T>(m + 1, T()));
} void update(int x, int y, T val) {
for (int i = x;i <= n;i += i & -i)
for (int j = y;j <= m;j += j & -j)
node[i][j] += val;
} T query(int x, int y) {
T ans = T();
for (int i = x;i;i -= i & -i)
for (int j = y;j;j -= j & -j)
ans += node[i][j];
return ans;
}
T query(int x1, int y1, int x2, int y2) {
T ans = T();
ans += query(x2, y2);
ans -= query(x1 - 1, y2);
ans -= query(x2, y1 - 1);
ans += query(x1 - 1, y1 - 1);
return ans;
}
}; struct T {
int sum = 0;
T &operator+= (const T &x) { return sum += x.sum, *this; }
T &operator-= (const T &x) { return sum -= x.sum, *this; }
}; int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n, m;
cin >> n >> m;
vector<vector<int>> a(n + 1, vector<int>(n + 1));
Fenwick<T> fw(n, n);
for (int i = 1;i <= n;i++) {
for (int j = 1;j <= n;j++) {
cin >> a[i][j];
if (a[i][j]) fw.update(i, j, { 1 });
}
}
while (m--) {
int op;
cin >> op;
if (op == 1) {
int x, y;
cin >> x >> y;
if (a[x][y]) fw.update(x, y, { -1 });
else fw.update(x, y, { 1 });
a[x][y] ^= 1;
}
else {
int x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
cout << fw.query(x1, y1, x2, y2).sum << '\n';
}
}
return 0;
}

NC15172 情人节的电灯泡的更多相关文章

  1. 【2018年全国多校算法寒假训练营练习比赛(第五场)-E】情人节的电灯泡(二维树状数组单点更新+区间查询)

    试题链接:https://www.nowcoder.com/acm/contest/77/E 题目描述 情人节到了,小芳和小明手牵手,打算过一个完美的情人节,但是小刚偏偏也来了,当了一个明晃晃的电灯泡 ...

  2. 情人节那点事,Power BI告诉你

    情人节伴随着元宵节刚刚过去,Power BI团队就送给我们一份大礼,利用来自NRF(national retail foundation)和Bing搜索的数据,在Power BI中帮助我们发现在美国那 ...

  3. 【情人节来一发】网站添加QQ客服功能

    今年的元宵节遇到情人节,挺不自量力的,呵呵,开篇给各位讲个段子,早上一美女同学在空间发说说道:“开工大吉 起床啦,卖元宵,卖玫瑰,卖避孕套啦-有木有一起去发财的小伙伴?Let’s go…”,对于此种长 ...

  4. [51Testing情人节活动]情人节,爱要有“礼”才完美!

    2.14情人节,你还在纠结送TA什么礼物么? 你还苦于不敢表白么? 在微信里勇敢说出你的爱 51Testing帮你给TA特别的惊喜! Ps.用这个做借口表个白也不错哦! 本期51官方微信特别选出三种精 ...

  5. 2014.8.3情人节欢乐赛【Benny的农场】

    Benny的农场 (farm.pas/.c/.cpp) 时间限制:1s.空间限制:128MB 题目描述: Benny有一片农田需要灌溉.农田的形状为矩形,并被分为许多小块.每一块中都有一些水管.共有1 ...

  6. 【百度地图API】情人节求爱大作战——添加标注功能

    原文:[百度地图API]情人节求爱大作战--添加标注功能 任务描述: 2月2日是除夕,2月14立马来!即将到来的情人节,你想送TA一份什么礼物呢? 不如,在你们居住的地方,画个大大的桃心,表达你对TA ...

  7. ZZNU 1992: 情人节的尴尬

    题目描述 情人节这不刚过去没多久吗,我得给大家爆个料.这个事关于小飞飞的,小飞飞呢,要给她女票买礼物,但是呢有个比较尴尬的事情,小飞飞有些钱在某宝里,有些钱在某东里,众所周知,这俩可是死对头,想相互转 ...

  8. 使用R语言将微信记录制作成词云(简洁)--情人节奥义

    一.导出并读入微信聊天记录     参照百度的方法,使用同步助手.安装同步助手--连接手机(安卓苹果均可)--点击"其他功能"--点击微信图标即可进入聊天记录导出界面(非常简单). ...

  9. 情人节,教大家使用css画出一朵玫瑰花。

    情人节到了,给大家来一朵高端的玫瑰花. 在网上看到的一个canvas实现的玫瑰花,效果很好,但是代码被压缩过,也没有注释,看的云里雾里的. 今天我教大脚用CSS来实现一朵玫瑰花. 先看效果 首先我们画 ...

  10. 各位情人节快乐, Python帮忙撒狗粮, 我连夜做了这个程序!

    阅读本文大概需要5分钟 码农的情人节 一年一度的情人节要来啦,这个浪漫温馨的节日,走在大街小巷,走在地铁里,走在商场里,走在电影院,姑娘们手里几乎都捧着一束花,心里都是乐滋滋的,一脸幸福的样子,忽然想 ...

随机推荐

  1. Object.defineProperty()实现双向数据绑定

    <div id="app"> <input type="text" name="txt" id="txt&quo ...

  2. mysql之力扣数据库题目620有趣的电影优化记录

    闲着没事儿刷刷力扣的数据库题目,题目编号620:有趣的电影,下面是题目描述: 优化前的sql及执行时间: 优化后的sql及执行时间: 这里对筛选条件进行了优化: 1.select * 的查找效率要比逐 ...

  3. DC-设计和工艺数据-02

    在 compile之前保存ddc设计文件 check design - 检查文件的连接性和物理性 check design之后可以将未映射的网表写出,如果是几十万级的RTL,如果不写出,设置约束出现问 ...

  4. HTTP 1.1响应码

    HTTP 1.1响应码 响应码和信息 含义 HttpURLConnection 1XX 信息 100 Continue 服务器准备接受请求主体,客户端应当发送请求主体:这允许客户端在请求中发送大量数据 ...

  5. Shell-流程控制-if-then-elif

  6. 百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.12.14)

    一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...

  7. 海思Hi35xx 通过uboot 读取U盘文件进行固件升级

    前言 基本过程为:uboot 启动后,通过命令将U盘的的文件读取到内存中,再通过uboot 的flash 写入命令将读取到内存中的升级文件写入到flash的固定位置. (一)usb常用命令 uboot ...

  8. 精通 VS 调试技巧,学习与工作效率翻倍!

    ​ 欢迎大家来到贝蒂大讲堂 ​ 养成好习惯,先赞后看哦~ ​ 所属专栏:C语言学习 ​ 贝蒂的主页:Betty's blog ​ 1. 什么是调试 当我们写代码时候常常会遇见输出结果不符合我们预期的情 ...

  9. [转帖]一文带你搞懂xxl-job(分布式任务调度平台)

    https://zhuanlan.zhihu.com/p/625060354 前言 本篇文章主要记录项目中遇到的 xxl-job 的实战,希望能通过这篇文章告诉读者们什么是 xxl-job 以及怎么使 ...

  10. 从一次CPU打满到ReDos攻击和防范

    作者:京东物流 刘海茂 近期碰到一起值班报警事件,web 应用服务器 CPU 消耗打到 99%,排查后发现是因为 ReDoS 导致了服务器发生了资源被耗尽.访问系统缓慢的问题,通过排查过程从而分享下 ...