ICPC 2015 Shenyang Online-E-EXCITED DATAbase
题目描述
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.
输入
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.
输出
样例输入
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的更多相关文章
- 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 ...
- 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 ...
- 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. ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- The Preliminary Contest for ICPC Asia Shenyang 2019
传送门 B. Dudu's maze 题意: 是什么鬼东西???我读题可以读半小时QAQ 给出一张无向图,一个人在里面收集糖果,每个点都有一个糖果,特殊点除外.当他第一次进入特殊点时,会随机往一条边走 ...
随机推荐
- P4论文粗读笔记(一)
一 文章名称:SNAP: Stateful Network-Wide Abstractions for Packet Processing 数据包处理的带状态网络概念 发表时间:2016 期刊来源:S ...
- Java第一天——环境变量的配置与破解myeclipse2013
一.jdk环境变量的配置 1.下载JDK并安装(官网JavaSE,64位(具体看电脑是多少位的))官网http://www.oracle.com/technetwork/java/javase/dow ...
- 注册表:DWORD
百度百科 DWORD全称Double Word,是指注册表的键值,每个word为2个字节的长度,DWORD 双字即为4个字节,每个字节是8位,共32位. 在键值项窗口空白处单击右键,选择“新建”菜单项 ...
- # 团队UML设计
团队信息 学号 姓名 博客链接 124 王彬(组长) 点击这里 206 赵畅 点击这里 215 胡展瑞 点击这里 320 李恒达 点击这里 131 佘岳昕 点击这里 431 王源 点击这里 206 陈 ...
- 一个C++bug引入的许多知识
一.前言 假设我们有一个Car类,用了表示一个车,它有id,名字,牌照等许多东西,还有一个表示车的部件CarPart. 但出于某方面的考虑,我们不打算在产生car这个对象的时候,就生产出这个车,你可以 ...
- es6 ...展开运算符
展开运算符,目前应用在数组上,对象展开运算符,将在es7 提案 1.两个对象连接返回新的对象 let a = {aa:'aa'} let b = {bb:'bb'} let c = {...a,. ...
- [BUAA2017软工]个人作业week-1
一.快速看完整部教材,列出你仍然不懂的5到10个问题,发布在你的个人博客上. 1.在第二章个人技术和流程,邹欣老师提到了一张表格,主要解释了效能分析的一些名词,其中有这么几个概念: 调用者:函数Foo ...
- Java容器深入浅出之Map、HashMap、Hashtable及其它实现类
在Java中,Set的底层事实上是基于Map实现的,Map内部封装了一个Entry内部接口,由实现类来封装key-value对,当value值均为null时,key的集合就形成了Set.因此,Map集 ...
- using关键字
声明导入名称空间 处理实现了IDisposeable的对象,并在作用域末尾调用Dispose方法
- ubuntu在终端使用的常用命令
1.ubuntu系统显示IP地址:ifconfig 2.ubuntu系统文件命令: cat:显示文本文件内容,全部文本.格式:cat filename more:显示文件内容,分页显示,回车逐行下翻. ...