hdu多校第五场1004 (hdu6627) equation 1 计算几何
题意:
给你一个C,再给你n组a,b,让你求x取什么值的时候,$ \sum_{i=1}^n |a_i*x+b_i| =C $,要求求出解的个数,并用最简分数从小到大表示,如果有无穷多解,输出-1.
题解:
其实这些方程就是在平面上的一组曲线,都是V形的,最低点都在x轴上,求出所有的零点,以这个零点从左到右排序。
容易看出,这些函数之和也是一条曲线y=f(i),这条曲线最多有n个转折点,就是刚才那些零点,那么就在这n个转折点分出的n+1个区间内,和这n个点上,用比例公式找和y=C的交点即可。无穷多解的情况是存在一条与y=C重合的线段。
首先预处理出f(i)上所有转折点的值,注意n的范围是1e5,因此不可能让你$O(n^2)$求每一点的值,其实,只需维护a与b的前缀和和后缀和,要求某点$x_k$时,将零点在此点左边的函数取正,零点在此点右边的的函数取反。
$(\sum_{i=1}^{k-1}a_i) *x_k+\sum_{i=1}^{k-1}b_i-(\sum_{i=k+1}^{n}a_i) *x_k-\sum_{i=k+1}^{n}b_i$
注意判断零点重合情况。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<stack>
#include<algorithm>
using namespace std;
typedef long long LL;
typedef long long ll;
const int M = 1e5 + ;
const double eps = 1e-;
const LL mod = ;
const LL lINF = 0x3f3f3f3f3f3f3f3f;
struct node {
int a, b;
}tr[M];
int t;
int n, c;
int fenzi[M], fenmu[M];
int ans;
int gcd(int a, int b)
{
if (!b)
return a;
else
return gcd(b, a % b);
}
double lst;
bool cmp(node x, node y)
{
return x.a * y.b - x.b * y.a < ;
}
bool cmp2(node x, node y)
{
return (double)x.b / -x.a < (double)y.b / -y.a;
}
bool cmp1(node x, node y)
{
return (double)x.b / -x.a <= (double)y.b / -y.a;
}
int suma[M], sumb[M];
int flag;
double nw;
double nx;
int main()
{
scanf("%d", &t);
while (t--)
{
scanf("%d%d", &n, &c);
for (int i = ; i <= n; i++)
{
scanf("%d%d", &tr[i].a, &tr[i].b);
}
sort(tr + , tr + n + , cmp);
suma[] = sumb[] = ;
for (int i = ; i <= n; i++)
{
suma[i] = suma[i - ] + tr[i].a;
sumb[i] = sumb[i - ] + tr[i].b;
}
flag = ans = ;
lst = -10000.0;
for (int i = ; i <= n; i++)
{
int tmpa = -suma[n];
int tmpb = -sumb[n];
tmpa += * suma[i];
tmpb += * sumb[i];
nw = (double)sumb[i] / suma[i];
nx = (double)sumb[i + ] / suma[i + ];
if (fabs(nw - nx) < eps)
continue;
if (!tmpa && tmpb == c)
{
flag = ;
break;
}
if (!i)
{
node tmpc;
tmpc.a = tmpa, tmpc.b = tmpb - c;
if (cmp1(tmpc, tr[]))
{
fenzi[ans] = -tmpc.b;
fenmu[ans] = tmpa;
int d = gcd(fenzi[ans], fenmu[ans]);
fenzi[ans] /= d;
fenmu[ans] /= d;
if (fenmu[ans] < )
{
fenzi[ans] = -fenzi[ans], fenmu[ans] = -fenmu[ans];
}
ans++;
}
}
else if (i == n)
{
node tmpc;
tmpc.a = tmpa, tmpc.b = tmpb - c;
if (cmp2(tr[n], tmpc))
{
fenzi[ans] = -tmpc.b;
fenmu[ans] = tmpa;
int d = gcd(fenzi[ans], fenmu[ans]);
fenzi[ans] /= d;
fenmu[ans] /= d;
if (fenmu[ans] < )
{
fenzi[ans] = -fenzi[ans], fenmu[ans] = -fenmu[ans];
}
ans++;
}
}
else
{
node tmpc;
tmpc.a = tmpa, tmpc.b = tmpb - c;
if (cmp2(tr[i], tmpc) && cmp1(tmpc, tr[i + ]))
{
fenzi[ans] = -tmpc.b;
fenmu[ans] = tmpa;
int d = gcd(fenzi[ans], fenmu[ans]);
fenzi[ans] /= d;
fenmu[ans] /= d;
if (fenmu[ans] < )
{
fenzi[ans] = -fenzi[ans], fenmu[ans] = -fenmu[ans];
}
ans++;
}
}
lst = (double)(tmpb - c) / tmpa;
}
if (flag)
{
printf("-1\n");
}
else
{
printf("%d", ans);
for (int i = ; i < ans; i++)
{
printf(" %d/%d", fenzi[i], fenmu[i]);
}
puts("");
}
}
}
hdu多校第五场1004 (hdu6627) equation 1 计算几何的更多相关文章
- hdu 6088 Rikka with Rock-paper-scissors (2017 多校第五场 1004) 【组合数学 + 数论 + 模意义下的FFT】
题目链接 首先利用组合数学知识,枚举两人的总胜场数容易得到 这还不是卷积的形式,直接搞的话复杂度大概是O(n^2)的,肯定会TLE.但似乎和卷积有点像?想半天没想出来..多谢Q巨提醒,才知道可以用下面 ...
- hdu多校第五场1005 (hdu6628) permutation 1 排列/康托展开/暴力
题意: 定义一个排列的差分为后一项减前一项之差构成的数列,求对于n个数的排列,差分的字典序第k小的那个,n<=20,k<=1e4. 题解: 暴力打表找一遍规律,会发现,对于n个数的排列,如 ...
- 2014 HDU多校弟五场J题 【矩阵乘积】
题意很简单,就是两个大矩阵相乘,然后求乘积. 用 Strassen算法 的话,当N的规模达到100左右就会StackOverFlow了 况且输入的数据范围可达到800,如果变量还不用全局变量的话连内存 ...
- 2014 HDU多校弟五场A题 【归并排序求逆序对】
这题是2Y,第一次WA贡献给了没有long long 的答案QAQ 题意不难理解,解题方法不难. 先用归并排序求出原串中逆序对的个数然后拿来减去k即可,如果答案小于0,则取0 学习了归并排序求逆序对的 ...
- HDU 多校对抗赛第二场 1004 Game
Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- hdu多校第五场1002 (hdu6625) three arrays 字典树/dfs
题意: 给你两个序列a,b,序列c的某位是由序列a,b的此位异或得来,让你重排序列ab,找出字典序最小的序列c. 题解: 如果能找到a,b序列中完全一样的值当然最好,要是找不到,那也尽量让低位不一样. ...
- hdu多校第五场1006 (hdu6629) string matching Ex-KMP
题意: 给你一个暴力匹配字符串公共前缀后缀的程序,为你对于某个字符串,暴力匹配的次数是多少. 题解: 使用扩展kmp构造extend数组,在扩展kmp中,设原串S和模式串T. extend[i]表示T ...
- hdu多校第五场1007 (hdu6630) permutation 2 dp
题意: 给你n个数,求如下限制条件下的排列数:1,第一位必须是x,2,最后一位必须是y,3,相邻两位之差小于等于2 题解: 如果x<y,那么考虑把整个数列翻转过来,减少讨论分支. 设dp[n]为 ...
- 2018 HDU多校第四场赛后补题
2018 HDU多校第四场赛后补题 自己学校出的毒瘤场..吃枣药丸 hdu中的题号是6332 - 6343. K. Expression in Memories 题意: 判断一个简化版的算术表达式是否 ...
随机推荐
- js 加载验证码
<img id="captchaPic" src="{{captcha_src('math')}}" onclick="this.src='{{ ...
- error C2872: “ACCESS_MASK”: 不明确的符号
原因:opencv3.0或者3.1的using namespace cv和windows.h中ACCESS_MASK定义冲突. 解决方案:注释掉所有的using namespace cv,然后在需要的 ...
- Hadoop-HDFS的伪分布式和完全分布式集群搭建
Hadoop-HDFSHDFS伪分布式集群搭建步骤一.配置免密登录 ssh-keygen -t rsa1一句话回车到底 ssh-copy-id -i ~/.ssh/id_rsa.pub root@no ...
- 【系统安全性】四、认证Authentication
四.认证Authentication 1.为什么要认证 对请求.数据进行认证,判断伪造的数据 HTTP请求很脆弱,抓包软件很强大,容易伪造身份,非法获取数据 2.摘要认证 对象:客户端参数.服务端响应 ...
- (转)OpenFire源码学习之十七:HTTP Service插件
转:http://blog.csdn.net/huwenfeng_2011/article/details/43457645 HTTP Service插件 这里的http接口插件是神马? Openfi ...
- “今日头条杯”首届湖北省大学程序设计竞赛(网络同步赛 )--E. DoveCCL and Resistance
题目描述:链接点此 这套题的github地址(里面包含了数据,题解,现场排名):点此 链接:https://www.nowcoder.com/acm/contest/104/D来源:牛客网 题目描述 ...
- ebay上传图片的要求
eBay's Picture Requirements Introduction to Pictures in Listings Pictures make an item more appealin ...
- CSS:CSS 链接
ylbtech-CSS:CSS 链接 1.返回顶部 1. CSS 链接 不同的链接可以有不同的样式. 链接样式 链接的样式,可以用任何CSS属性(如颜色,字体,背景等). 特别的链接,可以有不同的样式 ...
- JAVA学习之环境搭建
了解到JAVA语言的跨平台性的原理是通过在不同的操作系统中安装对应版本的的JAVA虚拟机(JVM)实现 开发JAVA前必须先搭建JAVA环境: 1.JAVA开发工具包JDK(JAVA DEVELOPM ...
- 为什么Netty这么火?与Mina相比有什么优势?
Netty是什么?为什么这么火? Netty是目前最流行的由JBOSS提供的一个Java开源框架NIO框架,Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服 ...