CF390-E. Inna and Large Sweet Matrix(区间更新+区间查询)
题意很好理解,不说了
题解就是每次把值压缩成一维,比如x上,这样就可以求出任意宽度的整个竖条的和。

如这张图,求的是s5-(s1+s3+s7+s9)
因为可以求出一整竖条和一整横条,我们可以求出是s2+s5+s8 也可以求出s4+s5+s6 当然也很容易求出总面积S
那么S-(s2+s5+s8)-(s4+s5+s6) = s1+s3+s7+s9-s5
对,答案已经出来了,很简单。
以后看到这种求解公式十分奇怪的题,就要算一算是不是能构造出很简单的公式。
注意这题用cin cout 会超时!因为codeforce是单样例,所以都忘了这点,t了好多次……T^T
区间更新+区间查询,线段树+lazy操作 (514ms
#include <stdio.h> typedef long long ll; const int N = ;
ll tx[N<<], ty[N<<], fx[N<<], fy[N<<];
int yl, yr, yv;
#define lson (o<<1)
#define rson ((o<<1)+1) void pushdown(ll tr[], ll fg[], int o, int l, int r)
{
if (fg[o]) {
fg[lson] += fg[o];
fg[rson] += fg[o];
int m = (l+r) >> ;
tr[lson] += fg[o] * (m-l+);
tr[rson] += fg[o] * (r-m);
fg[o] = ;
}
} void add(ll tr[], ll fg[], int o, int l, int r)
{
if (l == r) {
tr[o] += yv;
return ;
}
if (yl <= l && yr >= r) {
tr[o] += (ll)yv * (r-l+);
fg[o] += yv;
return ;
}
pushdown(tr, fg, o, l, r);
int m = (l+r) >> ;
if (yl <= m) add(tr, fg, lson, l, m);
if (yr > m) add(tr, fg, rson, m+, r);
tr[o] = tr[lson] + tr[rson];
} ll query(ll tr[], ll fg[], int o, int l, int r)
{
if (l >= yl && r <= yr) {
return tr[o];
}
pushdown(tr, fg, o, l, r);
int m = (l+r) >> ;
ll ans = ;
if (m >= yl) ans += query(tr, fg, o<<, l, m);
if (m < yr) ans += query(tr, fg, (o<<)+, m+, r);
return ans;
} int main()
{ int n, m, w;
scanf("%d%d%d", &n, &m, &w);
int op;
int x1, x2, y1, y2;
ll v;
ll tot, ans;
while (w--) {
scanf("%d%d%d%d%d", &op, &x1, &y1, &x2, &y2);
if (op) {
yl = , yr = n;
tot = query(tx, fx, , , n);
ans = ;
yl = x1, yr = x2;
ans += query(tx, fx, , , n);
yl = y1, yr = y2;
ans += query(ty, fy, , , m);
printf("%lld\n", ans-tot);
} else {
scanf("%lld", &v);
yl = x1, yr = x2, yv = v*(y2-y1+);
add(tx, fx, , , n);
yl = y1, yr = y2, yv = v*(x2-x1+);
add(ty, fy, , , m);
}
}
return ;
}
顺便学习了一下树状数组的区间操作(202ms 时间空间都优于线段树
#include <stdio.h>
typedef long long ll;
const int MAXN = ;
int lowbit(int x) { return x&-x; }
struct tree_array {
struct tree_array_single {
int N;
ll arr[MAXN];
void add(int x, ll v) { while(x <= N) arr[x] += v, x += lowbit(x); }
ll sum(int x) { ll sum = ; while(x) sum+=arr[x], x-=lowbit(x); return sum; }
} T1, T2;
void add(int x, ll v) { T1.add(x, v); T2.add(x, x*v); }
void update(int L, int R, ll v) { add(L, v); add(R+, -v); }
ll sum(int x) { return (x+)*T1.sum(x)-T2.sum(x); }
ll query(int L,int R) { return sum(R)-sum(L-); }
} tx, ty;
int main()
{
//freopen("in.txt", "r", stdin);
int n, m, w;
scanf("%d%d%d", &n, &m, &w);
int op;
int x1, x2, y1, y2;
ll v;
tx.T1.N = tx.T2.N = n;
ty.T1.N = ty.T2.N = m;
ll tot = ;
while (w--) {
scanf("%d%d%d%d%d", &op, &x1, &y1, &x2, &y2);
if (op) {
ll ans = tx.query(x1, x2) + ty.query(y1, y2);
printf("%lld\n", ans-tot);
} else {
scanf("%lld", &v);
tot += (y2-y1+)*(x2-x1+)*v;
tx.update(x1, x2, v*(y2-y1+));
ty.update(y1, y2, v*(x2-x1+));
}
}
return ;
}
CF390-E. Inna and Large Sweet Matrix(区间更新+区间查询)的更多相关文章
- codeforces 390E Inna and Large Sweet Matrix
本题的主要算法就是区间更新和区间求和: 可以用线段树和树状数组来做: 感觉线段树写的太麻烦了,看到官方题解上说可以用树状数组做,觉得很神奇,以前用过的树状数组都是单点维护,区间求和的: 其实树状数组还 ...
- CodeForces 390E Inna and Large Sweet Matrix(树状数组改段求段)
树状数组仅仅能实现线段树区间改动和区间查询的功能,能够取代不须要lazy tag的线段树.且代码量和常数较小 首先定义一个数组 int c[N]; 并清空 memset(c, 0, sizeof c) ...
- Codeforces 390E Inna and Large Sweet Matrix 树状数组改段求段
题目链接:点击打开链接 题意:给定n*m的二维平面 w个操作 int mp[n][m] = { 0 }; 1.0 (x1,y1) (x2,y2) value for i : x1 to x2 for ...
- hdu1698线段树的区间更新区间查询
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化)
POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化) 题意分析 贴海报,新的海报能覆盖在旧的海报上面,最后贴完了,求问能看见几张海报. 最多有10000张海报,海报 ...
- POJ.3468 A Simple Problem with Integers(线段树 区间更新 区间查询)
POJ.3468 A Simple Problem with Integers(线段树 区间更新 区间查询) 题意分析 注意一下懒惰标记,数据部分和更新时的数字都要是long long ,别的没什么大 ...
- codevs 1690 开关灯 线段树区间更新 区间查询Lazy
题目描述 Description YYX家门前的街上有N(2<=N<=100000)盏路灯,在晚上六点之前,这些路灯全是关着的,六点之后,会有M(2<=m<=100000)个人 ...
- A Simple Problem with Integers 线段树 区间更新 区间查询
Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 115624 Accepted: 35897 Case Time Lim ...
- POJ 3468 A Simple Problem with Integers(线段树区间更新区间查询)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 92632 ...
随机推荐
- 几款开源的图形界面库(GUI Libraries)
SmartWin++ 遵循BSD许可协议的C++ GUI库,建立在Windows API之上,但仍可以通过使用WineLib在Linux/xNix上使用.也支持Pocket PC和基于Windows ...
- http://wenku.baidu.com/link?url=UGoPtZviipHzi5SDIlGx6hPFWAHTPLFXcZ7ieD15JMd81DEHqjehvphVMhqELmOK4qXR74dTT9nW8VBoApBc7Kfb1ZWrNF_i24fY1YRHVki
http://wenku.baidu.com/link?url=UGoPtZviipHzi5SDIlGx6hPFWAHTPLFXcZ7ieD15JMd81DEHqjehvphVMhqELmOK4qXR ...
- H264码流解析及NALU
ffmpeg 从mp4上提取H264的nalu http://blog.csdn.net/gavinr/article/details/7183499 639 /* bitstream fil ...
- QT UAC问题汇总贴
http://www.qtcn.org/bbs/read-htm-tid-47983.html http://www.cnblogs.com/bombless/archive/2010/12/29/h ...
- SQL 两张结构一样的表合并查询 .
select * from table1 union all select * from table2 union all 是所有的都显示出来: select * from table1 union ...
- 理解TCP/IP协议
TCP/IP协议是Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议. 单从TCP/IP协议这个名称看,好多人误 ...
- 如何提高Web服务端并发效率的异步编程技术
作为一名web工程师都希望自己做的web应用能被越来越多的人使用,如果我们所做的web应用随着用户的增多而宕机了,那么越来越多的人就会变得越来越少了,为了让我们的web应用能有更多人使用,我们就得提升 ...
- Ubuntu 12.04上编译Vim7.4的时候遇到“no terminal library found”问题
错误如下: no terminal library foundchecking for tgetent()... configure: error: NOT FOUND! You need ...
- java学习面向对象之匿名内部类
之前我们提到“匿名”这个字眼的时候,是在学习new对象的时候,创建匿名对象的时候用到的,之所以说是匿名,是因为直接创建对象,而没有把这个对象赋值给某个值,才称之为匿名. 匿名对象回顾: class N ...
- poj 2996 Help Me with the Game(模拟)
题目:http://poj.org/problem?id=2996 题意:给出 棋盘 情况 输出 白棋 和 黑棋在 棋盘上的 白棋为大写字母 黑棋为小写字母 棋盘 左下点为原点(1,a) 输出 是 按 ...