题目描述

She says that any Pavarotti among the nightingales will serenade his mate while she sits on her eggs. She says that any excited database can answer the queries efficiently.
You are given the two dimensional database as a matrix A with n rows and n columns. In the beginning, A[i][j] = 0 for all 1 ≤ i, j ≤ n. Then q operations or queries will be given in turn.
You should maintain the database for two type of operations:
• 1 L R: for each element A[i][j] which satisfy L ≤ i + j ≤ R, increase the value to A[i][j] + 1, where 2 ≤ L ≤ R ≤ 2n.
• 2 L R: for each element A[i][j] which satisfy L ≤ i − j ≤ R, increase the value to A[i][j] + 1, where 1 − n ≤ L ≤ R ≤ n − 1.
Meanwhile, you should answer the queries:
• 3 x1 x2 y1 y2 : count the value of elements A[i][j] which satisfy x1 ≤ i ≤ x  and y1 ≤ j ≤ y2 , where 1 ≤ x1 < x2 ≤ n and 1 ≤ y1 < y2 ≤ n.

输入

The input contains several test cases. The first line of the input is a single integer t which is the number of test cases. Then t test cases follow.
Each test case contains several lines. The first line contains the integer n and q. The i-th line of the next q lines contains an operation “1 L R” or “2 L R”, or a query “3 x1 x2 y1 y2 ”.
The sum of n for all test cases would not be larger than 200000 and the sum of q would not be larger than 50000.

输出

For each test case, you should output answers to queries printed one per line.

样例输入

2
6 6
2 0 1
3 1 4 3 5
3 2 5 2 3
1 5 7
3 1 4 3 5
3 2 5 2 3
6 26
2 -4 -1
3 1 4 2 5
3 3 6 4 6
1 4 7
3 2 5 2 3
3 1 4 2 5
2 -3 -1
3 1 4 3 5
1 3 5
1 2 3
3 2 5 2 3
3 1 4 2 5
3 3 6 4 6
2 0 4
3 1 4 3 5
3 1 4 2 5
1 9 11
2 1 2
3 2 5 2 3
3 3 6 4 6
2 -2 2
1 7 12
3 1 4 3 5
3 2 5 2 3
3 1 4 2 5
3 3 6 4 6

样例输出

