2019ICPC南京网络赛A The beautiful values of the palace
题意:蛇形填数超大版本,需要求出一些给定坐标的值的数位和,然后q次询问,一个矩形区域内值的和是多少
解题思路:二维偏序前缀和的经典题
二维偏序:求(x,y)左下角点的个数,思路是对x,y升序排序,用树状数组维护每个纵坐标y已经出现的次数,这样我们动态地将点的纵坐标y加入树状数组,然后求出比y小的有多少个(树状数组求和)即可知道当前点的二维偏序值了
要求前缀和,我们只需把维护点的个数改为点权即可。
这个题,首先按照蛇形填数的规律求出点权,然后就是求二维偏序前缀和了,有了前缀和我们将可以快速得到子矩阵区域的和了(联想矩阵O(1)查询子矩阵的方法),首先我们要将询问离线,然后把涉及到的点全部存入数组后排序,存储的时候可以采取一些小技巧标记出带权值的点和要求的矩形边界的点,当处理到带权点时,我们加入树桩数组,处理到矩形边界点时,查询一次前缀和,然后计入ans[id],id为询问的时间点,这个题的纵坐标y在1e6以内,因此无需离散化,直接开1e6的树状数组是最佳选择,题目具体细节见代码与注释
AC(补题)代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+;
typedef long long ll;
struct node
{
int x,y,val,id;
friend bool operator<(const node &a,const node &b)
{
if(a.x!=b.x)return a.x<b.x;
if(a.y!=b.y)return a.y<b.y;
return a.id<b.id;//保证先加入要求和的点值,再加入矩形的边界点,边界点有询问顺序的编号而带值点id=0
}
}p[maxn];
int n;
int getval(int x,int y)
{
x=n+-x;
y=n+-y;
ll ans;
ll mi=min(x,min(y,min(n-x+,n-y+)));
if(x<=y) ans=1ll*mi*(1ll**(n-)-*mi)+1ll**mi-*n-+x+y;
else ans=1ll*mi*(*n-*mi)+1ll**mi+-x-y;//模拟过程
int tot=;
while (ans)
{
tot+=ans%;
ans/=;
}
return tot;
}
int tree[maxn];//1e6无需离散化
inline int lowbit(int x){ return x&-x;}
void add(int pos,int val)
{
while (pos<=n)
{
tree[pos]+=val;
pos+=lowbit(pos);
}
}
ll query(int pos)
{
ll res=;
while (pos>)
{
res+=tree[pos];
pos-=lowbit(pos);
}
return res;
}
ll ans[maxn];
int main()
{
ios::sync_with_stdio(false);
cin.tie();
cout.tie();
int T,m,q,x1,y1,x2,y2;
cin>>T;
while (T--)
{
cin>>n>>m>>q;
memset(tree,, sizeof(tree));
for(int i=;i<=m;i++)
{
cin>>p[i].x>>p[i].y;
p[i].val=getval(p[i].x,p[i].y);
p[i].id=;
}
int len=m;
for(int i=;i<=q;i++)
{
ans[i]=;
cin>>x1>>y1>>x2>>y2;
p[++len].x=x1-;p[len].y=y1-;p[len].id=i;p[len].val=;
p[++len].x=x2;p[len].y=y2;p[len].id=i;p[len].val=;
p[++len].x=x1-;p[len].y=y2;p[len].id=i;p[len].val=-;
p[++len].x=x2;p[len].y=y1-;p[len].id=i;p[len].val=-;
}
sort(p+,p+len+); for(int i=;i<=len;i++)
{
if(p[i].id)//如果是矩形边界点则计算答案
{
ans[p[i].id]+=1ll*query(p[i].y)*p[i].val;//矩形边界点val的意义是标记ans[id]是加上当前前缀和还是减去当前前缀和
}
else add(p[i].y,p[i].val);
}
for(int i=;i<=q;i++)cout<<ans[i]<<'\n';
}
return ;
}
2019ICPC南京网络赛A The beautiful values of the palace的更多相关文章
- 2019icpc南京网络赛 A The beautiful values of the palace(离线+树状数组)
题意: (假设所有的点对应的值已经求出)给你一个1e6*1e6的矩阵,有m<=1e5个点有值,其余都为0 q<=1e5个询问,求子矩阵的权值和 思路: 根据二维差分,对于询问左下角(x1, ...
- 2019ICPC南京网络赛A题 The beautiful values of the palace(三维偏序)
2019ICPC南京网络赛A题 The beautiful values of the palace https://nanti.jisuanke.com/t/41298 Here is a squa ...
- 2019icpc南京网络赛_F_Greedy Sequence
题意 题意不明,队友告诉我对于每个\(i\),所在下标\(p[i]\),在\([p[i]-k,p[i]+k]\)中找到小于\(i\)的最大数\(x\),然后\(ans[i]=ans[x]+1\)即可. ...
- 2019ICPC南京网络赛B super_log——扩展欧拉定理
题目 设函数 $$log_a*(x) = \begin{cases}-1, & \text{ if } x < 1 \\ 1+log_a*(log_ax) & \text{ if ...
- 2019icpc南京网络赛
B. super_log(扩展欧拉函数) 题意:求aa...(b个a)模M的值. 思路:递归用欧拉函数求解,我们知道欧拉降幂公式: 如果讨论b和φ(p)的关系会很麻烦,网上证明了一种精妙的方法,只需重 ...
- 2019icpc南京网络赛 A 主席树
题意 给一个\(n\times n\)的螺旋矩阵,给出其中的\(m\)个点的值分别为各个点上数字的数位之和,给出\(q\)个询问,每次询问从\((x1,y1)\)到\((x2,y2)\)的子矩阵的和. ...
- 2019icpc南京网络赛 F 主席树
题意 给一个\(n\)的全排列数组\(a\),求一个递推数组每一项的值:\(ans[i]=ans[j]+1\),\(j\)为\(a[pos[i]-k]到a[pos[i]+k],(pos[i]为i在数组 ...
- 2019ICPC南京网络赛总结
这次是在学校打的,总体不算好,过两题校排200多..很惨. 开场一段时间没人过题,但是很多人交I, 我也就再看,看着看着发现不可做,这时候转F,花了半天读懂题意的时候想到主席树查找.但是主席树这种查找 ...
- 2019ICPC南京网络赛F Greedy Sequence
题意:对于1<=i<=n每次找到(pos[i]-k,pos[i]+k)内不大于i的最大那个数,ans[i]=ans[mx]+1,若ans[mx]未知则递归处理ans[mx] PS:这个题比 ...
随机推荐
- python学习笔记:接口开发——flask Demo实例
举例1,返回当前时间接口 ''' 初始化:所有的Flask都必须创建程序实例, web服务器使用wsgi协议,把客户端所有的请求都转发给这个程序实例 程序实例是Flask的对象,一般情况下用如下方法实 ...
- Django框架(十七)—— 中间件、CSRF跨站请求伪造
目录 中间件 一.什么是中间件 二.中间件的作用 三.中间件执行顺序 四.自定义中间件 1.导包 2.定义类,继承MiddlewareMixin 3.在视图函数中定义一个函数 4.在settings的 ...
- Java方法覆盖教程
重新定义来自超类(父类)继承的类中的实例方法称为方法覆盖. 示例 现在来看看,类A和类B的以下声明,覆盖了 print() 方法 : 1 2 3 4 5 6 7 8 9 10 11 public cl ...
- Android组件内核之间组件间通信方案(四)下篇
阿里P7Android高级架构进阶视频免费学习请点击:https://space.bilibili.com/474380680本篇文章将继续从以下两个内容来介绍通信方案: [ViewModel 与 V ...
- teb教程7
融合自定义的障碍物 简介:本部分讲解怎样考虑其他节点发布的多边形的障碍物. 1.在一些应用当中,可能不想依赖于代价地图或者想添加其他的除了点状的障碍物.你可以发送你自己的障碍物列表到teb_local ...
- .net Mvc Dapper 方法封装
首先需要添加 NuGet 包 Dapper 以及引用Configuration <connectionStrings> <add name="SqlSrc&quo ...
- 【JS学习】慕课网9-14 删除结点操作的问题
试一试,定义clearText()函数,完成节点内容的删除. 1. 删除该节点的内容,先要获取子节点. 2. 然后使用循环遍历每个子节点. 3. 使用removeChild()删除节点. 特别要注意的 ...
- JavaWeb开发之一《Tomcat服务器的部署、安装及应用》
搬以前写的博客[2014-12-10 21:43] 这几天做了一个Java的程序,然后先把他搭载到Web上,于是学习了基于Tomcat服务器的web开发,这里回顾一下Tomcat服务器的搭建过程. 1 ...
- nodejs模块——目录操作
1.创建目录 使用fs.mkdir(path,[mode],callback)创建目录,path是需要创建的目录,[mode]是目录的权限(默认是0777),callback是回调函数. demo:m ...
- Spring data JPA 快速入门
1需求 向客户中插入一条数据 如果使用Jpa框架可以不用先建表 可以使用框架生成表 2 实现步骤 a 创建工程 使用maven管理工程 <properties> ...