[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. [转]ubuntu16.04~qt 5.8无法输入中文

    编译fcitx-qt需要cmake,安装cmake命令,如果已经安装,请略过. sudo apt-get install cmake 安装 fcitx-libs-dev sudo apt-get in ...

  2. aarch64_g1

    GAPDoc-1.5.1-12.fc26.noarch.rpm 2017-02-14 07:37 1.0M fedora Mirroring Project GAPDoc-latex-1.5.1-12 ...

  3. 如何开启mysql5.5的客户端服务 命令行打开方法

    MySQL分为两个部分,服务器端和客户端,只有服务器端的服务开启后,才可以通过客户端登录到MySQL数据库.这里介绍如何用命令行方式开启mysql的客户端服务. 在计算机上安装好mysql软件   我 ...

  4. MinGw 和 cygwin 的区别和联系

    原创 by zoe.zhang .......................................................... 1. windows与Linux操作系统的不同   ...

  5. linux系统时钟和硬件时钟不一致

    在做DB2 集群复制的时候要求两台主机时间相互一致. 但是在一台主机上系统时间和硬件时间相差12个小时左右:手动同步后,重启后又相差12个小时左右. 为什么会是这样的,先介绍下系统时钟和硬件时钟的区别 ...

  6. python网络编程--进程线程

    一:什么是进程 一个程序执行时的实例被称为一个进程. 每个进程都提供执行程序所需的资源.一个进程有一个虚拟地址空间.可执行代码.对系统对象的开放句柄.一个安全上下文.一个独特的进程标识符.环境变量.一 ...

  7. Python_oldboy_自动化运维之路(二)

    本节内容: 1.pycharm工具的使用 2.进制运算 3.表达式if ...else语句 4.表达式for 循环 5.break and continue 6.表达式while 循环 1.pycha ...

  8. day08作业

    1.A.在类中的位置不同 成员变量:在类中方法外 局部变量:在方法定义中或者方法声明上 B.在内存中的位置不同 成员变量:在堆内存(成员变量属于对象,对象进堆内存) 局部变量:在栈内存(局部变量属于方 ...

  9. mac idea内存溢出

    VM options: -mx2048m -XX:MaxPermSize=2048m -Drebel.spring_plugin=true -Drebel.hibernate_plugin=true

  10. git —— 异常1,index.lock

    git提交过程中出现的问题 解决方法:找到 index.lock文件将其删除 一般 index.lock 在.git下面, 有时 .git 是隐藏的,但是无论怎样, 可以通过 everything 找 ...