BZOJ1914 [Usaco2010 OPen]Triangle Counting 数三角形

hzwer已经说的很好了,在此只能跪烂了

  1 2
  2 3
  3 4
  4 5
  5 6
  6 7
  7 8
  8 9
  9 10
 10 11
 11 12
 12 13
 13 14
 14 15
 15 16
 16 17
 17 18
 18 19
 19 20
 20 21
 21 22
 22 23
 23 24
 24 25
 25 26
 26 27
 27 28
 28 29
 29 30
 30 31
 31 32
 32 33
 33 34
 34 35
 35 36
 36 37
 37 38
 38 39
 39 40
 40 41
 41 42
 42 43
 43 44
 44 45
 45 46
 46 47
 47 48
 48 49
 49 50
 50 51
 51 52
 52 53
 53 54
 54 55
 55 56
 56 57
 57 58
 58 59
 59 60
 60 61
 61 62
 62 63
 63 64
 64 65
 65 66
 66 67
 67 68
 68 69
 69 /**************************************************************
 70     Problem: 1914
 71     User: rausen
 72     Language: C++
 73     Result: Accepted
 74     Time:88 ms
 75     Memory:3160 kb
 76 ****************************************************************/
 77
 78 #include <cstdio>
 79 #include <cmath>
 80 #include <algorithm>
 81
 82 using namespace std;
 83 typedef long long ll;
 84 typedef double lf;
 85 const int N = 100005;
 86
 87 int n;
 88 ll cnt = 0;
 89
 90 struct P {
 91     ll x, y;
 92     lf an;
 93     P() {}
 94     P(ll _x, ll _y, lf _an) : x(_x), y(_y), an(_an) {}
 95 }a[N];
 96 inline bool operator < (const P &a, const P &b) {
 97     return a.an < b.an;
 98 }
 99 inline ll operator * (const P &a, const P &b) {
100     return (ll) a.x * b.y - a.y * b.x;
101 }
102
103 inline int read() {
104     int x = 0, sgn = 1;
105     char ch = getchar();
106     while (ch < ‘0‘ || ‘9‘ < ch) {
107         if (ch == ‘-‘) sgn = -1;
108         ch = getchar();
109     }
110     while (‘0‘ <= ch && ch <= ‘9‘) {
111         x = x * 10 + ch - ‘0‘;
112         ch = getchar();
113     }
114     return sgn * x;
115 }
116
117 void work() {
118     int r = 1, t = 0, i;
119     for (i = 1; i <= n; ++i) {
120         while ((r % n + 1) != i && a[i] * a[r % n + 1] >= 0) ++t, ++r;
121         cnt += (ll) t * (t - 1) / 2;
122         --t;
123     }
124 }
125
126 int main() {
127     n = read();
128     int i, X, Y;
129     for (i = 1; i <= n; ++i) {
130         X = read(), Y = read();
131         a[i] = P(X, Y, atan2(Y, X));
132     }
133     sort(a + 1, a + n + 1);
134     work();
135     printf("%lld\n", (ll) n * (n - 1) * (n - 2) / 6 - cnt);
136     return 0;
137 }

话说为了Rank 1我又丧病的使用了fread...还正是神器啊Orz

 1 /**************************************************************
 2     Problem: 1914
 3     User: rausen
 4     Language: C++
 5     Result: Accepted
 6     Time:60 ms
 7     Memory:4728 kb
 8 ****************************************************************/
 9
10 #include <cstdio>
11 #include <cmath>
12 #include <algorithm>
13
14 using namespace std;
15 typedef long long ll;
16 typedef double lf;
17 const int N = 100005;
18 const int Maxbuf = 1600005;
19 int n;
20 ll cnt = 0, Left = 0, len;
21 char buf[Maxbuf];
22
23 struct P {
24     ll x, y;
25     lf an;
26     P() {}
27     P(ll _x, ll _y, lf _an) : x(_x), y(_y), an(_an) {}
28 }a[N];
29 inline bool operator < (const P &a, const P &b) {
30     return a.an < b.an;
31 }
32 inline ll operator * (const P &a, const P &b) {
33     return (ll) a.x * b.y - a.y * b.x;
34 }
35
36 inline int read() {
37     int x = 0, sgn = 1;
38     while (buf[Left] < ‘0‘ || ‘9‘ < buf[Left]) {
39         if (buf[Left] == ‘-‘) sgn = -1;
40         ++Left;
41     }
42     while (‘0‘ <= buf[Left] && buf[Left] <= ‘9‘) {
43         x = x * 10 + buf[Left] - ‘0‘;
44         ++Left;
45     }
46     return sgn * x;
47 }
48
49 void work() {
50     int r = 1, t = 0, i;
51     for (i = 1; i <= n; ++i) {
52         while ((r % n + 1) != i && a[i] * a[r % n + 1] >= 0) ++t, ++r;
53         cnt += (ll) t * (t - 1) / 2;
54         --t;
55     }
56 }
57
58 int main() {
59     len = fread(buf, 1, Maxbuf, stdin);
60     buf[len] = ‘ ‘;
61     n = read();
62     int i, X, Y;
63     for (i = 1; i <= n; ++i) {
64         X = read(), Y = read();
65         a[i] = P(X, Y, atan2(Y, X));
66     }
67     sort(a + 1, a + n + 1);
68     work();
69     printf("%lld\n", (ll) n * (n - 1) * (n - 2) / 6 - cnt);
70     return 0;
71 }

