几何计算模板

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <algorithm>
  4 #include <cmath>
  5 #include <vector>
  6 #include <iostream>
  7 #include <cassert>
  8
  9 using namespace std;
 10
 11 typedef long long lld;
 12
 13 const double EPS = 1e-9;
 14 const int MOD = 998244353;
 15
 16 int sign(double x) {return x < -EPS ? -1 : x > EPS;}
 17
 18 struct Point {
 19     lld x, y;
 20     Point() {}
 21     Point(const lld &x, const lld &y): x(x), y(y) {}
 22
 23     void in() {
 24         cin >> x >> y;
 25     }
 26
 27     bool dim() const {
 28         return x < 0 || x == 0 && y < 0;
 29     }
 30 };
 31
 32 Point operator + (const Point &a, const Point &b) {
 33     return Point(a.x + b.x, a.y + b.y);
 34 }
 35 Point operator - (const Point &a, const Point &b) {
 36     return Point(a.x - b.x, a.y - b.y);
 37 }
 38 lld operator * (const Point &a, const Point &b) {
 39     return a.x * b.y - a.y * b.x;
 40 }
 41 bool operator < (const Point &a, const Point &b) {
 42     if (a.dim() == b.dim()) {
 43         return a * b > 0;
 44     }else {
 45         return a.dim() > b.dim();
 46     }
 47 }
 48
 49 typedef vector<Point> Points;
 50
 51 lld pow_mod(lld x, lld n) {
 52     lld ret = 1;
 53     while (n) {
 54         if (n & 1) ret = ret * x % MOD;
 55         n >>= 1; x = x * x % MOD;
 56     }
 57     return ret;
 58 }
 59
 60 inline void add(int &x, int ad) {
 61     x += ad;
 62     if (x >= MOD) x -= MOD;
 63 }
 64
 65 lld area(const Point &a, const Point &b) {
 66     return a * b;
 67 }
 68
 69 int n, tot;
 70 lld pw2[1005];
 71 Point vec[1005];
 72
 73 void work() {
 74     scanf("%d", &n);
 75     Points points(n);
 76     for (int i = 0; i < n; i++) {
 77         points[i].in();
 78     }
 79     int ans = 0;
 80     for (int i = 0; i < n; i++) {
 81         tot = 0;
 82         for (int j = 0; j < n; j++) {
 83             if (j == i) continue;
 84             vec[tot ++] = points[j] - points[i];
 85         }
 86         sort(vec, vec + tot);
 87         for (int j = 0; j < tot; j++) {
 88             int l = 1, r = tot - 1;
 89             while (r >= l) {
 90                 int mid = (r + l) >> 1;
 91                 int Mid = (mid + j) % tot;
 92                 if (vec[j] * vec[Mid] > 0) {
 93                     l = mid + 1;
 94                 }else {
 95                     r = mid - 1;
 96                 }
 97             }
 98             -- l;
 99             add(ans, (area(points[i], points[i] + vec[j]) % MOD * (pw2[l] - 1) % MOD + MOD) % MOD);
100         }
101     }
102     printf("%d\n", ans);
103 }
104
105 int main() {
106     pw2[0] = 1;
107     for (int i = 1; i <= 1000; i++) {
108         pw2[i] = 2 * pw2[i-1] % MOD;
109     }
110     int T;
111     scanf("%d", &T);
112     for (int cas = 1; cas <= T; cas++) {
113         work();
114     }
115     return 0;
116 }

时间: 2024-10-28 15:19:46

几何计算模板的相关文章

UVALive 6092 Catching Shade in Flatland --枚举+几何计算

题意:x=[-200,200],y=[-200,200]的平面,一天中太阳从不同角度射到长椅(原点(0,0))上,有一些树(用圆表示),问哪个时刻(分钟为单位)太阳光线与这些圆所交的弦长总和最长.太阳距离原点总是500m.(这些圆不会互相相交,每个圆都不包括原点或者不经过原点) 解法:直接暴力24*60分钟,找出此时的角度,然后求出直线方程,再枚举每个圆,求出弦长.注意这里每个圆都不包括原点,所以直线与圆的交点一定在同一侧,所以..我当时想多了,没看清题目.把他当成可以包含原点了,代码超长,幸好

1549: Navigition Problem (几何计算+模拟 细节较多)

1549: Navigition Problem Submit Page    Summary    Time Limit: 1 Sec     Memory Limit: 256 Mb     Submitted: 400     Solved: 122 Description Navigation is a field of study that focuses on the process of monitoring and controlling the movement of a cr

大数常用计算模板及例题

一.模板&例题 [两个大数相加] string sum(string s1,string s2) { if(s1.length()<s2.length()) { string temp=s1; s1=s2; s2=temp; } int i,j; for(i=s1.length()-1,j=s2.length()-1;i>=0;i--,j--) { s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0)); //注意细节 if(s1[i]-'0'>=10)

点云的基本几何计算

1.计算法向量 2.计算曲率 3.计算点云密度 4.计算点云粗糙度 5.计算点云重心 6.计算点云权重重心 7.计算点云协方差 8.计算点云互协方差

HDU 1392 Surround the Trees(几何 凸包模板)

http://acm.hdu.edu.cn/showproblem.php?pid=1392 题目大意: 二维平面给定n个点,用一条最短的绳子将所有的点都围在里面,求绳子的长度. 解题思路: 凸包的模板.凸包有很多的算法.这里用Adrew. 注意这几组测试数据 1 1 1 3 0 0 1 0 2 0 输出数据 0.00 2.00 1 #include<cmath> 2 #include<cstdio> 3 #include<algorithm> 4 using name

I Think I Need a Houseboat ZOJ(几何计算)

I Think I Need a Houseboat Time Limit: 2 Seconds Memory Limit: 65536 KB Fred Mapper is considering purchasing some land in Louisiana to build his house on. In the process of investigating the land, he learned that the state of Louisiana is actually s

LA 3263 好看的一笔画 欧拉几何+计算几何模板

题意:训练指南260 #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <cmath> using namespace std; struct Point { double x, y; Point(double x = 0, double y = 0) : x(x) , y(y) { } }; typedef Point V

欧拉函数phi值的计算模板

求小于n且与n互质的整数的个数.告诉你n的唯一分解式 我们可以运用容斥原理,先分别减去是p1,p2,p3..pn的倍数,再加上同时是他们素因子的个数,再减去3个……以此类推即可. 我们可以化简一下公式:f(x)=x*(1-1/p1)*(1-1/p2).....,其中p1,p2.....是n的素因子. 这就是大名鼎鼎的欧拉函数,然后我们可以用编程轻松的解决这个问题 运用求质数的方法,每次找到一个素因子,然后将它除净,就可以保证找到的因子都是素数 #include<bits/stdc++.h> u

[组合数取模-逆元计算模板] zoj 3624 Count Path Pair

思路: 正难则反 //C(M+N,M)*C(Q+M-P,Q)-C(N+M-P,N)*C(M+Q,M); 代码: #include"cstdlib" #include"cstdio" #include"cstring" #include"cmath" #include"stack" #include"algorithm" #include"iostream" using