博客
关于我
2020.2.16普及C组 方格纸(square【纪中】【差分】【前缀和】
阅读量:351 次
发布时间:2019-03-04

本文共 1372 字,大约阅读时间需要 4 分钟。

正解:前缀和+二维差分

普及一波 差分:

差分其实就是前缀和的逆运算;

给你一个数组 a [ 5 ] = 1 , 2 , 3 , 4 , 5 a[5]={1,2,3, 4,5} a[5]=12345;差分数组 b [ 5 ] = 1 , 1 , 1 , 1 , 1 b[5]={1,1,1,1,1} b[5]=11111;显然差分数组 b [ i ] = a [ i ] − a [ i − 1 ] b[i]=a[i]-a[i-1] b[i]=a[i]a[i1];

那么我们可以推出, a [ 1 ] = b [ 1 ] , a [ 2 ] = b [ 1 ] + b [ 2 ] … b [ i ] a[1]=b[1],a[2]=b[1]+b[2]…b[i] a[1]=b[1],a[2]=b[1]+b[2]b[i]的前缀和等于 a [ i ] a[i] a[i],这也是为什么说差分就是前缀和的逆运算;

知道了这个,差分还有个运用;就是在区间 [ l , r ] [l,r] [l,r]进行加数操作,然后问你某个位置在操作完后的值是多少;


二维差分和一维差分本质上是一样的

就是把 a a a 数组 x 1 , y 1 , x 2 , y 2 x1,y1,x2,y2 x1,y1,x2,y2的四个角赋值为 1 1 1 − 1 -1 1

代码:

a[x1][y1]++;a[x2+1][y2+1]++;a[x1][y2+1]--;a[x2+1][y1]--;

这样就能做出来啦!

#include
#include
#include
#include
using namespace std;long long f[3500][3500],a[3500][3500]; long long n,m,x,y,x1,y1,x2,y2;int main(){ freopen("square.in","r",stdin); freopen("square.out","w",stdout); scanf("%lld",&n); for(int i=1; i<=n; i++) { scanf("%lld %lld %lld %lld",&x1,&y1,&x2,&y2); a[x1][y1]++; //差分 a[x2+1][y2+1]++; a[x1][y2+1]--; a[x2+1][y1]--; } for(int i=1; i<=3000; i++) for(int j=1; j<=3000; j++) f[i][j]=f[i-1][j]+f[i][j-1]-f[i-1][j-1]+a[i][j]; //前缀和 cin>>m; for(int i=1; i<=m; i++) { scanf("%lld %lld",&x,&y); printf("%lld\n",f[x][y]); } return 0;}

转载地址:http://bjle.baihongyu.com/

你可能感兴趣的文章
MySQL函数简介
查看>>
mysql函数遍历json数组
查看>>
MySQL函数(转发)
查看>>
mysql分区表
查看>>
MySQL分层架构与运行机制详解
查看>>
mysql分库分表中间件简书_MySQL分库分表
查看>>
MySQL分库分表会带来哪些问题?分库分表问题
查看>>
MySQL分组函数
查看>>
MySQL分组查询
查看>>
Mysql分表后同结构不同名称表之间复制数据以及Update语句只更新日期加减不更改时间
查看>>
mySql分页Iimit优化
查看>>
mysql列转行函数是什么
查看>>
mysql创建函数报错_mysql在创建存储函数时报错
查看>>
mysql加强(4)~多表查询:笛卡尔积、消除笛卡尔积操作(等值、非等值连接),内连接(隐式连接、显示连接)、外连接、自连接
查看>>
mysql加强(5)~DML 增删改操作和 DQL 查询操作
查看>>
mysql加强(6)~子查询简单介绍、子查询分类
查看>>
MySqL双机热备份(二)--MysqL主-主复制实现
查看>>
mysql启动以后会自动关闭_驾照虽然是C1,一直是开自动挡的车,会不会以后就不会开手动了?...
查看>>
MySQL启动失败:Can't start server: Bind on TCP/IP port
查看>>
mysql启动报错The server quit without updating PID file几种解决办法
查看>>