Case #1:
3
4
11
10
Case #2:
10
6
8
22
26
12
38
13
32
44
23
30
49
33
67
53
题意就是给你一个n×n的矩阵,有三种操作
1LR 给L<=i+j<=R的点加1
2LR 给L<=i- j<=R的点加1
x1 x2 y1 y2 询问x1<=i<=x2,y1<=j<=y2的点的和 建两棵线段树,一棵维护对角线(i-j相同的一斜列,不妨称i-j的值为斜率),一棵维护负对角线(i+j相同)
对每棵线段树维护sum:sum(l,r)为斜率在l和r之间的数的和
sumL:sumL(l,r)为斜率在l和r之间,l行取1个,l+1行取两个……所形成的三角形,即一个等差数列的和
sumR:sumR(l,r)为斜率在l和r之间,r行取1个,r-1行取两个……所形成的三角形,即一个等差数列的和 对每次询问,为一个矩形,拆成两个等腰直角三角形和一个平行四边形的和,对角线和负对角线单独计算
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=4e5+;
struct tree{
int l,r;
ll sum,sumL,sumR,lazy;
int length() {return r-l+;}
int maintain(ll a)
{
lazy+=a;
sum+=a*length();
ll add=a*length()*(length()+)/;
sumL+=add;
sumR+=add;
}
}t[][N*];
int n,q,op,T;
void Pushup(int s,int id)
{
t[id][s].sum=t[id][s<<].sum+t[id][s<<|].sum;
t[id][s].sumL=t[id][s<<].sumL+t[id][s<<|].sumL+t[id][s<<|].sum*(t[id][s<<].length());
t[id][s].sumR=t[id][s<<].sumR+t[id][s<<|].sumR+t[id][s<<].sum*(t[id][s<<|].length());
}
void Pushdown(int s,int id)
{
if (t[id][s].lazy)
{
t[id][s<<].maintain(t[id][s].lazy);
t[id][s<<|].maintain(t[id][s].lazy);
t[id][s].lazy=;
}
}
void build(int s,int l,int r,int id)
{
t[id][s].l=l; t[id][s].r=r;
t[id][s].sum=t[id][s].sumL=t[id][s].sumR=t[id][s].lazy=;
if (l==r) return ;
int mid=(t[id][s].l+t[id][s].r)>>;
build(s<<,l,mid,id);
build(s<<|,mid+,r,id);
Pushup(s,id);
}
void update(int s,int L,int R,int id)
{
int l=t[id][s].l,r=t[id][s].r;
if (L<=l&&r<=R)
{
t[id][s].maintain();
return ;
}
Pushdown(s,id);
int mid=(l+r)>>;
if (L<=mid) update(s<<,L,R,id);
if (R>mid) update(s<<|,L,R,id);
Pushup(s,id);
}
ll query(int s,int L,int R,int id)
{
int l=t[id][s].l,r=t[id][s].r;
if (L<=l&&r<=R) return t[id][s].sum;
Pushdown(s,id);
int mid=(l+r)>>;
ll ret=;
if (L<=mid) ret+=query(s<<,L,R,id);
if (R>mid) ret+=query(s<<|,L,R,id);
Pushup(s,id);
return ret;
}
ll queryL(int s,int L,int R,int id)
{
int l=t[id][s].l,r=t[id][s].r;
if (L<=l&&r<=R) return t[id][s].sumL+t[id][s].sum*(l-L);
Pushdown(s,id);
int mid=(l+r)>>;
ll ret=;
if (L<=mid) ret+=queryL(s<<,L,R,id);
if (R>mid) ret+=queryL(s<<|,L,R,id);
Pushup(s,id);
return ret;
}
ll queryR(int s,int L,int R,int id)
{
int l=t[id][s].l,r=t[id][s].r;
if (L<=l&&r<=R) return t[id][s].sumR+t[id][s].sum*(R-r);
Pushdown(s,id);
int mid=(l+r)>>;
ll ret=;
if (L<=mid) ret+=queryR(s<<,L,R,id);
if (R>mid) ret+=queryR(s<<|,L,R,id);
Pushup(s,id);
return ret;
} int main()
{
scanf("%d",&T);
for (int ca=;ca<=T;ca++)
{
printf("Case #%d:\n",ca);
int l,r;
int X1,X2,Y1,Y2;
scanf("%d%d",&n,&q);
build(,,n*,);
build(,,*n-,);
while (q--)
{
scanf("%d",&op);
if (op==)
{
scanf("%d%d",&l,&r);
update(,l,r,);
}
else if (op==)
{
scanf("%d%d",&l,&r);
update(,l+n,r+n,);
}
else
{
scanf("%d%d%d%d",&X1,&X2,&Y1,&Y2);
ll ans=;
ll wid=min(X2-X1,Y2-Y1)+; l=X2+Y1;r=X1+Y2;
if (l>r) swap(l,r);
ans+=query(,l,r,)*wid;
ans+=queryL(,X1+Y1,l-,);
ans+=queryR(,r+,X2+Y2,); l=X1-Y1+n,r=X2-Y2+n;
if (l>r) swap(l,r);
ans+=query(,l,r,)*wid;
ans+=queryL(,X1-Y2+n,l-,);
ans+=queryR(,r+,X2-Y1+n,);
printf("%lld\n",ans);
}
}
}
return ;
}

一个WA了无数发最终参考大佬博客才写成的代码