(p.s. 比Rank 2快了2ms 23333)

时间: 2024-11-05 15:52:37

BZOJ1914 [Usaco2010 OPen]Triangle Counting 数三角形的相关文章

[Usaco2010 OPen]Triangle Counting 数三角形

[Usaco2010 OPen]Triangle Counting 数三角形 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 394  Solved: 198[Submit][Status][Discuss] Description 在一只大灰狼偷偷潜入Farmer Don的牛群被群牛发现后,贝西现在不得不履行着她站岗的职责.从她的守卫塔向下瞭望简直就是一件烦透了的事情.她决定做一些开发智力的小练习,防止她睡着了.想象牧场是一个X,Y平面的网格.她将

bzoj 1914: [Usaco2010 OPen]Triangle Counting 数三角形 容斥

1914: [Usaco2010 OPen]Triangle Counting 数三角形 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 272  Solved: 143[Submit][Status] Description 在 一只大灰狼偷偷潜入Farmer Don的牛群被群牛发现后,贝西现在不得不履行着她站岗的职责.从她的守卫塔向下瞭望简直就是一件烦透了的事情.她决定做一些开发智力的小练习,防止她睡 着了.想象牧场是一个X,Y平面的网格.她将N

bzoj 1914: [Usaco2010 OPen]Triangle Counting 数三角形

USACO划水中... 题目中要求经过原点的三角形数目,但这种三角形没什么明显的特点并不好求,所以可以求不经过原点的三角形数量. 对于一个非法三角形,它离原点最近的那条边连接的两个点所连的两条边一定在这个点与原点连线的一侧. 为了不重的计数,只用极角序最小的点算. 实现的时候可以把原数组复制一遍再用一个指针. #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #

bzoj 1914: [Usaco2010 OPen]Triangle Counting 数三角形——极角排序

Description 在一只大灰狼偷偷潜入Farmer Don的牛群被群牛发现后,贝西现在不得不履行着她站岗的职责.从她的守卫塔向下瞭望简直就是一件烦透了的事情.她决定做一些开发智力的小练习,防止她睡着了.想象牧场是一个X,Y平面的网格.她将N只奶牛标记为1-N (1 <= N <= 100,000),每只奶牛的坐标为X_i,Y_i (-100,000 <= X_i <= 100,000;-100,000 <= Y_i <= 100,000; 1 <= i &l

uva 11401 - Triangle Counting(数论)

题目链接:uva 11401 - Triangle Counting 题目大意:有多少种方法可以从1,2,3...n中选出3个不同的数组成三角形,给出n,求种数. 解题思路:加法原理,设最大边为x的三角形有c(x)个,那么另外两条边长分别为y和z,根据三角形的形式可以的y+z>x,所以z的范围即为x?y<z<x 根据这个不等式可以得到每个y值所对应的z值个数,为等差数列,所以 c(x)=(x?1)?(x?2)2??x?12?2 然后根据递推:f(n)=∑i=1nc(i) 代码 #incl

UVA 11401 - Triangle Counting(数论+计数问题)

题目链接:11401 - Triangle Counting 题意:有1,2,3....n的边,求最多能组成的三角形个数. 思路:利用三角形不等式,设最大边为x,那么y + z > x 得 x - y < z < x 然后y取取值,可以从1取到x - 1,y为n时候,有n - 1个解,那么总和为0 + 1 + 2 +...+ (x - 2) = (x - 1) * ( x- 2) / 2; 然后扣除掉重复的y = z的情况,在y > x / 2时,每个y取值会出现一次y = z.

数三角形 bzoj 1201

数三角形(1s 128MB)triangle [题目描述] 小苏看到一个这样的等边三角形:该等边三角形每边的长度为n且被分成n等份,于是每条边就有n-1个等分点.而整个三角形被连接两个不同边的等分点且平行于三角形的第三边的线段分成了n2个单位等边三角形(边长为1).下图左是n=5的情形: 小苏想知道,删除其中的一些短边后,剩下的边一共组成多少个三角形(包括所有边长为m的三角形),正立的和倒立的都算,只要三角形的3m条短边都没有被删除就算是组成一个三角形).例如,上图右就存在19个三角形. [输入

UVA Triangle Counting 11401【几何+数学】

11401 - Triangle Counting Time limit: 1.000 seconds 题意:给你n个线段,长度1-n.问可以组成多少不同的三角形 解题思路: 设最大边长为x的三角形有C(x)个,另外两条边长分别为y和z,根据三角不等式有y+z>x.所以z的范围是x-y < z < x. ①根据这个不等式,当y=1时x-1 < z < x,无解:y=2时有一个解(z=x-1):y=3时有两个解(z=x-1或者z=x-2)--直到y=x-1时有x-2个解.根据等

Pascal&#39;s Triangle II(帕斯卡三角形)

Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Return [1,3,3,1]. Note: Could you optimize your algorithm to use only O(k) extra space? 杨辉三角形,西方称为帕斯卡三角形 杨辉三角 1.每行数字左右对称,由1开始逐渐变大,然后变小,回到1. 2.第n行的数字个数为n个. 3.第n行数