bzoj1176

题目描述

维护一个W*W的矩阵,初始值均为S(题目描述有误,这里的S没有任何作用!).每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数Q<=10000,W<=2000000.

输入

第一行两个整数,S,W;其中S为矩阵初始值;W为矩阵大小
接下来每行为一下三种输入之一(不包含引号):
1 x y a
2 x1 y1 x2 y2
3
输入1:你需要把(x,y)(第x行第y列)的格子权值增加a
输入2:你需要求出以左下角为(x1,y1),右上角为(x2,y2)的矩阵内所有格子的权值和,并输出
输入3:表示输入结束

输出

对于每个输入2,输出一行,即输入2的答案

样例输入

0 4
1 2 3 3
2 1 1 3 3
1 2 2 2
2 2 2 3 4
3

样例输出

3
5


bzoj2683

题目描述

同上,只是少了一个烦人的S


题解

CDQ分治

先读入所有修改和询问操作,将每个修改拆成4个。

然后按照CDQ分治的套路,按x排序,按id比较,按y查询。

(好像这道题我写的和别的CDQ分治题不一样。。。)

代码是1176的,2683直接去掉%*d即可。

(就算S真的有用,可以直接改ans的初始值,也是一样的)

#include <cstdio>
#include <algorithm>
using namespace std;
struct data
{
int x , y , v , p , id , opt;
}a[800000] , tmp[800000];
int n , tot , cnt , f[2000010] , ans[200000];
bool cmp(data a , data b)
{
return a.x == b.x ? (a.y == b.y ? a.opt < b.opt : a.y < b.y) : a.x < b.x;
}
void add(int b , int c , int d , int t)
{
a[++tot].x = b , a[tot].y = c , a[tot].v = d , a[tot].id = tot , a[tot].opt = t;
if(t) a[tot].p = cnt;
}
void update(int x , int a)
{
int i;
for(i = x ; i <= n ; i += i & -i) f[i] += a;
}
int query(int x)
{
int i , ans = 0;
for(i = x ; i ; i -= i & -i) ans += f[i];
return ans;
}
void solve(int l , int r)
{
if(l == r) return;
int mid = (l + r) >> 1 , i , p1 = l , p2 = mid + 1;
for(i = l ; i <= r ; i ++ )
{
if(a[i].id <= mid && !a[i].opt) update(a[i].y , a[i].v);
if(a[i].id > mid && a[i].opt) ans[a[i].p] += a[i].v * query(a[i].y);
}
for(i = l ; i <= r ; i ++ ) if(a[i].id <= mid && !a[i].opt) update(a[i].y , -a[i].v);
for(i = l ; i <= r ; i ++ )
{
if(a[i].id <= mid) tmp[p1 ++ ] = a[i];
else tmp[p2 ++ ] = a[i];
}
for(i = l ; i <= r ; i ++ ) a[i] = tmp[i];
solve(l , mid) , solve(mid + 1 , r);
}
int main()
{
int i , k , b , c , d , e;
scanf("%*d%d" , &n);
while(scanf("%d" , &k) && k != 3)
{
if(k == 1) scanf("%d%d%d" , &b , &c , &d) , add(b , c , d , 0);
else scanf("%d%d%d%d" , &b , &c , &d , &e) , cnt ++ , add(d , e , 1 , 1) , add(b - 1 , e , -1 , 1) , add(d , c - 1 , -1 , 1) , add(b - 1 , c - 1 , 1 , 1);
}
sort(a + 1 , a + tot + 1 , cmp);
solve(1 , tot);
for(i = 1 ; i <= cnt ; i ++ ) printf("%d\n" , ans[i]);
return 0;
}

