Iksevi

题目大意

\(n\) 次询问,每次给定一个点 \((x,y),x\ge 0, y\ge 0\),问有多少种对角线长为偶数的正方形使得在用该正方形正密铺第一象限的情况下该点位于正方形顶点上。

正密铺第一象限 指将第一个正方形的角与 \(x\) 轴和 \(y\) 轴接触。此后的正方形都与至少一个已放置的正方形有一条边重合。重复这一过程。

思路分析

考虑到 \(x,y\) 对称,因此不妨设 \(y>x\)。

设当前考虑的正方形对角线长为 \(2l\),那么容易发现该正方形合法的充要条件是:

\[\begin{cases}y+x\equiv l\pmod {2l}\\y-x\equiv l\pmod {2l}\end{cases}
\]

将两式相加,得:

\[y\equiv0\pmod {2l}
\]

因此我们只需要枚举 \(y\) 的所有约数,再逐一判断就可以做到 \(O(n\sqrt V)\) 的时间复杂度,可以取得 \(70pts\) 的好成绩。

但我们发现 \(10^7\) 内约数个数最多的数只有 \(448\) 个约数,因此 \(O(\sqrt V)\) 的枚举是相当浪费的。

考虑将询问离线并离散化,改为枚举 \(1\sim V\) 中每个数的倍数,对所有的询问点开 vector 并加入在其离散化后对应的 vector 中加入约数。

这样我们的时间复杂度就优化成了 \(O(V\log V)\),空间复杂度为 \(O(n\max \{d\})\),可以通过。

或许你会问,\(O(n\max\{d\})=10^6\times 448=4.5\times 10^8\),空间开不下啊?

但实际上,因为相同的值对应同一个 vector,所以最劣情况是所有的询问点为在 \(1\sim 10^7\) 中前 \(10^6\) 个约数个数最多的数,算了一下发现是 \(60690707\),也就是 \(6\times 10^7\),是不会爆空间的。

代码

(最大时间 \(2.71s\),最大空间 \(171.27MB\))

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <cmath> using namespace std;
const int N = 1100000, M = 10000010, L = 10000000; int n, A, D, in1, in2;
int b[N], id[M]; struct Node{
int x, y;
}a[N]; vector <int> d[N]; bool check(int k){
return A % (2 * k) == k && D % (2 * k) == k;
} int main(){
scanf("%d", &n);
for (int i = 1; i <= n; i ++) {
scanf("%d %d", &in1, &in2);
if (in1 < in2) swap(in1, in2);
a[i] = Node{in1, in2};
b[i] = in1; id[in1] = 1;
}
sort(b + 1, b + n + 1);
int tot = unique(b + 1, b + n + 1) - b - 1;
for (int i = 1; i <= L; i ++)
if (id[i]) id[i] = lower_bound(b + 1, b + n + 1, i) - b;
for (int i = 1; i <= L; i ++)
for (int j = i; j <= L; j += i)
if (id[j]) d[id[j]].push_back(i);
for (int i = 1; i <= n; i ++) {
int ans = 0;
A = a[i].x + a[i].y ;
D = abs(a[i].x - a[i].y);
for (auto it : d[id[a[i].x]])
if (check(it)) ans ++;
cout << ans << '\n';
}
return 0;
}

Iksevi 题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

  10. JSOI2016R3 瞎BB题解

    题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...

随机推荐

  1. 【WebRtc】获取媒体设备信息

    加载设备信息页面 加载完设备信息页面 Code /** * 加载当前设备的音视频信息 */ initInnerLocalDevice() { let that = this; // 判断是否支持 if ...

  2. WinUI(WASDK)使用MediaPipe检查人体姿态关键点

    前言 之前有用这个MediaPipe.NET .NET包装库搞了手势识别,丰富了稚晖君的ElectronBot机器人的第三方上位机软件的功能,MediaPipe作为谷歌开源的机器视觉库,功能很丰富了, ...

  3. Anchored Neighborhood Regression【阅读笔记】GR全局回归

    论文信息 [Anchored Neighborhood Regression for Fast Example-Based uper Resolution]-TIMOFTER, 2013, IEEE ...

  4. Easygraph:全面高效的图分析与社会计算开源工具

    前言图是对事物之间关系的一种原生的表达,利用图可以深入直接地认识世界中的关联.社交网络.交易数据.知识图谱.交通运输.生物技术等都是图数据的典型应用.社交网络是一种特殊的图数据,它建立在图网络的基础上 ...

  5. Django:数据库驱动安装

    import pymysql pymysql.install_as_MySQLdb() 常见MySQL驱动介绍: MySQL-python:也就是MySQLdb.是对C语言操作MySQL数据库的一个简 ...

  6. 王道oj/problem18

    网址:略 思路:见注释:有bug:插入时1和2的结果正好相反,稍后编辑. 代码: #define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#incl ...

  7. 图解算法,原理逐步揭开「GitHub 热点速览」

    想必每个面过大厂的小伙伴都被考过算法,那么有没有更快了解算法的方式呢?这是一个老项目,hello-algo 用图解的方式让你了解运行原理.此外,SQL 闯关自学项目也是一个让你能好好掌握 SQL 技术 ...

  8. [selenium]相对定位器

    前言 Relative Locators,相对定位器,是Selenium 4引入的一个新的定位器,相对定位器根据源点元素去定位相对位置的其它元素. 相对定位方法其实是基于JavaScript的 get ...

  9. redis数据持久化之RDB和AOF

    前言 redis虽然是内存缓存程序,但是可以将内存中的数据保存到硬盘上,从而实现数据保存.目前有两种redis数据持久化方式,分别是RDB和AOF. RDB模式 RDB之简介 RDB(redis da ...

  10. Spring HandlerInterceptor工作机制

    本文以一个通过正常注册拦截器流程注册拦截器失败的实际场景,来带领大家阅读源码,体会Spring的HandlerInterceptor拦截器整个工作流程 简单认识 org.springframework ...