ICPC 2015 Shenyang Online-E-EXCITED DATAbase的更多相关文章

  1. ACM ICPC 2015 Moscow Subregional Russia, Moscow, Dolgoprudny, October, 18, 2015 G. Garden Gathering

    Problem G. Garden Gathering Input file: standard input Output file: standard output Time limit: 3 se ...

  2. ACM ICPC 2015 Moscow Subregional Russia, Moscow, Dolgoprudny, October, 18, 2015 D. Delay Time

    Problem D. Delay Time Input file: standard input Output file: standard output Time limit: 1 second M ...

  3. ACM-ICPC 2015 Shenyang Preliminary Contest B. Best Solver

    The so-called best problem solver can easily solve this problem, with his/her childhood sweetheart. ...

  4. ACM ICPC 2015 Moscow Subregional Russia, Moscow, Dolgoprudny, October, 18, 2015 I. Illegal or Not?

    I. Illegal or Not? time limit per test 1 second memory limit per test 512 megabytes input standard i ...

  5. ACM ICPC 2015 Moscow Subregional Russia, Moscow, Dolgoprudny, October, 18, 2015 K. King’s Rout

    K. King's Rout time limit per test 4 seconds memory limit per test 512 megabytes input standard inpu ...

  6. ACM ICPC 2015 Moscow Subregional Russia, Moscow, Dolgoprudny, October, 18, 2015 H. Hashing

    H. Hashing time limit per test 1 second memory limit per test 512 megabytes input standard input out ...

  7. ACM ICPC 2015 Moscow Subregional Russia, Moscow, Dolgoprudny, October, 18, 2015 C. Colder-Hotter

    C. Colder-Hotter time limit per test 1 second memory limit per test 512 megabytes input standard inp ...

  8. ACM ICPC 2015 Moscow Subregional Russia, Moscow, Dolgoprudny, October, 18, 2015 A. Anagrams

    A. Anagrams time limit per test 1 second memory limit per test 512 megabytes input standard input ou ...

  9. The Preliminary Contest for ICPC Asia Shenyang 2019

    传送门 B. Dudu's maze 题意: 是什么鬼东西???我读题可以读半小时QAQ 给出一张无向图,一个人在里面收集糖果,每个点都有一个糖果,特殊点除外.当他第一次进入特殊点时,会随机往一条边走 ...

随机推荐

  1. P4论文粗读笔记(一)

    一 文章名称:SNAP: Stateful Network-Wide Abstractions for Packet Processing 数据包处理的带状态网络概念 发表时间:2016 期刊来源:S ...

  2. Java第一天——环境变量的配置与破解myeclipse2013

    一.jdk环境变量的配置 1.下载JDK并安装(官网JavaSE,64位(具体看电脑是多少位的))官网http://www.oracle.com/technetwork/java/javase/dow ...

  3. 注册表:DWORD

    百度百科 DWORD全称Double Word,是指注册表的键值,每个word为2个字节的长度,DWORD 双字即为4个字节,每个字节是8位,共32位. 在键值项窗口空白处单击右键,选择“新建”菜单项 ...

  4. # 团队UML设计

    团队信息 学号 姓名 博客链接 124 王彬(组长) 点击这里 206 赵畅 点击这里 215 胡展瑞 点击这里 320 李恒达 点击这里 131 佘岳昕 点击这里 431 王源 点击这里 206 陈 ...

  5. 一个C++bug引入的许多知识

    一.前言 假设我们有一个Car类,用了表示一个车,它有id,名字,牌照等许多东西,还有一个表示车的部件CarPart. 但出于某方面的考虑,我们不打算在产生car这个对象的时候,就生产出这个车,你可以 ...

  6. es6 ...展开运算符

    展开运算符,目前应用在数组上,对象展开运算符,将在es7 提案 1.两个对象连接返回新的对象   let a = {aa:'aa'} let b = {bb:'bb'} let c = {...a,. ...

  7. [BUAA2017软工]个人作业week-1

    一.快速看完整部教材,列出你仍然不懂的5到10个问题,发布在你的个人博客上. 1.在第二章个人技术和流程,邹欣老师提到了一张表格,主要解释了效能分析的一些名词,其中有这么几个概念: 调用者:函数Foo ...

  8. Java容器深入浅出之Map、HashMap、Hashtable及其它实现类

    在Java中,Set的底层事实上是基于Map实现的,Map内部封装了一个Entry内部接口,由实现类来封装key-value对,当value值均为null时,key的集合就形成了Set.因此,Map集 ...

  9. using关键字

    声明导入名称空间 处理实现了IDisposeable的对象,并在作用域末尾调用Dispose方法

  10. ubuntu在终端使用的常用命令

    1.ubuntu系统显示IP地址:ifconfig 2.ubuntu系统文件命令: cat:显示文本文件内容,全部文本.格式:cat filename more:显示文件内容,分页显示,回车逐行下翻. ...