【bzoj1176】[Balkan2007]Mokia/【bzoj2683】简单题 CDQ分治+树状数组的更多相关文章

  1. BZOJ2683: 简单题(cdq分治 树状数组)

    Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 2142  Solved: 874[Submit][Status][Discuss] Descripti ...

  2. BZOJ 2683 简单题 cdq分治+树状数组

    题意:链接 **方法:**cdq分治+树状数组 解析: 首先对于这道题,看了范围之后.二维的数据结构是显然不能过的.于是我们可能会考虑把一维排序之后还有一位上数据结构什么的,然而cdq分治却可以非常好 ...

  3. bzoj 1176: [Balkan2007]Mokia&&2683: 简单题 -- cdq分治

    2683: 简单题 Time Limit: 50 Sec  Memory Limit: 128 MB Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要 ...

  4. BZOJ 1176 Mokia CDQ分治+树状数组

    1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 1854  Solved: 821[Submit][St ...

  5. 【BZOJ4553】[Tjoi2016&Heoi2016]序列 cdq分治+树状数组

    [BZOJ4553][Tjoi2016&Heoi2016]序列 Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能 ...

  6. 【bzoj3262】陌上花开 CDQ分治+树状数组

    题目描述 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当且仅当Sa&g ...

  7. 【bzoj2225】[Spoj 2371]Another Longest Increasing CDQ分治+树状数组

    题目描述 给定N个数对(xi, yi),求最长上升子序列的长度.上升序列定义为{(xi, yi)}满足对i<j有xi<xj且yi<yj. 样例输入 8 1 3 3 2 1 1 4 5 ...

  8. LOJ3146 APIO2019路灯(cdq分治+树状数组)

    每个时刻都形成若干段满足段内任意两点可达.将其视为若干正方形.则查询相当于求历史上某点被正方形包含的时刻数量.并且注意到每个时刻只有O(1)个正方形出现或消失,那么求出每个矩形的出现时间和消失时间,就 ...

  9. BZOJ 4553 [Tjoi2016&Heoi2016]序列 ——CDQ分治 树状数组

    考虑答案的构成,发现是一个有限制条件的偏序问题. 然后三个维度的DP,可以排序.CDQ.树状数组各解决一维. #include <map> #include <cmath> # ...

随机推荐

  1. oracle 12.1的删除和创建公共用户问题

    版本12.1 ,cdb-rac模式 一个集群,4个节点,一个cdb,下面有12个pdb. os:linux 64 --- 删除用户 drop user c##test atler.log提示 ORA- ...

  2. PHP学习day1

    PHP 变量规则: 变量以 $ 符号开头,其后是变量的名称 变量名称必须以字母或下划线开头 变量名称不能以数字开头 变量名称只能包含字母数字字符和下划线(A-z.0-9 以及 _) 变量名称对大小写敏 ...

  3. I/O流、文件操作

    1)操作文件 Path和Files是在JavaSE7中新添加进来的类,它们封装了在用户机器上处理文件系统所需的所有功能.Path表示的一个目录名序列,其后还可以跟着一个文件名.路径中的第一个参数可以是 ...

  4. ThinkPHP之__construct()和__initialize()

    ThinkPHP中的__initialize()和类的构造函数__construct()网上有很多关于__initialize()的说法和用法,总感觉不对头,所以自己测试了一下.将结果和大家分享.不对 ...

  5. python函数(2017-8-2)

    1. def 函数名(形式参数) 函数体 return "123" 函数执行了return之后就不再执行下面的代码 2. 默认形参实参的位置一一对应 如果要调整位置,指定形参名字 ...

  6. HyperLedger Fabric 1.4 超级账本起源(5.1)

    至比特币开源以来,无数技术人员对其进行研究,并且对该系统经过了无数次改进,超级账本项目(Hyperledger)最初也是用来改善比特币的底层技术,最终由Linux基金会组织发展起来.       开放 ...

  7. python中矢量化字符串方法

  8. 总结Verilog中always语句的使用

    always语句包括的所有行为语句构成了一个always语句块.该always语句块从仿真0时刻开始执行其中的行为语句:最后一条执行完成后,再开始执行其中的第一条语句,如此往复循环,直到整个仿真结束. ...

  9. springboot2.x+maven+proguard代码混淆

    由于需要将源码打包做代码混淆,选择proguard,开始使用各种问题,各种jar包版本问题,但最终成功了,记录一下,也希望能够帮助大家 在pom中添加代码: <build> <fin ...

  10. [bzoj5158][Tjoi2014]Alice and Bob

    好羞愧啊最近一直在刷水... 题意:给定序列$c$的$a_i$,构造出一个序列$c$使得$\sum b_i$最大. 其中$a_i$表示以$c_i$结尾的最长上升子序列长度,$b_i$表示以$c_i$为 ...