[BZOJ2683]简单题

题目大意:

一个\(n\times n(n\le5\times10^5)\)的矩阵,初始时每个格子里的数全为\(0\)。\(m(m\le2\times10^5)\)次操作,操作包含以下两种:

  1. 将某个格子加上一个数;
  2. 询问某个子矩阵的值。

思路:

CDQ分治+树状数组。

源代码:

#include<cstdio>
#include<cctype>
#include<algorithm>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
const int M=8e5+1,C=2e5,N=5e5+1;
struct Query {
int type,t,id,x,y,v;
};
Query a[M];
int n,ans[C];
inline bool cmp1 (const Query &p1,const Query &p2) {
if(p1.t==p2.t) {
if(p1.x==p2.x) return p1.y<p2.y;
return p1.x<p2.x;
}
return p1.t<p2.t;
}
inline bool cmp2 (const Query &p1,const Query &p2) {
if(p1.x==p2.x) return p1.y<p2.y;
return p1.x<p2.x;
}
class FenwickTree {
private:
int val[N];
int lowbit(const int &x) const {
return x&-x;
}
public:
void modify(int p,const int &x) {
for(;p<=n;p+=lowbit(p)) val[p]+=x;
}
int query(int p) const {
int ret=0;
for(;p;p-=lowbit(p)) ret+=val[p];
return ret;
}
};
FenwickTree t;
void cdq(const int &b,const int &e) {
if(b==e) return;
const int mid=(b+e)>>1;
cdq(b,mid);
cdq(mid+1,e);
int p=b,q=mid+1;
for(;q<=e;q++) {
if(a[q].type==1) continue;
for(;p<=mid&&a[p].x<=a[q].x;p++) {
if(a[p].type==1) t.modify(a[p].y,a[p].v);
}
ans[a[q].id]+=t.query(a[q].y)*a[q].v;
}
while(--p>=b) {
if(a[p].type==1) t.modify(a[p].y,-a[p].v);
}
std::inplace_merge(&a[b],&a[mid]+1,&a[e]+1,cmp2);
}
int main() {
n=getint();
int m=0,cnt=-1;
for(register int opt=getint(),i=0;opt!=3;opt=getint(),i++) {
if(opt==1) {
const int x=getint(),y=getint(),v=getint();
a[++m]=(Query){1,i,cnt,x,y,v};
}
if(opt==2) {
const int x1=getint(),y1=getint(),x2=getint(),y2=getint();
cnt++;
if(x1!=1&&y1!=1) a[++m]=(Query){2,i,cnt,x1-1,y1-1,1};
if(x1!=1) a[++m]=(Query){2,i,cnt,x1-1,y2,-1};
if(y1!=1) a[++m]=(Query){2,i,cnt,x2,y1-1,-1};
a[++m]=(Query){2,i,cnt,x2,y2,1};
}
}
std::sort(&a[1],&a[m]+1,cmp1);
cdq(1,m);
for(register int i=0;i<=cnt;i++) {
printf("%d\n",ans[i]);
}
return 0;
}

[BZOJ1176][BalkanOI2007]Mokia

改一下输入格式和数据范围,没什么区别。

[BZOJ2683]简单题/[BZOJ1176][BalkanOI2007]Mokia的更多相关文章

  1. Bzoj2683 简单题

    Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 1071  Solved: 428 Description 你有一个N*N的棋盘,每个格子内有一个整数, ...

  2. bzoj2683简单题 cdq分治

    2683: 简单题 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 1803  Solved: 731[Submit][Status][Discuss] ...

  3. bzoj2683简单题

    #include <iostream> #include <cstdio> #include <cmath> #include <algorithm> ...

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

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

  5. BZOJ2683 简单题(CDQ分治)

    传送门 之前听别人说CDQ分治不难学,今天才知道果真如此.之前一直为自己想不到CDQ的方法二很不爽,今天终于是想出来了一道了,太弱-- cdq分治主要就是把整段区间分成两半,然后用左区间的值去更新右区 ...

  6. Bzoj2683 简单题 [CDQ分治]

    Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 1071  Solved: 428 Description 你有一个N*N的棋盘,每个格子内有一个整数, ...

  7. 【对询问分块】【主席树】bzoj2683 简单题

    对操作序列分块,每S次暴力重建主席树. 当S=sqrt(n*log(n))时,复杂度为O(m*sqrt(n*log(n))). 在线的. #include<cstdio> #include ...

  8. cdq分治——bzoj2683简单题

    https://www.lydsy.com/JudgeOnline/problem.php?id=2683 知识点:1.以操作的顺序进行分治  2.cdq分治维护矩阵 3.计算比mid小的给比mid大 ...

  9. 【BZOJ1176】[Balkan2007]Mokia/【BZOJ2683】简单题 cdq分治

    [BZOJ1176][Balkan2007]Mokia Description 维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=1600 ...

随机推荐

  1. 20155303 2016-2017-2 《Java程序设计》第一周学习总结

    20155303 2016-2017-2 <Java程序设计>第一周学习总结 教材学习内容总结 浏览教材,根据自己的理解每章提出一个问题 Chapter1 Java平台概论:MyProgr ...

  2. 20165230 《Java程序设计》实验一(Java开发环境的熟悉)实验报告

    20165230 <Java程序设计>实验一(Java开发环境的熟悉)实验报告 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:田坤烨 学号:20165230 成绩: 指 ...

  3. 连接数据库及出现System.AccessViolationException错误的解决方法

    调试后发现, connection.Open();以后报错,System.AccessViolationException: 尝试读取或写入受保护的内存.这通常指示其他内存已损坏,网上搜了很多都没有作 ...

  4. linux下补丁制作及打补丁实例【转】

    转自:http://www.latelee.org/using-gnu-linux/diff-and-patch-on-linux.html 搞ARM有一段时日了,期间看了不少开发板的手册,手册的内容 ...

  5. static, const 和 static const 变量的初始化问题

    const 常量的在超出其作用域的时候会被释放,但是 static 静态变量在其作用域之外并没有释放,只是不能访问. static 修饰的是静态变量,静态函数.对于类来说,静态成员和静态函数是属于整个 ...

  6. vue实现结算淘宝购物车效果

    实现单选时的价格,全选时价格 单选效果图 全选效果图 html <template> <!-- 淘宝结算购物车 --> <div class="settleme ...

  7. RestTemplate中文乱码问题(spring-web3.0.7版本)

    从网上找的方法: 方法一: //resttemplate乱码问题 //3.1.X以上版本使用 // restTemplate.getMessageConverters().add(0, StringH ...

  8. 纯css进度条,各种兼容

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD&g ...

  9. Oracle 函数 “把当前的用户(审核人,审核通过后)插入到数据表中”

    create or replace function mcode_apply_update_personnel(p_mca_no VARCHAR2, -- 参数(实参) p_action VARCHA ...

  10. Merkle Tree(默克尔树)算法解析

    Merkle Tree概念 Merkle Tree,通常也被称作Hash Tree,顾名思义,就是存储hash值的一棵树.Merkle树的叶子是数据块(例如,文件或者文件的集合)的hash值.非叶节点 ...