>传送门<

前言


这题比赛的时候觉得能做,硬是怼了一个半小时,最后还是放弃了。开始想到用二维前缀和,结果$n\leq 10^{6}$时间和空间上都爆了,没有办法。赛后看题解用树状数组,一看不就是二维树状数组么,结果时间是够了,然而$sum[maxn][maxn]$空间上就爆了。于是开始研究别人的代码,终于看懂了,就觉得很神奇,这个思想很妙,后来再看别的博客,原来是二维偏序(就是利用树状数组/$CDQ$分治求$M$个点中每个点横纵坐标均小于这个点的权值和)

题意


有一个$n\ast n(n\leq 10^{6})$的螺旋矩阵,图像见题目。然后有$m$个宫殿,每一个宫殿坐落在一个格子里,该宫殿的美丽值为所在格子的各个数位的和。比如一个宫殿位于值为$123$的格子,那么他的美丽值就是$1+2+3=6$。然后给你$q$个询问,每个询问包含一个矩形的左下角和右上角,要求输出在这个范围内的宫殿的美丽值的和。

分析


首先这题的一个思维点就在于,如何通过给你的坐标$(x,y)$快速的求出在螺旋矩阵中的相应数字。

你可以通过分类讨论,或者找规律,推公式找出结论,要注意正是因为$n$是奇数,才有这么强的规律性。

$x = x-n/2-1, y = y-n/2-1;$
$t = max(abs(x), abs(y));$ $//确定该点在第几圈螺旋$
$if(x>=y)$ $ans = n*n-4*t*t-2*t-x-y;$ $//在向右与向上的路线上$
$else$ $ans = n*n-4*t*t+2*t+x+y;$ $//在向左与向下的路线上$

对于这个题目而言,问题就转变成了如何求任意子矩阵的和。

假设我们用$sum[i][j]$表示以$(1,1)$为左下角,$(i,j)$为右上角所求得的矩阵和。则对于查询$x1,y1,x2,y2$就有:

      $ans = sum[x2][y2]-sum[x2][y2-1]-sum[x1-1][y1]+sum[x1-1][y1-1]$

我们当然可以用二维树状数组求$sum[i][j]$,但是这里的$n$达到了$10^{6}$的数量级,空间上会爆掉。所以采用另外一种方法,就是二维偏序。

就这题来说,对于某次查询的子矩阵中点$i$,都可能有另外一些点的$x,y$坐标均小于等于点$i$的$x,y$坐标,这些点的权值和即为点$i$的二维偏序值.。

我们的做法是按照第一维排序,再用树状数组处理第二维即可。

为什么要按照第一维排序:对于每个点,显然只有它前面的点($x$坐标小于等于该点)的权值有可能(换句话说,$x$坐标大于该点的那些点是绝对不可能被计入该点的二维偏序值的)被计入该点的二维偏序值.

当然了,仅仅按照第一维排序是不能解决这一问题的,因为不能保证每个点前面的点的$y$坐标都小于等于这个点。

为什么要使用树状数组:在二维偏序中,通过对每个点关于$x$坐标排序,我们得到了一个$x$轴坐标单调递增的点的序列。接下来要解决的问题,是怎么关于点$i$获取$y$坐标小于点$i$的点的数量,这时树状数组就起到作用了

由于只有$x$坐标小于等于点$i$的点集需要被考虑(原因前面已经提到过,即只有$x$坐标小于等于点$i$的$x$坐标的点集有可能被计入点i的二维偏序值),因此我们把需要查询的$x$的值进行排序,按顺序进行查询。对于某次查询$i$,只有$x$坐标小于$i$的宫殿才能被加入树状数组,之后再用树状数组找出其中$y$坐标小于点$i$的点求和就好了。

这里有一些细节处理,我们用$id$记录是第几次查询,用$flag$标记每次询问求前缀和是加还是减。

