【HDOJ6627】equation(模拟)
题意:给定n,整数序列a和b,整数C,求所有
成立的x
n<=1e5,1<=a[i]<=1e3,-1e3<=b[i]<=1e3,1<=C<=1e9
思路:
大概就照每条直线的零点分段,维护一下系数和常数项
特判的地方挺多,精度也要注意,写起来像计算几何
感觉这种麻烦的东西应该有模板
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> Pll;
typedef vector<int> VI;
typedef vector<PII> VII;
#define N 1100000
#define M 4100000
#define fi first
#define se second
#define MP make_pair
#define pi acos(-1)
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
#define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
#define lowbit(x) x&(-x)
#define Rand (rand()*(1<<16)+rand())
#define id(x) ((x)<=B?(x):m-n/(x)+1)
#define ls p<<1
#define rs p<<1|1 const ll MOD=,inv2=(MOD+)/;
double eps=1e-;
int INF=1e9; struct arr
{
ll a,b;
}c[N],ans[N]; bool cmp(arr a,arr b)
{
return a.b*b.a>b.b*a.a;
} ll read()
{
ll v=,f=;
char c=getchar();
while(c<||<c) {if(c=='-') f=-; c=getchar();}
while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
return v*f;
} ll gcd(ll x,ll y)
{
if(y==) return x;
return gcd(y,x%y);
} int xiaoyu(ll x1,ll y1,ll x2,ll y2)
{
//printf("xiaoyu %I64d %I64d %I64d %I64d\n",x1,y1,x2,y2);
int p=-;
ll t=x1*y2-y1*x2;
if(t==) return ;
if(t<) p=-p;
if(y1*y2<) p=-p;
return (p==);
} int main()
{
//freopen("1.in","r",stdin);
int cas=read();
while(cas--)
{
int n;
scanf("%d",&n);
ll C=read();
rep(i,,n)
{
c[i].a=read();
c[i].b=read();
}
sort(c+,c+n+,cmp);
//rep(i,1,n) printf("%I64d %I64d\n",c[i].a,c[i].b);
int m=;
ll sa=,sb=;
rep(i,,n)
{
sa-=c[i].a;
sb-=c[i].b;
}
//printf("sa=%I64d C-sb=%I64d\n",sa,C-sb);
int flag=;
if(sa==&&C-sb==) flag=;
if(xiaoyu(C-sb,sa,-c[].b,c[].a))
{
if(sa==&&C-sb!=) continue;
m++;
ll t=gcd(abs(C-sb),abs(sa));
//printf("t=%I64d\n",t);
ans[m].a=(C-sb)/t;
ans[m].b=sa/t;
if(ans[m].b<)
{
ans[m].a=-ans[m].a;
ans[m].b=-ans[m].b;
}
}
c[n+].a=-1e15; c[n+].b=;
rep(i,,n)
{
sa+=2ll*c[i].a;
sb+=2ll*c[i].b;
//printf("sa=%I64d C-sb=%I64d\n",sa,C-sb);
if(sa==&&C-sb==)
{
flag=;
break;
}
if(sa==&&C-sb!=) continue;
if(xiaoyu(C-sb,sa,-c[i].b,c[i].a)==&&xiaoyu(C-sb,sa,-c[i+].b,c[i+].a))
{
if(m>=&&(C-sb)*ans[m].b==sa*ans[m].a) continue;
m++;
ll t=gcd(abs(C-sb),abs(sa));
ans[m].a=(C-sb)/t;
ans[m].b=sa/t;
if(ans[m].b<)
{
ans[m].a=-ans[m].a;
ans[m].b=-ans[m].b;
}
}
}
if(flag)
{
printf("-1\n");
continue;
}
if(m==)
{
printf("0\n");
continue;
} printf("%d ",m);
rep(i,,m-) printf("%I64d/%I64d ",ans[i].a,ans[i].b);
printf("%I64d/%I64d\n",ans[m].a,ans[m].b);
} return ;
}
【HDOJ6627】equation(模拟)的更多相关文章
- 第七届河南省赛F.Turing equation(模拟)
10399: F.Turing equation Time Limit: 1 Sec Memory Limit: 128 MB Submit: 151 Solved: 84 [Submit][St ...
- [NOIP10.6模拟赛]2.equation题解--DFS序+线段树
题目链接: 咕 闲扯: 终于在集训中敲出正解(虽然与正解不完全相同),开心QAQ 首先比较巧,这题是\(Ebola\)出的一场模拟赛的一道题的树上强化版,当时还口胡出了那题的题解 然而考场上只得了86 ...
- 基于网格的波动方程模拟(Wave equation on mesh)附源码
波动方程是偏微分方程 (PDE) 里的经典方程,它在物理学中有大量应用并经常用来解释空间中的能量传播.波动方程是一个依赖时间的方程,它解释了系统状态是如何随着时间的推移而发生变化.在下面模拟波动方程时 ...
- Fabricate equation(dfs + 模拟)
Fabricate equation Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Other ...
- UVA 1661 Equation (后缀表达式,表达式树,模拟,实现)
题意:给出一个后缀表达式f(x),最多出现一次x,解方程f(x) = 0. 读取的时候用一个栈保存之前的结点,可以得到一颗二叉树,标记出现'X'的路径,先把没有出现'X'的子树算完,由于读取建树的时候 ...
- zzuoj--10399--Turing equation(模拟)
Turing equation Time Limit: 1 Sec Memory Limit: 128 MB Submit: 152 Solved: 85 [Submit][Status][Web ...
- [CSP-S模拟测试]:Equation(数学+树状数组)
题目描述 有一棵$n$个点的以$1$为根的树,以及$n$个整数变量$x_i$.树上$i$的父亲是$f_i$,每条边$(i,f_i)$有一个权值$w_i$,表示一个方程$x_i+x_{f_i}=w_i$ ...
- csp-s模拟测试56Merchant, Equation,Rectangle题解
题面:https://www.cnblogs.com/Juve/articles/11619002.html merchant: 二分答案,贪心选前m大的 但是用sort复杂度不优,会T掉 我们只是找 ...
- csp-s模拟测试56(10.2)Merchant「二分」·Equation「树状数组」
又死了......T1 Merchant 因为每个集合都可以写成一次函数的形式,所以假设是单调升的函数,那么随着t越大就越佳 而单调减的函数,随着t的增大结果越小,所以不是单调的??? 但是我们的单调 ...
随机推荐
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_06 Properties集合_1_使用Properties集合存储数据,遍历取出集合中的数据
map下面的实现类叫做Hashtable Properties是唯一和IO流相结合的 讲解 代码
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_03 过滤器_2_FileNameFilter过滤器的使用和Lambda表达式
复制一份上一节的代码 匿名内部类的形式 FilenameFilter 只有一个Accept方法.这样我们就可以使用lambda表达式 lambda表达式的前提条件 参数类型和,返回的大括号 都可以省掉 ...
- JavaScript 变量,语句
定义变量的方式: var 变量可以没有初始值,变量可以修改,变量可以覆盖,存在变量提升. // 变量提升机制 console.log(name)// undefined var name = &q ...
- 【ABAP系列】SAP ABAP解析XML的示例程序
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP解析XML的示例 ...
- chrome:// .......命令 集结
Chrome 有很多的特性在界面菜单中是没有体现的,可以通过 chrome:// 命令来访问 我搜集了下面这些!!!当然也是在网上找的!有的我自己也不知道是什么,具体作用是什么!还是等高人来探讨吧!c ...
- Docker 容器化部署1小时简单入门
Docker简介 Docker是DotCloud开源的.可以将任何应用包装在Linux container中运行的工具.2013年3月发布首个版本,当前最新版本为1.3.Docker基于Go语言开发, ...
- [2019杭电多校第二场][hdu6602]Longest Subarray(线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6602 题目大意为求最长的区间,满足C种数字在区间内要么不出现,要么出现的次数都不小于K. 大致的分析一 ...
- C# 判断文件夹与文件是否存在
//在上传文件时经常要判断文件夹是否存在,如果存在就上传文件,否则新建文件夹再上传文件 判断语句为 if (System.IO.Directory.Exists(Server.MapPath(&quo ...
- v-cloak解决Vue双大括号闪烁问题
相信不少人和我一样,初次查看一个技术的文档的时候,知识吸收的很慢,因为对这个技术的不熟悉导致不清楚各种操作的应用场景,当我意识到这件事之后,我决定换种学习思路,即以实战为主,卡壳就查文档,会对这个技术 ...
- HTML水平居中和垂直居中的实现方式
父元素是块元素,根据子元素不同分为以下几种: 1.子元素是行内元素: a.水平居中:在父元素上设置text-align:center; b.垂直居中:在行内子元素上设置行高与父元素相同line-hei ...