题目描述

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. jquery ajax 跨域问题

    前言:关于跨域CORS 1.没有跨域时,ajax默认是带cookie的 2.跨域时,两种解决方案: 1)服务器端在filter中配置 详情:http://blog.csdn.net/wzl002/ar ...

  2. 个人阅读&个人总结

    个人阅读作业+总结 助教推荐的那些文章都是软件工程上的经典文章,阅读后感受到软件工程本身的深度,之前学习的软件工程都只是皮毛之中的皮毛而已.随着软件规模的越来越庞大,软件工程已经成为了软件开发中的必备 ...

  3. PAT 甲级 1143 Lowest Common Ancestor

    https://pintia.cn/problem-sets/994805342720868352/problems/994805343727501312 The lowest common ance ...

  4. Sql Server自增ID与序号的使用

    SQL 自增ID alter table a add id int identity(1,1) not null 这里为 a 表增加一个 id 字段,其中identity(1,1)代表自增,第一个1代 ...

  5. Centos7 FPM 安装mysql8

    参考http://tn.51cto.com/article/647 http://www.jb51.net/article/138787.htm 转载: 卸载centos自带的mariadb rpm ...

  6. [转帖]从HTTP/0.9到HTTP/2:一文读懂HTTP协议的历史演变和设计思路

    从HTTP/0.9到HTTP/2:一文读懂HTTP协议的历史演变和设计思路   http://www.52im.net/thread-1709-1-2.html     本文原作者阮一峰,作者博客:r ...

  7. ACM数论之旅2---快速幂,快速求a^b((ノ`Д´)ノ做人就要坚持不懈)

    a的b次方怎么求 pow(a, b)是数学头文件math.h里面有的函数 可是它返回值是double类型,数据有精度误差 那就自己写for循环咯 LL pow(LL a, LL b){//a的b次方 ...

  8. bzoj1036 [ZJOI2008]树的统计Count(树链剖分)

    Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. Q ...

  9. final,finally和 finalize的区别

    中等区别: 虽然这三个单词在Java中都存在,但是并没有太多关联:  final:java中的关键字,修饰符. 1.如果一个类被声明为final,就意味着它不能再派生出新的子类,不能作为父类被继承.因 ...

  10. JVM调优及参数设置

    (1)参数 -Xms:初始堆大小 -Xmx :最大堆大小 此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存 -Xmn :年轻代大小 整个堆大小=年轻代大小 + 年老代大小 + 持 ...