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 ...
随机推荐
- 作为 .Net 攻城师,所必需掌握的 .Net Profiling 技术
众所周知,性能问题是所有实用应用在迭代过程中必然要面对的问题.对于此类问题,简单地投入更多硬件资源的做法可能会取得一定效果.但总的来看,此类做法的边际成本是不断上升的.换言之,随着性能需求的上涨,要换 ...
- vc2008程序发布指南
vc2008程序发布指南 2008-05-03 17:46 vc2008开发的程序的发布方式可以有5种方式: 1. 采用静态链接到crt和MFC. 只要你拥有组成程序的所有源代码,你就可以采用这种方式 ...
- foreman1.3安装
一.环境: centos 6.3 64bit 二.安装yum源: rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release ...
- dom解析器机制 web基本概念 tomcat
0 作业[cn.itcast.xml.sax.Demo2] 1)在SAX解析器中,一定要知道每方法何时执行,及SAX解析器会传入的参数含义 1 理解dom解析器机制 1)dom解析和dom4j原理 ...
- Git教程(3)命令行使用git简单示例
基础 Git系统下的的文件有3种状态: 已修改(modified):已修改表示修改了文件,但还没保存到数据库中. 已暂存(staged) : 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下 ...
- 学习Android之内部类
java语言允许在类中再定义类,这种在其它类内部定义的类就叫内部类.内部类又分为:常规内部类.局部内部类.匿名内部类和静态嵌套类四种.我们内部类的知识在Android手机开发中经常用到. 一.常规内部 ...
- [LOJ 1027] Dangerous Maze
A - A Dangerous Maze Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu ...
- window.location.search作用
window.location.search.substr(1).split("&") 这里面的相关属性和时间还有参数能具体说明一下吗?window.location wi ...
- SharePoint 2010 获取当前用户的权限
转:http://blog.csdn.net/sygwin_net/article/details/6790500 操作环境:SharePoint 2010 关于SharePoint 的权限架构,具体 ...
- [JS前端开发] js/jquery控制页面动态加载数据 滑动滚动条自动加载事件
页面滚动动态加载数据,页面下拉自动加载内容 相信很多人都见过瀑布流图片布局,那些图片是动态加载出来的,效果很好,对服务器的压力相对来说也小了很多 有手机的相信都见过这样的效果:进入qq空间,向下拉动空 ...