hihoCoder#1879 : Rikka with Triangles (计算几何)
n<=2000,肯定没有办法把所有三角形找出来全判一遍
对于三角形的三个角,分别计算贡献,锐角的贡献是1倍面积,钝角的贡献是-2倍面积,这样算出角的贡献之后除以3就可以了
每次选择一个点为中心点,极角排序,维护一个锐角和钝角的坐标和,边扫边算贡献
#include <bits/stdc++.h>
#define ll long long
#define big __int128
#define eps 1e-8
#define mod 998244353
using namespace std;
const int maxn = ;
int sgn(double x)
{
if (fabs(x) < eps)
return ;
if (x < )
return -;
return ;
}
struct Point
{
big x, y;
Point() {}
Point(big _x, big _y)
{
x = _x;
y = _y;
}
Point operator+(const Point &b) const
{
return Point(x + b.x, y + b.y);
}
Point operator-(const Point &b) const
{
return Point(x - b.x, y - b.y);
}
big operator*(const Point &b) const
{
return x * b.x + y * b.y;
}
big operator^(const Point &b) const
{
return x * b.y - y * b.x;
}
void Mod()
{
bool tx = false, ty = false;
if (x < )
{
x = -x;
tx = true;
}
if (y < )
{
y = -y;
ty = true;
}
x %= mod;
y %= mod;
if (tx)
x = -x;
if (ty)
y = -y;
}
int getxx()
{
if (x > && y >= )
return ;
if (x <= && y > )
return ;
if (x < && y <= )
return ;
if (x >= && y < )
return ;
return ;
}
} a[maxn],del[maxn];
bool cmp(Point &a,Point &b){
if(a.getxx() != b.getxx()){
return a.getxx() < b.getxx();
}else{
return (a^b)>;
}
}
int n;
big ans;
void gao(int id){
Point now = a[id];
int m = ;
for(int i = ;i <= n;i++){
if(i==id)continue;
del[++m] = a[i]-now;
//del[m].Mod();
}
if(m<=)return;
sort(del+,del++m,cmp);
int p1 = ,p2 = ;
Point s1=del[],s2=del[],ts1,ts2;
for(int i = ;i <= m;i++){
int nxt;
while(true){
nxt = p1+;
if(nxt>m)nxt=;
if(nxt==i)break;
if(!((del[i]^del[nxt])>=&&(del[i]*del[nxt])>))break;
if((del[i]^del[nxt])==&&(del[i]^del[p1])!=)break;
p1=nxt;s1=s1+del[p1];
}
while(true){
nxt = p2+;
if(nxt>m)nxt=;
if(nxt==i)break;
if(!((del[i]^del[nxt])>=))break;
if((del[i]^del[nxt])==&&(del[i]^del[p2])!=)break;
p2=nxt;s2=s2+del[p2];
}
ts1=s1;ts2=s2-s1;ts1.Mod();ts2.Mod();
ans+=(del[i]^ts1);ans %= mod;
ans-=(del[i]^ts2)%mod*2ll%mod;
ans=(ans+mod)%mod;
if(p1==i){p1++;s1=s1+del[p1];}s1=s1-del[i];
if(p2==i){p2++;s2=s2+del[p2];}s2=s2-del[i];
} }
int main()
{
int T;
scanf("%d",&T);
big inv = (mod+)/;
while (T--)
{
scanf("%d",&n);
ans=;
for (int i = ; i <= n; i++)
{
ll x, y;
scanf("%lld%lld",&x,&y);
a[i] = Point(x, y);
} for(int i= ;i <= n;i++){
gao(i);
}
ans=(ans*inv)%mod;
ll t = ans;
printf("%lld\n",t);
}
return ;
}
hihoCoder#1879 : Rikka with Triangles (计算几何)的更多相关文章
- hihoCoder 1040 矩形判断(计算几何)
http://hihocoder.com/problemset/problem/1040 首先判断四条线段是否相交,给出八个点,如果有一些点重合,并且不同坐标的点只有4个的话,表示可以构成四边形. 然 ...
- hdu 5784 How Many Triangles 计算几何,平面有多少个锐角三角形
How Many Triangles 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5784 Description Alice has n poin ...
- hihocoder #1040 矩形判断(计算几何问题 给8个点的坐标,能否成为一个矩形 【模板思路】)
#1040 : 矩形判断 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 给出平面上4条线段,判断这4条线段是否恰好围成一个面积大于0的矩形. 输入 输入第一行是一个整数T ...
- hdu-5784 How Many Triangles(计算几何+极角排序)
题目链接: How Many Triangles Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- hihocoder #1456 : Rikka with Lattice(杜教筛)
hihocoder #1456 : Rikka with Lattice(杜教筛) 题意 : 给你一个\(n*m\)方格图,统计上面有多少个格点三角形,除了三个顶点,不覆盖其他的格点(包括边和内部). ...
- hihoCoder #1646 : Rikka with String II(容斥原理)
题意 给你 \(n\) 个 \(01\) 串 \(S\) ,其中有些位置可能为 \(?\) 表示能任意填 \(0/1\) .问对于所有填法,把所有串插入到 \(Trie\) 的节点数之和(空串看做根节 ...
- HihoCoder#1279 : Rikka with Sequence(dp 枚举子集 二进制 神仙题)
题意 题目链接 Sol 不愧是dls出的比赛啊,265个交了题的人只有8个有分Orz 做完这题,,感觉自己的位运算dp姿势升华了... 首先最裸的dp应该比较好想,设\(f[i][j][k]\)表示前 ...
- hihocoder-1453-Rikka with Tree
#Hihocoder 1453 : Rikka with Tree 时间限制:10000ms 单点时限:1000ms 内存限制:256MB source: https://hihocoder.co ...
- 【CF528E】Triangles 3000(计算几何)
[CF528E]Triangles 3000(计算几何) 题面 CF 平面上有若干条直线,保证不平行,不会三线共点. 求任选三条直线出来围出的三角形的面积的期望. 题解 如果一定考虑直接计算这个三角形 ...
随机推荐
- JS Unicode转中文,中文转Unicode,ASCII转Unicode,Unicode转ASCII
在线转换工具https://oktools.net/unicode Unicode转中文 function decodeUnicode(str) { return unescape(str.repla ...
- 国际化:node导语言包
项目做国际化,是离不开语言包的en.json.zh-CN.json等等.难道要一个一个json文件的写吗???不!!!只要我们写在excel里,然后用nodejs导出我们需要的语言包就可以了!这样大大 ...
- PyCharm专业版下载安装
目录 1. 推荐阅读 2. PyCharm专业版 (目录) 1. 推荐阅读 Python基础入门一文通 | Python2 与Python3及VSCode下载和安装.PyCharm安装.Python在 ...
- matlab读取内容为二进制的TXT文件
本方法同样适合读取十六进制和二进制以外的其他进制文件,txt使用一个最简单的命令就可以读取 textread 这是一个十分有用,简便的函数(对于fopen fscanf而言)读取二进制txt文件:假如 ...
- C Make a Square Educational Codeforces Round 42 (Rated for Div. 2) (暴力枚举,字符串匹配)
C. Make a Square time limit per test2 seconds memory limit per test256 megabytes inputstandard input ...
- u-boot bl _main分析
ldr r0, =(CONFIG_SYS_INIT_SP_ADDR): #define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_INIT_RAM_ADDR ...
- element 表单校验失败自动聚焦到失败的input框
1.在对应的input框上添加ref属性,直接根据ref就可精确地获取到元素 <el-form-item label="课程名称" :label-width="fo ...
- 聚合函数 Aggregate Function
聚合函数是用来统计每个分组的统计信息,它们要跟 group by 一起使用,用来将每个分组所有数据 聚合 成一条统计数据. 包括 max/min/count/avg/sum 等. -- 按照部门进行分 ...
- websocket和通信
最近默默的在学websocket,推荐的当然是阮一峰的博客了,其中也学到了不少 可以去看看咯 http://www.ruanyifeng.com/blog/2017/05/websocket.htm ...
- Python Number(数字) Ⅰ
Python Number(数字) Python Number 数据类型http://www.xuanhe.net/用于存储数值. 数据类型是不允许改变的,这就意味着如果改变 Number 数据类型的 ...