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 给出一张无向图,一个人在里面收集糖果,每个点都有一个糖果,特殊点除外.当他第一次进入特殊点时,会随机往一条边走 ...
随机推荐
- 使用myeclipse2014整合ss2h
使用myeclipse2014整合ssh 新建一个webproject 创建过程中注意选择生成web.Xml 先添加struts2的能力 选择都添加过滤器的选项 Core dojo Dwr spr ...
- window 窗口编辑
package com.chuangkohua; import java.awt.FileDialog; import java.awt.FlowLayout; import java.awt.Fra ...
- DPDK网卡绑定
进入DPDK目录编译环境 # cd ~/DPDK/usertools # ./dpdk-setup.py 注意,setup脚本需要在root权限下运行,并且每次重启电脑,都需要重新插入模块和绑定网卡. ...
- 使用 java 实现一个简单的 markdown 语法解析器
1. 什么是 markdown Markdown 是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用.看到这里请不要被「标记」.「语言」所迷惑,Markdown 的 ...
- syntax error:unexpected end of file
将window上编辑的xxy1.sh脚本上传到linux上,并执行的时候提示 xxy1.sh: line 17: syntax error: unexpected end of file 但是通过ca ...
- 再看select语句
select语句是整个sql中输出的最后一条语句,这条语句是在最后输出的结果集合上做计算, 这些计算都包括啥东西呢?对每个结果集合做插值计算,在做完group by和where子句之后,那么就是一个一 ...
- C#实体对象序列化成Json,并让字段的首字母小写
引言:最近在工作中遇到与某些API对接的post的数据需要将对象的字段首字母小写.解决办法有两种:第一种:使用对象的字段属性设置JsonProperty来实现(不推荐,因为需要手动的修改每个字段的属性 ...
- SDOI2017遗忘的集合
题面链接 咕咕咕 题外话 为了这道题我敲了\(MTT\).多项式求逆.多项式\(ln\)等模板,搞了将近一天. sol 最近懒得写题解啊,随便搞搞吧. 看到这个就是生成函数套上去. \[F(x)=\p ...
- BZOJ 2460: [BeiJing2011]元素
2460: [BeiJing2011]元素 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 878 Solved: 470[Submit][Statu ...
- 利用java实现可远程执行linux命令的小工具
在linux的脚本中,如果不对机器做其他的处理,不能实现在linux的机器上执行命令.为了解决这个问题,写了个小工具来解决这个问题. 后面的代码是利用java实现的可远程执行linux命令的小工具,代 ...