Code(这里第一维按y排序)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6+;
int T, n, m, p, tot;
ll c[maxn*], ans[maxn];
struct node {
int x, y, id, flag;
node(int _x = , int _y = , int _id = , int _flag = ) : x(_x), y(_y), id(_id), flag(_flag) {};
bool operator<(const node &b) const {
return y < b.y;
}
}q[maxn*];
struct palace {
int x, y, val;
palace(int _x = , int _y = , int _val = ) : x(_x), y(_y), val(_val) {};
bool operator<(const palace &b) const {
return y < b.y;
}
}a[maxn]; int lowbit(int x){
return x&-x;
}
void add(int x,ll val){
if (x==) return;
while (x<maxn){
c[x]+=val;
x+=lowbit(x);
}
}
ll query(int x) {
ll ret = ;
while (x) {
ret += c[x];
x -= lowbit(x);
}
return ret;
} void solve() {
int pos = ;
for (int i = ; i <= tot; i++) {
while (pos <= m && a[pos].y <= q[i].y) {
add(a[pos].x, a[pos].val);
pos++;
}
ans[q[i].id] += query(q[i].x) * q[i].flag;
}
} ll sum(ll x) {
ll ret = ;
while (x) {
ret += x % ;
x /= ;
}
return ret;
} ll get(ll x, ll y, ll n){
x = x-n/-, y = y-n/-;
ll t = max(abs(x), abs(y));
ll ans;
if(x>=y) ans = n*n-*t*t-*t-x-y;
else ans = n*n-*t*t+*t+x+y;
return ans;
}
int main()
{
scanf("%d", &T);
while (T--) {
scanf("%d%d%d", &n, &m, &p);
for (int i = ; i <= * n; i++) c[i] = ;
for (int i = ; i <= p; i++) ans[i] = ;
for (int i = , x, y; i <= m; i++) {
scanf("%d%d", &x, &y);
a[i] = palace(x, y, sum(get(x, y, n)));
}
sort(a + , a + m + ); tot = ;
for (int i = , x1, x2, y1, y2; i <= p; i++) {
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
q[++tot] = node(x1 - , y1 - , i, );
q[++tot] = node(x1 - , y2, i, -);
q[++tot] = node(x2, y1 - , i, -);
q[++tot] = node(x2, y2, i, );
}
sort(q + , q + tot + );
solve();
for (int i = ; i <= p; i++) printf("%lld\n", ans[i]);
}
return ;
}

 值得注意的是,一定好好看题!!!宫殿的美丽值是其在螺旋矩阵的对于数字的各位和,就比如25,美丽值应该是2+5=7,而不是25,害得我当时赛后补题一直WA。

[The Preliminary Contest for ICPC Asia Nanjing 2019] A-The beautiful values of the palace(二维偏序+思维)的更多相关文章

  1. The Preliminary Contest for ICPC Asia Nanjing 2019 A The beautiful values of the palace(树状数组+思维)

    Here is a square matrix of n * nn∗n, each lattice has its value (nn must be odd), and the center val ...

  2. The Preliminary Contest for ICPC Asia Nanjing 2019/2019南京网络赛——题解

    (施工中……已更新DF) 比赛传送门:https://www.jisuanke.com/contest/3004 D. Robots(期望dp) 题意 给一个DAG,保证入度为$0$的点只有$1$,出 ...

  3. 计蒜客 The Preliminary Contest for ICPC Asia Nanjing 2019

    F    Greedy Sequence You're given a permutation aa of length nn (1 \le n \le 10^51≤n≤105). For each  ...

  4. The Preliminary Contest for ICPC Asia Nanjing 2019

    传送门 A. The beautiful values of the palace 题意: 给出一个\(n*n\)的矩阵,并满足\(n\)为奇数,矩阵中的数从右上角开始往下,类似于蛇形填数那样来填充. ...

  5. The Preliminary Contest for ICPC Asia Nanjing 2019 H. Holy Grail

    题目链接:https://nanti.jisuanke.com/t/41305 题目说的很明白...只需要反向跑spfa然后输入-dis,然后添-dis的一条边就好了... #include < ...

  6. The Preliminary Contest for ICPC Asia Nanjing 2019 B. super_log (广义欧拉降幂)

    In Complexity theory, some functions are nearly O(1)O(1), but it is greater then O(1)O(1). For examp ...

  7. 树状数组+二维前缀和(A.The beautiful values of the palace)--The Preliminary Contest for ICPC Asia Nanjing 2019

    题意: 给你螺旋型的矩阵,告诉你那几个点有值,问你某一个矩阵区间的和是多少. 思路: 以后记住:二维前缀和sort+树状数组就行了!!!. #define IOS ios_base::sync_wit ...

  8. B.super_log(The Preliminary Contest for ICPC Asia Nanjing 2019)

    同:https://www.cnblogs.com/--HPY-7m/p/11444923.html #define IOS ios_base::sync_with_stdio(0); cin.tie ...

  9. H.Holy Grail ( floyd )(The Preliminary Contest for ICPC Asia Nanjing 2019)

    题意: 给出一个有向图,再给出6条原来不存在的路径,让你在这6条路径上添加一个最小的数,使图不存在负环. 思路: 直接6遍 floyd 输出就行了. #include <bits/stdc++. ...

