貌似这道题某人已经扔给我一个多星期了(雾)

首先要知道这样一点:凸包的面积可以直接用线段的有向面积和求得。

自己口胡的证明:单纯一条线段自身的叉积就是到原点与这条线段构成三角形的面积吧,那么加加减减之后就是凸包的面积了。。

所以我们可以单独考虑每条边的贡献。

显然一条边的贡献,就是在它 一侧 点的集合的 非空子集 的 数目。

所以我们枚举点然后极角排序扫一遍。

貌似除了自己手残写错了没有什么大坑?(雾)

 #include <bits/stdc++.h>
using namespace std;
typedef long double db;
typedef long long ll;
const ll mod = ;
const db eps=1e-;
const db pi=acos(-);
int sign(db k){if(k>-eps)return ;else if(k<-eps)return -; return ;}
int cmp(db k1,db k2){ return sign(k1-k2);}
struct point{
ll x,y;
db ang;
point operator+(const point &k1)const { return point{x+k1.x,y+k1.y};}
point operator-(const point &k1)const { return point{x-k1.x,y-k1.y};}
db getw(){ return atan2(1.0*y,1.0*x);}
};
ll cross(point k1,point k2){ return (k1.x*k2.y%mod-k1.y*k2.x%mod+*mod)%mod;}
bool cmp2(point a,point b){
return a.ang<b.ang;
}
ll f[];
void init(){
f[]=;
for(int i=;i<=;i++){
f[i]=f[i-]*%mod;
}
}
point p[];
int t,n;
point v[];
int cnt=;
ll slove(int id){
cnt=;
for(int i=;i<=n;i++){
if(i==id)continue;
v[cnt++]=point{p[i].x,p[i].y,(p[id]-p[i]).getw()};
}
for(int i=;i<cnt;i++){
v[i+cnt]=point{v[i].x,v[i].y,v[i].ang+*pi};
}
sort(v,v+*cnt,cmp2);
ll res=;
for(int l=,r=;l<cnt;l++){
while (r<*cnt&&v[r].ang-v[l].ang<pi){
r++;
}
res+=cross(p[id],v[l])*((f[r-l-]-+mod)%mod)%mod;
res%=mod;
}
return res;
}
int main(){
//freopen("zoj3871.in","r",stdin);
init();
scanf("%d",&t);
while (t--){
scanf("%d",&n);
ll ans = ;
for(int i=;i<=n;i++){
scanf("%lld%lld",&p[i].x,&p[i].y);
}
for(int i=;i<=n;i++) {
ans += slove(i);
ans%=mod;
}
printf("%lld\n",ans);
}
}

zoj 3871的更多相关文章

  1. ZOJ 3871 Convex Hull(计算几何、凸包)

    题意:给n个点,|x[i]|,|y[i]| <= 1e9.求在所有情况下的子集下(子集点数>=3),凸包的面积和. 这题主要有几个方面,一个是凸包的面积,可以直接用线段的有向面积和求得,这 ...

  2. ZOJ People Counting

    第十三届浙江省大学生程序设计竞赛 I 题, 一道模拟题. ZOJ  3944http://www.icpc.moe/onlinejudge/showProblem.do?problemCode=394 ...

  3. ZOJ 3686 A Simple Tree Problem

    A Simple Tree Problem Time Limit: 3 Seconds      Memory Limit: 65536 KB Given a rooted tree, each no ...

  4. ZOJ Problem Set - 1394 Polar Explorer

    这道题目还是简单的,但是自己WA了好几次,总结下: 1.对输入的总结,加上上次ZOJ Problem Set - 1334 Basically Speaking ac代码及总结这道题目的总结 题目要求 ...

  5. ZOJ Problem Set - 1392 The Hardest Problem Ever

    放了一个长长的暑假,可能是这辈子最后一个这么长的暑假了吧,呵呵...今天来实验室了,先找了zoj上面简单的题目练练手直接贴代码了,不解释,就是一道简单的密文转换问题: #include <std ...

  6. ZOJ Problem Set - 1049 I Think I Need a Houseboat

    这道题目说白了是一道平面几何的数学问题,重在理解题目的意思: 题目说,弗雷德想买地盖房养老,但是土地每年会被密西西比河淹掉一部分,而且经调查是以半圆形的方式淹没的,每年淹没50平方英里,以初始水岸线为 ...

  7. ZOJ Problem Set - 1006 Do the Untwist

    今天在ZOJ上做了道很简单的题目是关于加密解密问题的,此题的关键点就在于求余的逆运算: 比如假设都是正整数 A=(B-C)%D 则 B - C = D*n + A 其中 A < D 移项 B = ...

  8. ZOJ Problem Set - 1001 A + B Problem

    ZOJ ACM题集,编译环境VC6.0 #include <stdio.h> int main() { int a,b; while(scanf("%d%d",& ...

  9. zoj 1788 Quad Trees

    zoj 1788 先输入初始化MAP ,然后要根据MAP 建立一个四分树,自下而上建立,先建立完整的一棵树,然后根据四个相邻的格 值相同则进行合并,(这又是递归的伟大),逐次向上递归 四分树建立完后, ...

随机推荐

  1. C# Activator

    需要动态的创建一个实例模型的时候,就用Activator.CreateInstance(Type type);如果是明确的知道要创建哪个实例的模型,就可以用 new C#在类工厂中动态创建类的实例,所 ...

  2. MySQL中exists和in的区别及使用场景

    exists和in的使用方式: 1 #对B查询涉及id,使用索引,故B表效率高,可用大表 -->外小内大 1 select * from A where exists (select * fro ...

  3. 转: 关于linux用户时间与系统时间的说明

    写的很不错的一篇. https://blog.csdn.net/mmshixing/article/details/51307853

  4. A Sample Linker Script

    from:http://www.hertaville.com/a-sample-linker-script.html A sample script file that will work with ...

  5. 【推荐】Hutool 的通用工具类库

    摘自3.1.1版本作者发布原话,当时看到有点说不上的情绪,为作者的坚持.热爱点个赞. 已经想不起来是怎样结识 Hutool 的,但 Hutool 伴随几个项目的推进,获得了同事一致好评. 没经过实践和 ...

  6. M600 Pro 安装问题解决

    1.遥控器版本为1.2.10 提示版本已是最新版本,那么Lightbridge2 必须是1.1.60 不能是1.1.70 2.卸载机翼的时候,尽量用飞机带的那把工具 3.机翼安装 135 逆时针 cc ...

  7. 【Linux】Centos下安装ffmpeg

    一.准备工作 1.系统环境:CentOS release 6.9 (Final) 2.安装依赖包 yum install -y autoconf automake cmake freetype-dev ...

  8. Visual Studio 2017 - Windows应用程序打包成exe文件(2)- Advanced Installer 关于Newtonsoft.Json,LINQ to JSON的一个小demo mysql循环插入数据、生成随机数及CONCAT函数 .NET记录-获取外网IP以及判断该IP是属于网通还是电信 Guid的生成和数据修整(去除空格和小写字符)

    Visual Studio 2017 - Windows应用程序打包成exe文件(2)- Advanced Installer   Advanced Installer :Free for 30 da ...

  9. mysql查询前几条记录

    #My SQL 取前多少条select * from table LIMIT 5,10; #返回第6-15行数据 select * from table LIMIT 5; #返回前5行 select ...

  10. 抽奖 mark

    https://blog.csdn.net/Oversdownload/article/details/77454006?utm_source=blogxgwz5