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 平面上有若干条直线,保证不平行,不会三线共点. 求任选三条直线出来围出的三角形的面积的期望. 题解 如果一定考虑直接计算这个三角形 ...
随机推荐
- npm 命令行基本操作
npm命令选项选项 说明search 在存储库中查找模块包 npm search expressinstall 使用在存储库或本地位置上的一个package.json文件来安装 ...
- Delphi 变量
- laravel5.8 表单验证
'name' => 'required|unique:posts|max:255', // posts 表名 源码 vendor\laravel\framework\src\Illuminat ...
- 右则css 小浮条
<!--右边浮动--> <div class="indexfu"> <div class="indexfu2" id=" ...
- Android 静态代码分析工具
简评: 作者在文中提到的三个静态代码分析工具不是互相替代的关系,各有各的侧重点,如果有需要完全可以同时使用. 静态代码分析是指无需运行被测代码,仅通过分析或检查源程序的语法.结构.过程.接口等来检查程 ...
- Windows10家庭版的功能中没有Hyper-V的解决方法
1.在桌面新建记事本 将下面的内容复制到编辑器或者记事本当中 pushd "%~dp0" dir /b %SystemRoot%\servicing\Packages\*Hyper ...
- pt-online-schema-change的用法
pt-online-schema-change的用法 环境: 10.192.30.53 主库 10.192.30.60 从库 mysql版本:8.0.17 为了方便操作,简单的写了如下的脚本. #!/ ...
- 【NOIP2016提高A组模拟10.15】打膈膜
题目 分析 贪心, 先将怪物按生命值从小到大排序(显然按这个顺序打是最优的) 枚举可以发对少次群体攻击, 首先将所有的群体攻击发出去, 然后一个一个怪物打,当当前怪物生命值大于2,如果还有魔法值就放重 ...
- 【leetcode】1220. Count Vowels Permutation
题目如下: Given an integer n, your task is to count how many strings of length n can be formed under the ...
- 新建com组件项目步骤
一.菜单栏 新建->项目->ATL->ATL项目->动态链接库 后续默认完成二.菜单栏 项目->添加类->ATL控件->“写入类的命名如:CeshiMai ...