随机推荐

  1. handlerAdapter与方法调用(参数的解析)

    前提:当找到handler以后,那么就要让handler发挥作用,这个时候handlerAdapter就派上用场了 这里面比较复杂就是requestMappingHandlerAdapter了,其他的 ...

  2. java反射原理及Class应用

    反射:框架设计灵魂 框架:半成品软件,可以在框架基础上进行软件开发,简化编码 反射:将类的各个组成部分封装我其他对象,这就是反射机制 好处:  1.可以在程序运行过程中,操作这些对象  2.可以解耦, ...

  3. JS面向对象编程(二):构造函数的继承

    对象之间继承的 5 中方法.            比如, 现在有一个"动物"对象的构造函数.            function Animal(){              ...

  4. Ubuntu 执行chmod -R 777 / 挽救方法

    mgj怎么会有堪比rm -rf /*这样神奇的命令,本想着把当前目录下的权限改为777,没想到把整个/目录下全设成777了,直觉告诉我好像哪里有些不对劲,好在一顿xjb折腾最终弄好了,应该没啥大问题, ...

  5. 如何在Vue项目中使用vw实现移动端适配

    有关于移动端的适配布局一直以来都是众说纷纭,对应的解决方案也是有很多种.在< 使用Flexible实现手淘H5页面的终端适配>提出了Flexible的布局方案,随着 viewport 单位 ...

  6. JavaSE之——并没有多维数组

     近日在读<疯狂Java讲义>精粹第二版,部分语述摘自其中,自己边敲边理解 前言       我们知道,Java语言支持的类型有两种:            1.基本类型(即八大基本数据类 ...

  7. python 字符串格式化format

    通过{}和:来代替传统%方式   1.位置参数 位置参数不受顺序约束,且可以为{},只要format里有相对应的参数值即可,参数索引从0开,传入位置参数列表可用*列表 >>> li ...

  8. 为什么unsigned (-1)表示无符号整数的最大值

    整数在计算机中的表示 在计算机中,整数采用补码表示.当前主流编译器中整型在内存中占用四个字节,共32位. 机器数:一个数在计算机中的二进制表示形式, 叫做这个数的机器数.机器数是带符号的,在计算机用一 ...

  9. 一文读懂JS中的原型和原型链(图解)

    讲原型的时候,我们应该先要记住以下几个要点,这几个要点是理解原型的关键: 1.所有的引用类型(数组.函数.对象)可以自由扩展属性(除null以外). 2.所有的引用类型都有一个’_ _ proto_ ...

  10. 洛谷 P2157 [SDOI2009]学校食堂

    题意简述 每个人有一个口味,食堂每次只能为一个人做菜 做每道菜所需的时间是和前一道菜有关的,若前一道菜的对应的口味是a,这一道为b,则做这道菜所需的时间为a 异或 b 每个人都有一个容忍度,最多允许紧 ...