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 (计算几何)的更多相关文章

  1. hihoCoder 1040 矩形判断(计算几何)

    http://hihocoder.com/problemset/problem/1040 首先判断四条线段是否相交,给出八个点,如果有一些点重合,并且不同坐标的点只有4个的话,表示可以构成四边形. 然 ...

  2. hdu 5784 How Many Triangles 计算几何,平面有多少个锐角三角形

    How Many Triangles 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5784 Description Alice has n poin ...

  3. hihocoder #1040 矩形判断(计算几何问题 给8个点的坐标,能否成为一个矩形 【模板思路】)

    #1040 : 矩形判断 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 给出平面上4条线段,判断这4条线段是否恰好围成一个面积大于0的矩形. 输入 输入第一行是一个整数T ...

  4. hdu-5784 How Many Triangles(计算几何+极角排序)

    题目链接: How Many Triangles Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  5. hihocoder #1456 : Rikka with Lattice(杜教筛)

    hihocoder #1456 : Rikka with Lattice(杜教筛) 题意 : 给你一个\(n*m\)方格图,统计上面有多少个格点三角形,除了三个顶点,不覆盖其他的格点(包括边和内部). ...

  6. hihoCoder #1646 : Rikka with String II(容斥原理)

    题意 给你 \(n\) 个 \(01\) 串 \(S\) ,其中有些位置可能为 \(?\) 表示能任意填 \(0/1\) .问对于所有填法,把所有串插入到 \(Trie\) 的节点数之和(空串看做根节 ...

  7. HihoCoder#1279 : Rikka with Sequence(dp 枚举子集 二进制 神仙题)

    题意 题目链接 Sol 不愧是dls出的比赛啊,265个交了题的人只有8个有分Orz 做完这题,,感觉自己的位运算dp姿势升华了... 首先最裸的dp应该比较好想,设\(f[i][j][k]\)表示前 ...

  8. hihocoder-1453-Rikka with Tree

    #Hihocoder 1453 : Rikka with Tree 时间限制:10000ms 单点时限:1000ms 内存限制:256MB   source: https://hihocoder.co ...

  9. 【CF528E】Triangles 3000(计算几何)

    [CF528E]Triangles 3000(计算几何) 题面 CF 平面上有若干条直线,保证不平行,不会三线共点. 求任选三条直线出来围出的三角形的面积的期望. 题解 如果一定考虑直接计算这个三角形 ...

随机推荐

  1. 21个CSS3 / JS 时钟

    收集了21个酷炫的CSS / JS实现的时钟效果https://oktools.net/clocks 预览 :https://clocks.oktools.net/0/ 源码 :https://cod ...

  2. (一)老毛桃U盘启动盘制作

    制作U盘启动盘前,一定要将U盘数据进行备份.U盘启动盘制作步骤: 1. 到老毛桃官网上下载U盘制作程序http://www.laomaotao.org.cn/. 2. 双击运行安装包,设置安装路径. ...

  3. Nginx Windows下安装使用及权重分配

    内容目录 Nginx 下载启动Nginx关闭NginxNginx使用注意事项使用Nginx代理服务器做负载均衡Nginx配置静态资源Nginx权重分配方式Nginx负载均衡参数描述写在最后 Nginx ...

  4. thinkphp 多条件联合查询 where例句

    $where['username'] = array("eq",$username); $where['phone'] = array("eq",$userna ...

  5. u-boot v2018.01 启动流程分析

    https://blog.csdn.net/weixin_39655765/article/details/80058644#jump1 make smdkc100_defconfig     以被默 ...

  6. Java集合及Concurrent并发包总结

    1.集合包 集合包最常用的有Collection和Map两个接口的实现类,Colleciton用于存放多个单对象,Map用于存放Key-Value形式的键值对. Collection中最常用的又分为两 ...

  7. Python之网路编程利用threading模块开线程

    一多线程的概念介绍 threading模块介绍 threading模块和multiprocessing模块在使用层面,有很大的相似性. 二.开启多线程的两种方式 1 1.创建线程的开销比创建进程的开销 ...

  8. Python之网路编程之-互斥锁与进程间的通信(IPC)及生产者消费者模型

    一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理. 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行 ...

  9. jvm——class类文件的结构

    class类文件并不一定以磁盘的形式存在,也可以是由类加载器直接生成的二进制流,他其实是一种数据结构,类似于c语言结构体,这种数据结构只有两种数据类型:无符号数和表. 1.魔数:类似于文件拓展名,CA ...

  10. ssh 密码连接报错 permission denied

    背景:ssh连接openstack  king时,出错permission denied (publickey,gssapi-keyex,gssapi-with-mic) 原因:king未开启ssh ...