Bzoj1176:Mokia&Cogs1752:[BOI2007]摩基亚Mokia
题目
Cogs
没有Bzoj的权限号
Sol
离线,\(CDQ\)分治,把询问拆成\(4\)个,变成每次求二维前缀和
那么只要一个修改操作(关键字为时间,\(x\),\(y\))都在这个询问前,就可以累计答案
那么就成了偏序问题了,直接\(CDQ\)
注意当\(x\)相等时要把修改丢在前面
# include <bits/stdc++.h>
# define IL inline
# define RG register
# define Fill(a, b) memset(a, b, sizeof(a))
# define File(a) freopen(a".in", "r", stdin), freopen(a".out", "w", stdout)
using namespace std;
typedef long long ll;
const int _(2e6 + 5);
IL ll Input(){
RG ll x = 0, z = 1; RG char c = getchar();
for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;
for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
return x * z;
}
int n, m, cal[_], Q;
ll ans[_], bit[_], a[_];
struct Data{
int id, x, y, op;
} q[_], tmp[_];
IL void Add(RG int x, RG ll v){
for(; x <= n; x += x & -x) bit[x] += v;
}
IL ll Query(RG int x){
RG ll ret = 0;
for(; x; x -= x & -x) ret += bit[x];
return ret;
}
IL bool Cmp(RG int x, RG int y){
if(q[x].x != q[y].x) return q[x].x < q[y].x;
if(!q[x].op) return 1;
return 0;
}
IL void CDQ(RG int l, RG int r){
if(l == r) return;
RG int mid = (l + r) >> 1;
CDQ(l, mid); CDQ(mid + 1, r);
for(RG int i = l, j = mid + 1, k = l; k <= r; ++k)
if(j > r || (i <= mid && Cmp(i, j))) tmp[k] = q[i++];
else tmp[k] = q[j++];
for(RG int i = l; i <= r; ++i) q[i] = tmp[i];
for(RG int i = l; i <= r; ++i)
if(q[i].id <= mid){
if(!q[i].op) Add(q[i].y, a[q[i].id]);
}
else{
if(q[i].op){
ans[cal[q[i].id]] += 1LL * Query(q[i].y) * q[i].op;
}
}
for(RG int i = l; i <= r; ++i)
if(q[i].id <= mid && !q[i].op) Add(q[i].y, -a[q[i].id]);
}
int main(RG int argc, RG char* argv[]){
File("mokia");
Input(); n = Input();
for(RG int op = Input(); op != 3; op = Input()){
if(op == 1){
RG int x = Input(), y = Input(); a[++m] = Input();
q[m] = (Data){m, x, y, 0};
}
else{
RG int x1 = Input(), y1 = Input(), x2 = Input(), y2 = Input();
++Q;
q[++m] = (Data){m, x2, y2, 1}; cal[m] = Q;
q[++m] = (Data){m, x1 - 1, y1 - 1, 1}; cal[m] = Q;
q[++m] = (Data){m, x1 - 1, y2, -1}; cal[m] = Q;
q[++m] = (Data){m, x2, y1 - 1, -1}; cal[m] = Q;
}
}
CDQ(1, m);
for(RG int i = 1; i <= Q; ++i) printf("%lld\n", ans[i]);
return 0;
}
Bzoj1176:Mokia&Cogs1752:[BOI2007]摩基亚Mokia的更多相关文章
- COGS1752. [BOI2007]摩基亚Mokia
1752. [BOI2007]摩基亚Mokia ★★☆ 输入文件:mokia.in 输出文件:mokia.out 简单对比时间限制:5 s 内存限制:128 MB [题目描述] 摩尔瓦 ...
- COGS1752 [BOI2007]摩基亚Mokia(CDQ分治 + 二维前缀和 + 线段树)
题目这么说的: 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米.但其真正高科技之处在于,它 ...
- COGS1752. [BOI2007]摩基亚Mokia(CDQ,树状数组)
题目描述 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米.但其真正高科技之处在于,它能够回 ...
- COGS1752. [BOI2007]摩基亚Mokia CDQ
CDQ的板子题 #include<cstdio> #include<cstring> #include<iostream> #include<algorith ...
- COJS 1752. [BOI2007]摩基亚Mokia
1752. [BOI2007]摩基亚Mokia ★★★ 输入文件:mokia.in 输出文件:mokia.out 简单对比时间限制:5 s 内存限制:128 MB [题目描述] 摩尔瓦 ...
- 分治(CDQ):[BOI2007]摩基亚Mokia
[题目描述] 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米.但其真正高科技之处在于,它能 ...
- 【COGS1752】 BOI2007—摩基亚Mokia
http://cogs.pro/cogs/problem/problem.php?pid=1752 (题目链接) 题意 给出$n*n$的棋盘,单点修改,矩阵查询. Solution 离线以后CDQ分治 ...
- [COGS 1752] 摩基亚Mokia
照例先上题面 1752. [BOI2007]摩基亚Mokia 输入文件:mokia.in 输出文件:mokia.out 时间限制:1.5 s 内存限制:128 MB [题目描述] 摩尔瓦多的移 ...
- [BOI2007]摩基亚
题目:洛谷P4390.BZOJ1176. 题目大意: 给你一个\(W\times W\)的矩阵,初始每个数都为\(S\).现在有若干操作: 1. 给某个格子加上一个值:2. 询问某个子矩阵的值的和:3 ...
随机推荐
- 【linux之shell脚本】
一.简介 机器语言汇编语言高级语言 面向过程 C Shell Perl 面向对象 java python c++ 强语言:先编译再执行 java c++ 弱语言:边编译边执行 shell python ...
- 洛谷 P4016负载平衡问题【费用流】题解+AC代码
洛谷 P4016负载平衡问题 P4014 分配问题[费用流]题解+AC代码 负载平衡问题 题目描述 GG 公司有n个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 n ...
- 隱藏在素數規律中的Pi -- BZOJ1041解題報告
退役狗在刷程書的過程中看到了一個有趣的視頻, 講解了一個有趣的問題. 在網上隨便搜索了一下居然還真的找到了一道以它爲背景的OI題目, BZOJ1041. 下面的內容會首先回顧一下視頻所討論的知識, 有 ...
- Oracle批量操作数据库
1:批量插入 <insert id="insertBatch" parameterType="Java.util.List" > insert in ...
- 1.8 range
哈哈,前边忘了介绍这个知识点了,老是用人家,不介绍一下都不好意思了. range()函数是一个用来创建数字序列的函数. 问题来了,为什么要写函数? 封装代码啊,让使用者不需要关心具体业务逻辑是如何实现 ...
- 批标准化(Batch Norm)
BN作用: 加速收敛 控制过拟合,可以少用或不用Dropout和正则 降低网络对初始化权重不敏感 允许使用较大的学习率 一.如何加速收敛? 通过归一化输入值/隐藏单元值,以获得类似的范围值,可加速学习 ...
- c++ 如何获取多线程的返回值?
// Console.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <stdlib.h> #include ...
- CodeForces-740B Alyona and flowers
题目要求选择一些花的集合,如果暴力去枚举每种选择方法明显是不行的.换种方式考虑:每一个集合都能为最后的答案做出要么正的.要么负的.要么0贡献,先把所有集合能做出的贡献预处理,然后从m个集合里面选择贡献 ...
- DOCKER 无法获取使用宿主机DNS 的原因,解决方法
今天在公司服务器上部署项目,遇到一个大坑.接口怎么请求都不同,宿主机DNS已经改了.宿主可以请求,找了半天,原来是DOCKER 没有获取到主机的DNS 进去DOCKER解析不了域名 指定DNS 启动也 ...
- python 小练习之生成手机号码
需求分析: 1 将固定的号码段放到list中 如:136 137 180 183等等 2 随机取8个数字元素 3 将固定号码段与随机产生的元素拼接在一起 4 写入文件 import stringdef ...