题意:

给你一个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 计算几何的更多相关文章

  1. hdu 6088 Rikka with Rock-paper-scissors (2017 多校第五场 1004) 【组合数学 + 数论 + 模意义下的FFT】

    题目链接 首先利用组合数学知识,枚举两人的总胜场数容易得到 这还不是卷积的形式,直接搞的话复杂度大概是O(n^2)的,肯定会TLE.但似乎和卷积有点像?想半天没想出来..多谢Q巨提醒,才知道可以用下面 ...

  2. hdu多校第五场1005 (hdu6628) permutation 1 排列/康托展开/暴力

    题意: 定义一个排列的差分为后一项减前一项之差构成的数列,求对于n个数的排列,差分的字典序第k小的那个,n<=20,k<=1e4. 题解: 暴力打表找一遍规律,会发现,对于n个数的排列,如 ...

  3. 2014 HDU多校弟五场J题 【矩阵乘积】

    题意很简单,就是两个大矩阵相乘,然后求乘积. 用 Strassen算法 的话,当N的规模达到100左右就会StackOverFlow了 况且输入的数据范围可达到800,如果变量还不用全局变量的话连内存 ...

  4. 2014 HDU多校弟五场A题 【归并排序求逆序对】

    这题是2Y,第一次WA贡献给了没有long long 的答案QAQ 题意不难理解,解题方法不难. 先用归并排序求出原串中逆序对的个数然后拿来减去k即可,如果答案小于0,则取0 学习了归并排序求逆序对的 ...

  5. HDU 多校对抗赛第二场 1004 Game

    Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  6. hdu多校第五场1002 (hdu6625) three arrays 字典树/dfs

    题意: 给你两个序列a,b,序列c的某位是由序列a,b的此位异或得来,让你重排序列ab,找出字典序最小的序列c. 题解: 如果能找到a,b序列中完全一样的值当然最好,要是找不到,那也尽量让低位不一样. ...

  7. hdu多校第五场1006 (hdu6629) string matching Ex-KMP

    题意: 给你一个暴力匹配字符串公共前缀后缀的程序,为你对于某个字符串,暴力匹配的次数是多少. 题解: 使用扩展kmp构造extend数组,在扩展kmp中,设原串S和模式串T. extend[i]表示T ...

  8. hdu多校第五场1007 (hdu6630) permutation 2 dp

    题意: 给你n个数,求如下限制条件下的排列数:1,第一位必须是x,2,最后一位必须是y,3,相邻两位之差小于等于2 题解: 如果x<y,那么考虑把整个数列翻转过来,减少讨论分支. 设dp[n]为 ...

  9. 2018 HDU多校第四场赛后补题

    2018 HDU多校第四场赛后补题 自己学校出的毒瘤场..吃枣药丸 hdu中的题号是6332 - 6343. K. Expression in Memories 题意: 判断一个简化版的算术表达式是否 ...

随机推荐

  1. URAL 1996. Cipher Message 3(KMP+fft)

    传送门 解题思路 因为要完全匹配,所以前七位必须保证相同,那么就可以把前7位提出来做一遍\(kmp\)匹配,最后的答案一定在这些位置里.考虑最后一位,可以把最后一位单独取出来,要计算的是最后一位相同的 ...

  2. angularjs 中 Factory,Service,Provider 之间的区别

    本片文章是使用了 angularjs 中使用 service 在controller 之间 share 对象和数据 的code(http://jsfiddle.net/kn46u0uj/1/) 来进行 ...

  3. appium自动化获取app的appPackage与appActivity方法总结

    一,获取apppackage 方法不止一种,我只介绍自己知道的两种. 1,通过APPIUM工具添加APK包后,会自动显示出来. 2,打开UI AUTOMATOR VIEWER 定位工具,随便指向一个定 ...

  4. ASP.NET Core学习——前言

    跌跌撞撞,公司的新项目终于要在这个月月底上线. 新项目使用ASP.NET Core来做,以前没接触过这方面的内容,只能一边学习,一边搞开发. 眼看项目上线在即,工作没那么忙,也不需要天天加班. 回想了 ...

  5. RabbitMQ使用(一)

    1. 安装与使用 1. 激活 RabbitMQ's Management Plugin (前面跟绝对路径) "D:\娱乐\rabbitmq_server-3.6.5\sbin\rabbitm ...

  6. 将.opt、.frm、.MYD、.MYI文件放入mysql

    问题:如果数据库没有给sql脚本而且给的.opt..frm..MYD..MYI这些文件,应该如何加载呢???? 解答:首先需要找到“mysql的安装目录/data/”,怎么找?mysql命令执行“sh ...

  7. pefile解析PE格式

    import os,sys import pefile import pydasm import struct #print sys.argv def show_section(pe): print ...

  8. Spring MVC源码分析(二):SpringMVC的DispatcherServlet的设计与实现

    概述   DispatcherServlet是SpringMVC的一个前端控制器,是MVC架构中的C,即controller的实现,用于拦截这个web应用的所有请求,具体为在web.xml中配置这个s ...

  9. idea springboot 打包 war

    1.pom文件中将项目改为   war

  10. Nginx网站部署

    Nginx网站服务部署 常用的网站服务软件 处理静态资源的服务: apache软件:https://apache.org/ nginx软件:https://nginx.org/ 处理动态资源的服务: ...