【CodeForces - 195D】Analyzing Polyline (思维,卡精度的处理方式)
題干:
As Valeric and Valerko were watching one of the last Euro Championship games in a sports bar, they broke a mug. Of course, the guys paid for it but the barman said that he will let them watch football in his bar only if they help his son complete a programming task. The task goes like that.
Let's consider a set of functions of the following form:
Let's define a sum of?n?functions?y1(x),?...,?yn(x)?of the given type as functions(x)?=?y1(x)?+?...?+?yn(x)?for any?x. It's easy to show that in this case the graph?s(x)is a polyline. You are given?n?functions of the given type, your task is to find the number of angles that do not equal 180 degrees, in the graph?s(x), that is the sum of the given functions.
Valeric and Valerko really want to watch the next Euro Championship game, so they asked you to help them.
Input
The first line contains integer?n?(1?≤?n?≤?105)?— the number of functions. Each of the following?n?lines contains two space-separated integer numbers?ki,?bi?(?-?109?≤?ki,?bi?≤?109)?that determine the?i-th function.
Output
Print a single number — the number of angles that do not equal 180 degrees in the graph of the polyline that equals the sum of the given functions.
Examples
Input
1 1 0Output
1Input
3 1 0 0 2 -1 1Output
2Input
3 -2 -4 1 7 -5 1Output
3題目大意:
? ? 定義一個y()函數,然后定義一個s(x)函數,問我們s(x)函數上有多少個不是180°的傾角。
解題報告:
? ? ? 我們假象y(x)不是那樣定義的,它就是簡單的一次函數,那么n個一次函數相加肯定是一次函數,都是180°的傾角(直的),那么問題就出現在y(x)<0時,y(x)=0,也就是它本身應該加上一個小于0的數結果加上0了,所以就會有彎曲。也就是記錄與x軸有多少不同的交點。
? ? ? 這題要是直接用set存,然后需要開long double 記錄斜率,并且選擇合適的編譯器,才可以ac。。。不然就卡精度
? ? ?更好的方法是直接以最簡分數的方式存啊。
AC代碼:
#include<cstdio> #include<iostream> #include<algorithm> #include<set> #define ll long long #define mp make_pair using namespace std; struct Node {ll b,k; } node[100000 + 5]; set<pair<ll,ll> > st; int main () {ll n,k,b;cin>>n;for(int i = 1; i<=n; i++) {scanf("%lld%lld",&k,&b);if(k == 0) continue;if(k<0&&b<0) k=-k,b=-b;if(b == 0) {st.insert(mp(0,0));continue;}if(k<0&&b>0) k=-k,b=-b;st.insert(mp(k/__gcd(abs(k),abs(b)),b/__gcd(abs(k),abs(b)))); }cout << st.size() << endl;return 0 ; }?
總結
以上是生活随笔為你收集整理的【CodeForces - 195D】Analyzing Polyline (思维,卡精度的处理方式)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 总行信用卡中心审核中 成功与否还得看个人
- 下一篇: 什么是可转换公司债券?可转债中签怎么缴款