维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数Q<=10000,W<=2000000.

Input

第一行两个整数,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:表示输入结束

Output

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

Sample Input0 4
1 2 3 3
2 1 1 3 3
1 2 2 2
2 2 2 3 4
3

Sample Output3
5Hint

保证答案不会超过int范围

思路:三元偏序问题,CDQ分治,(time,x,y),将每一次查询拆成四个点即可,初始值预处理一下就行

using namespace std;
#define lowbit(x) ((x)&(-x))
typedef long long LL; const int maxm = 2e6+; int C[maxm], S, W, ans[maxm]; void add(int x, int val) {
for(; x <= maxm; x += lowbit(x))
C[x] += val;
} int getsum(int x) {
int ret = ;
for(; x; x -= lowbit(x))
ret += C[x];
return ret;
} void clearr(int x) {
for(; x <= maxm; x += lowbit(x)) {
if(C[x] == ) break;
C[x] = ;
}
} struct Node {
int type, tim, x, y, w, id;
} buf[maxm], res[maxm]; bool cmp_S(Node a, Node b) {
if(a.tim == b.tim && a.x == b.x) return a.y < b.y;
if(a.tim == b.tim) return a.x < b.x;
return a.tim < b.tim;
} void CDQ(int L, int R) {
if(L >= R) return;
int mid = L+R >> ;
CDQ(L, mid), CDQ(mid+, R);
int i = L, j = mid+, k = L;
//左修改右查询
while(i <= mid && j <= R) {
if(res[i].x <= res[j].x) {
if(res[i].type == )
add(res[i].y, res[i].w);
buf[k++] = res[i++];
} else {
if(res[j].type == )
ans[res[j].id] += getsum(res[j].y) * res[j].w;
buf[k++] = res[j++];
}
}
while(i <= mid)
buf[k++] = res[i++];
while(j <= R) {
ans[res[j].id] += getsum(res[j].y) * res[j].w;
buf[k++] = res[j++];
}
for(int t = L; t <= R; ++t) {
clearr(buf[t].y); // 清空树状数组
res[t] = buf[t];
}
} int main() {
scanf("%d%d", &S, &W);
int type, sz = , x1, x2, y1, y2, tim = , query = ;
while(scanf("%d", &type) && type != ) {
if(type == ) {
scanf("%d%d%d", &res[sz].x, &res[sz].y, &res[sz].w);
res[sz].tim = tim++;
res[sz++].type = type;
} else if(type == ) {
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
ans[++query] = (y2 - y1 + ) * (x2 - x1 + ) * S;
res[sz++] = {type, tim++, x1-, y1-, , query};
res[sz++] = {type, tim++, x2, y1-, -, query};
res[sz++] = {type, tim++, x1-, y2, -, query};
res[sz++] = {type, tim++, x2, y2, , query};
}
}
sort(res, res+sz, cmp_S);
CDQ(, sz-);
for(int i = ; i <= query; ++i)
printf("%d\n", ans[i]);
return ;
}

Day6 - L - Mokia HYSBZ - 1176的更多相关文章

  1. Day6 - K - 陌上花开 HYSBZ - 3262

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

  2. Day6 - C - Count HYSBZ - 1452 /1452: [JSOI2009]Count

    Description 一个N*M的方格,初始时每个格子有一个整数权值,接下来每次有2个操作: 改变一个格子的权值 求一个子矩阵中某个特定权值出现的个数   Input 每一行有两个数字N,M 接下来 ...

  3. 【教程】简易CDQ分治教程&学习笔记

    前言 辣鸡蒟蒻__stdcall终于会CDQ分治啦!       CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. CDQ分治的基 ...

  4. POJ1195Mobile phones (从二维树状数组到cdq分治)

    Suppose that the fourth generation mobile phone base stations in the Tampere area operate as follows ...

  5. day6_异常捕捉

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/7/11 14:14 # @Author : 大坏男孩 # @File : d ...

  6. JavaWeb 后端 <二> 之 Servlet 学习笔记

    一.Servlet概述 1.什么是Servlet Servlet是一个运行在服务器端的Java小程序,通过HTTP协议用于接收来自客户端请求,并发出响应. 2.Servlet中的方法 public v ...

  7. HTML5 3D 粒子波浪动画特效DEMO演示

    需要thress.js插件:     http://github.com/mrdoob/three.js // three.js - http://github.com/mrdoob/three.js ...

  8. BZOJ 1176: [Balkan2007]Mokia

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

  9. BZOJ 1176: [Balkan2007]Mokia( CDQ分治 + 树状数组 )

    考虑cdq分治, 对于[l, r)递归[l, m), [m, r); 然后计算[l, m)的操作对[m, r)中询问的影响就可以了. 具体就是差分答案+排序+离散化然后树状数组维护.操作数为M的话时间 ...

随机推荐

  1. Redis常用命令操作

    字符串类型: * 存储:set key value * 获取:get key * 无值返回nil * 删除:del key 哈希类型 hash: * 存储:hset key field value * ...

  2. leetcode刷题-- 4. 贪心

    贪心 455分发饼干 假设你是一位很棒的家长,想要给你的孩子们一些小饼干.但是,每个孩子最多只能给一块饼干.对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸:并且每块饼 ...

  3. 吴裕雄--天生自然ORACLE数据库学习笔记:数据表对象

    create table students( stuno ) not null, --学号 stuname ), --姓名 sex ), --性别 age int, --年龄 departno ) n ...

  4. 牛客挑战赛36 G Nim游戏(分治FWT)

    https://ac.nowcoder.com/acm/contest/3782/G 题解: 分治FWT裸题. 每个都相当于\((1+b[i]x^{a[i]})\),求这玩意的异或卷积. 先把a[i] ...

  5. python爬虫(四) 内涵段子

    import requests import time import json from urllib import request from urllib import parse url = 'h ...

  6. Android音频捕获(录音)(转)

    原文:http://www.yiibai.com/android/android_audio_capture.html Android有一个内置的麦克风,通过它可以捕获音频和存储,或在手机进行播放.有 ...

  7. springmvc常用注解详解

    1.@Controller 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ...

  8. 解决IE打开时,弹出的提示调用active的问题,阻止js运行。

    在html和head中间加上: <!-- saved from url=(0014)about:internet -->

  9. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 辅助类:除了屏幕阅读器外,其他设备上隐藏元素

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  10. C#中File和FileStream的用法----转载

    C#中File和FileStream的用法原创 忆汐辰 发布于2019-04-10 11:34:23 阅读数 5841 收藏展开 在近期的工作过程中发现自己的基础比较薄弱,所以最近在恶补基础知识.下面 ...