星座
题目描述
世界上有两种人,数星星的人和画星座的人
为了探索我们头顶那美丽的星空,伟大的 C 学给了我们一张星图,这张星图 可以看做一个平面,其中包含了 n颗星星,每颗星星可以用平面上的一个点来表 示,C 学告诉我们这张星图中包含着多种神奇的α- β- γ星座,这些星座在平 面内构成了很多平行四边形,它们的都有一组边长为γ的对边平行于 x 轴,且另 一组对边平行于一斜率为 β/ α的直线, 现在 C 学给了我们若干组询问,每组 询问包含 3 个整数 α, β和 γ,对于每组询问请你求出 x 轴上方和下方中 α- β- γ星座的个数 (平行四边形不能与 x 轴有相交的部分)
输入格式与数据范围
第 1 行 2 个正整数 n, m 表示星星的个数 和 询问的个数 (4 ≤ n ≤ 100000, 1 ≤ m ≤ 10)
第 2~n+1 行 每行 2 个整数 x, y 表示每颗星星的横纵坐标 (-1000 ≤ x ≤ 1000, -1000 ≤ y ≤ 1000 ) (数据保证不会有两颗星星在同一个位置)
第 n+2~n+m+1 行 每行 3 个整数 α, β和 γ(1 ≤ α≤ 2000,-2000 ≤ β≤ 2000 和 1 ≤ γ≤ 2000) (当β= 0 时,表示一条平行于 y 轴的直线)
输出格式
输出共 m 行
每行两个整数 表示 x 轴上方满足条件星座个数 和 x 轴下方满足条件星座 个数
样例
【样例输入】
8 1
1 1
2 1
1 2
2 2
1 -1
2 -1
1 -2
2 -2
1 0 1
【样例输出】
1 1
题解
几何题还是要多画图啊。首先,满足斜率条件的点,肯定与x轴有唯一的交点,按这个交点排序之后,只要用一个映射来表示这个点右边距离是\gamma有没有点来判断即可,对于相同的y,x_0只要分别计算出右边距离为\gamma的,放入集合中,计算c(size,2)即可。
注意精度是大坑。
code
|
|
W 的火星工程
题目描述
大老板 W 的伟大工程扩大到了火星,他准备在火星建立一个自己的度假村。在他的度假村里,有两个大饭店 A,B。对于 W 来说,修建度假村必不可少的就
是从 A 饭店向 B 饭店修路,以保证他可以短时间内享受各种美味。火星上有一些中转站,中转站之间以及它们与饭店之间有路径使得能从一个到达另一个(路径为单向)。对于每一条路径,工程师 ZQ 给出了它的两个消费参数 a, b。W 会从A 饭店出发,经过其中的一些路径,最终到达 B 饭店。W 希望他走过的所有道
路的 \frac {\sum a} {\sum b}最小,也就是那些道路的 a 值之和除以他们的 b 值之和最小。可是路径实在太多了,W 不知道该如何选择。聪明的你需要帮助他计算出这
个最小值。至于路径的选取方法你就不需要告诉他了。
输入格式
输入两个整数 n,m,表示中转站的数量和边的数量。
随后 m 行,每行四个整数 x,y,a,b,分别表示路径的两端,路径的 a,b 消费参数。
其中 0 号点与 n+1 号点分别表示 W 的两个饭店 A,B。
注意你并不需要把所有中转站都连入路中,只要保证从 A 饭店可以到达 B饭店就行了。
输出格式
输出一个小数,表示所求的最小值。输出保留小数点后 6 位(printf 保留6位即可)。
样例
【样例输入】
2 3
0 1 1 2
0 2 2 3
1 3 1 3
【样例输出】
0.400000
数据范围
对于 20%的数据,n, m ≤ 100;
对于 50%的数据,n ≤1000;
对于 100%的数据,1 ≤ n ≤ 10000, 1 ≤ m ≤ 100000, 0 ≤ x, y ≤ n+1,0 < a,b ≤ 100000;
数据保证 0 号饭店可以到达 n+1 号饭店,任意两个中转站或饭店间最多有一条边,且保证没有路可以构成环。
题解
裸的零一分数规划。因为没有看到单向边,谢了奇怪的判断,各种不知道怎么处理负环,挂掉了。推一下式子吧。
求min{\frac {\sum a} {\sum b}}
令ans=min{\frac {\sum a} {\sum b}}
设一个布尔数组x[i]代表第i条边的选择。
则ans=\frac {\sum a[i]x[i]} {\sum b[i]x[i]}
设一个函数f(t)=\sum a[i]x[i]-t\sum b[i]x[i]
显然函数还跟边的选择有关。但是当t=ans时,是可以找出一种选择满足题目条件。
我们可以二分这个t,然后只要保证函数最小值大于零以及单调性来判断t如何变化。
构造新边a[i]-tb[i],此时函数最小值就是最短路。
然后裸的SPFA或者堆优化dijkstra。
code
|
|
A-B=C
题目描述
今天 HYX 同学由于兼爱平生,同时也为了练习如何讲题,来到幼儿园去教小朋友们学习减法,现在他手上有很多盒小木棍,他需要用这些小木棍摆出 A-
B=C 的样子来教小朋友学减法,这时有个聪明机智可爱的小女孩问了 HYX 同学这样一个问题“对于每一盒小木棍能摆出多少形如 A-B=C 式子(对于每一个摆出
的式子要求将小木棍用完)”,HYX 很想回答她的问题,但他发现这并不是一个很好解决的问题,所以为了解决小女孩的问题,HYX 同学希望你能帮它算一算
对于他的每一个盒子所能摆出算式的的数量,当然由于这个数可能很大你只需要输出答案取模 1e9+7 后的值就可以了。(因为小女孩还很年幼,所以她还不知道
0 概念,所以要求 A,B,C 均为正整数,且不能有前导 0) 说明:等号和减号需要使用木棍
数字的样式:
(无图请脑补)
输入输出格式
输入格式
从文件 subtraction.in 中输入数据。
第一行 一个正整数 T 表示 HYX 同学手中盒子的数量
接下来 T 行 每行一个整数 表示每个盒子中小木棍的数量
输出格式
输出到文件 subtraction.out 中。
输出 T 行 第 i 行输出 以 Case #i: ans 的形式输出 ans 为第 i 个盒子所能摆出形如 A-B=C 的式子的个数
样例
【样例输入】
3
1
12
20
【样例输出】
Case #1: 0
Case #2: 1
Case #3: 38
数据范围
对于 20%的数据 1 ≤ T ≤ 10, 1 ≤ N ≤ 24
对于 80%的数据 1 ≤ T ≤ 30, 1 ≤ N ≤ 500
对于 100%的数据 1 ≤ T ≤ 1e7, 1 ≤ N ≤ 1e6
题解
状态转移方程如下,采用记忆化搜索实现。
code
|
|