Iksevi 题解
题目大意
\(n\) 次询问,每次给定一个点 \((x,y),x\ge 0, y\ge 0\),问有多少种对角线长为偶数的正方形使得在用该正方形正密铺第一象限的情况下该点位于正方形顶点上。
正密铺第一象限 指将第一个正方形的角与 \(x\) 轴和 \(y\) 轴接触。此后的正方形都与至少一个已放置的正方形有一条边重合。重复这一过程。
思路分析
考虑到 \(x,y\) 对称,因此不妨设 \(y>x\)。
设当前考虑的正方形对角线长为 \(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 题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
- JSOI2016R3 瞎BB题解
题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...
随机推荐
- Flutter upgrade 卡死问题
使用 到本地的flutter sdk的目录下 $flutter upgrade --force 降低到指定版本 : $flutter version 1.22.4
- .Net8的AOT引导程序BootStrap
前言 .Net8的本地预编机器码AOT,它几乎进行了100%的自举.微软为了摆脱C++的钳制,做了很多努力.也就是代码几乎是用C#重写,包括了虚拟机,GC,内存模型等等.而需要C++做的,也就仅仅是引 ...
- 运维自动化工具--Ansible
运维自动化工具Ansible 1. ansible安装 rocky安装 需要先安装 enel源 # yum install -y epel-release 然后再安装ansible # yum ins ...
- OSS的使用(谷粒商城58-64)
OSS的使用(谷粒商城58-64) 购买之类的就不在这里详述了,阿里云文档几乎都写了 创建bucket 学习阶段,相对独特的点在于我们需要选择公共读 项目开发阶段,不能选择公共读了,要尽量选择私有(代 ...
- Geo
Geo 应用情景 打车时寻找半径在多少范围的司机 查找附近的酒店,微信摇一摇 Linux中文乱码如何处理? redis-cli --raw docker: docker exec -it redis ...
- C++之函数的分文件编写
从黑马程序员的c++课里学到的函数的分文件编写 函数的分文件编写 作用:让代码结构更加清晰 函数分文件编写一般有4个步骤 1,创建后缀名为.h的头文件 2,创建后缀名为.cpp的源文件 3,在头文件中 ...
- Print, printf, println的区别
print 非格式,打印变量的值,不换行 printf 支持格式化输出,不换行 println 非格式,打印变量的值 ,换行
- OpenLayers示例
http://develop.smaryun.com:81/API/JS/OL3InterfaceDemo/index.htm
- 【分享】如何才能简洁高效不失优雅的爆破ZIP文件?
0x01 前言 在CTF比赛中,压缩包密码的爆破一直是一个热门话题.在这个过程中,简洁高效的方法是至关重要的.本文将介绍一些实用的技巧和工具,帮助您高效地爆破ZIP文件密码,而不失优雅.我们将探讨一些 ...
- 修改启动配置文件更改root密码
第二种:修改启动配置文件 (1)进入救援模式 开机选择第一个系统内核,键入e (2)修改配置文件 将光标移动linux 开始的行,添加内核参数 rd.break 按ctrl-x启动 光标放在linux ...