【bzoj4541】 Hnoi2016—矿区
http://www.lydsy.com/JudgeOnline/problem.php?id=4541 (题目链接)
题意
给出一个平面图,若干询问,每次询问一个凸多边形内小多边形面积的平方和与面积的和的比值。
Solution
江哥的神题,右转题解→_→:http://blog.csdn.net/philipsweng/article/details/51201092
细节
注意数组大小
代码
// bzoj4541
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf (1ll<<60)
#define HAS 40007
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std;
inline int gi() {
int x=0,f=1;char ch=getchar();
while (ch<'0' || ch>'9') {if (ch=='-') f=-1;ch=getchar();}
while (ch>='0' && ch<='9') {x=x*10+ch-'0';ch=getchar();}
return x*f;
} const int maxn=200010,maxm=600010;
int head[maxm],last[maxn],next[maxm<<1],par[maxm],fa[maxm],N,n,m,q,s,cnt=1,ccc;
LL area[maxm],AREA[maxm],sum[maxm],SUM[maxm],P,Q;
struct point {int x,y;}a[maxn];
struct chain {LL w;int id,next;}line[maxm<<1];
struct edge {int u,v,next,id;}e[maxm<<1],d[maxm<<1];
vector<pair<double,int> >V[maxn]; inline LL gcd(LL a,LL b) {return b==0 ? a : gcd(b,a%b);}
inline int find(int x) {return fa[x]==x ? x : fa[x]=find(fa[x]);}
inline int cross(point a,point b) {return a.x*b.y-b.x*a.y;} inline void link(edge *e,int u,int v) {
e[++cnt]=(edge){u,v,head[u],0};head[u]=cnt;
e[++cnt]=(edge){v,u,head[v],0};head[v]=cnt;
}
inline void build(int x) {
for (int i=x;!d[i].id;i=next[i]) {
d[i].id=N;
int tmp=-cross(a[d[i].u],a[d[i].v]);
area[N]+=tmp;
}
}
inline void dfs(int x) {
sum[x]=area[x];SUM[x]=AREA[x];
for (int i=head[x];i;i=e[i].next) if (e[i].v!=par[x]) {
par[e[i].v]=x;
dfs(e[i].v);
sum[x]+=sum[e[i].v];SUM[x]+=SUM[e[i].v];
}
}
inline int edgeid(int u,int v) {
LL tmp=(LL)u*n+(LL)v-1;
int id=tmp%HAS;
for (int i=last[id];i;i=line[i].next)
if (line[i].w==tmp) return line[i].id;
}
int main() {
n=gi(),m=gi(),q=gi(),s=1;
for (int i=1;i<=n;++i) {
a[i].x=gi(),a[i].y=gi();
if (a[i].x<a[s].x || (a[i].x==a[s].x && a[i].y<a[s].y)) s=i;
}
for (int u,v,i=1;i<=m;++i) u=gi(),v=gi(),link(d,u,v);
for (int i=1;i<=n;++i) { //以i为起点的边极角排序
for (int j=head[i];j;j=d[j].next)
V[i].push_back(make_pair(atan2(a[d[j].v].y-a[i].y,a[d[j].v].x-a[i].x),j));
sort(V[i].begin(),V[i].end());
for (int j=0,k=V[i].size();j<k;++j) next[V[i][j].second^1]=V[i][(j+1)%k].second; //next[x]表示走完边x后该走的边
}
N=1;build(V[s][0].second);area[1]=AREA[1]=0; //先抠无穷域,面积赋为0
for (int i=2;i<=cnt;++i) if (!d[i].id) {++N;build(i);AREA[N]=area[N]*area[N],area[N]<<=1;}
for (int i=2;i<=cnt;++i) { //hash
LL tmp=(LL)d[i].u*n+(LL)d[i].v-1;
int id=tmp%HAS;
line[++ccc]=(chain){tmp,i,last[id]};last[id]=ccc;
}
memset(head,0,sizeof(head));
for (int i=1;i<=N;++i) fa[i]=i;
int tmp=cnt;cnt=0;
for (int i=2;i<=tmp;i+=2) { //随意构一棵域之间的生成树
int u=d[i].id,v=d[i^1].id;
int r1=find(u),r2=find(v);
if (r1!=r2) fa[r1]=r2,link(e,u,v),d[i].next=d[i^1].next=-1;
}
dfs(1); //dfs统计一下子树权值和以及父亲关系
while (q--) {
LL tmp=P,c=(gi()+tmp)%n+1;
s=(gi()+tmp)%n+1;
P=0,Q=0;
for (int u,v=s,i=1;i<=c;++i) {
u=v,v=i==c ? s : (gi()+tmp)%n+1;
int t=edgeid(u,v);
if (d[t].next!=-1) continue;
int x=d[t].id,y=d[t^1].id;
if (par[x]==y) P-=SUM[x],Q-=sum[x];
else if (par[y]==x) P+=SUM[y],Q+=sum[y];
}
LL G=gcd(P,Q);
P/=G,Q/=G;
printf("%lld %lld\n",P,Q);
}
return 0;
}
【bzoj4541】 Hnoi2016—矿区的更多相关文章
- BZOJ4541 HNOI2016矿区(平面图转对偶图)
考虑先将平面图转化为对偶图.具体地,将无向边拆成两条有向边.每次考虑找到包围一个区域的所有边.对当前考虑的边,找到该边的反向边在该边终点的出边集中,按极角序排序的后继,这条后继边也是包围该区域的边.这 ...
- [BZOJ4541][HNOI2016]矿区(平面图转对偶图)
https://www.cnblogs.com/ljh2000-jump/p/6423399.html #include<cmath> #include<vector> #in ...
- BZOJ4541 [Hnoi2016]矿区
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- [HNOI2016]矿区
[HNOI2016]矿区 平面图转对偶图 方法: 1.分成正反两个单向边,每个边属于一个面 2.每个点按照极角序sort出边 3.枚举每一个边,这个边的nxt就是反边的前一个(这样找到的是面的边逆时针 ...
- 【LG3249】[HNOI2016]矿区
[LG3249][HNOI2016]矿区 题面 洛谷 题解 先平面图转对偶图, 建好了对偶图之后随意拿出一个生成树,以无边界的范围为根. 无边界的范围很好求,用叉积算出有向面积时,算出来是负数的就是无 ...
- BZOJ 4541: [Hnoi2016]矿区 平面图转对偶图+DFS树
4541: [Hnoi2016]矿区 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 433 Solved: 182[Submit][Status][ ...
- 4541: [Hnoi2016]矿区
学习了一下平面图剖分的姿势,orz cbh 每次只要随便选择一条边,然后不停尽量向左转就行 #include <bits/stdc++.h> #define N 1300000 #defi ...
- ●BZOJ 4541 [Hnoi2016]矿区
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4541 题解: 平面图的对偶图,dfs树 平面图的对偶图的求法: 把所有双向边拆为两条互为反向 ...
- bzoj 4541: [Hnoi2016]矿区【平面图转对偶图+生成树】
首先平面图转对偶图,大概思路是每条边存正反,每个点存出边按极角排序,然后找每条边在它到达点的出边中极角排序的下一个,这样一定是这条边所属最小多边形的临边,然后根据next边找出所有多边形,用三角剖分计 ...
随机推荐
- mysql删除表中的记录
大家都知道,在MySQL中删除一个表中的记录有两种方法,一种是DELETE FROM TABLENAME WHERE... , 还有一种是TRUNCATE TABLE TABLENAME. DELET ...
- PHP核心技术——反射
反射: 反射指在PHP运行状态中,扩展分析PHP程序,导出或提取出关于类.方法.属性.参数等的详细信息,包括注释.这种动态获取信息以及动态调用对象方法的功能称为反射API class person{ ...
- happybase(TSocket read 0 bytes)
关于报错happybase 是使用python连接hbase的一个第三方库,目前基于thrift1 .在使用过程中经常碰到报错 TTransportException(type=4, message= ...
- Windows Server平台 confluence6.7.1安装与破解
1.1硬件需求建议: CPU:32/64 bit 2.27GHz双核心以上之CPU: 内存:8GB以上: 硬盘:300GB,7200转以上: 建议数据库.Confluence等各自独立一台服务器. 1 ...
- WebRTC入门
什么是WebRTC? 众所周知,浏览器本身不支持相互之间直接建立信道进行通信,都是通过服务器进行中转.比如现在有两个客户端,甲和乙,他们俩想要通信,首先需要甲和服务器.乙和服务器之间建立信道.甲给乙发 ...
- Nginx内置的嵌入变量
Nginx核心模块ngx_http_core_module自带有许多内置嵌入的变量,这些变量方便我们配置和使用nginx,在nginx的配置文件中我们可以以$开头直接使用这些变量,这些变量表示客户端请 ...
- 01-numpy基础简介
import numpy as np # ndarray ''' # 三种创建方式 1.从python的基础数据对象转化 2.通过numpy内置的函数生成 3.从硬盘(文件)读取数据 ''' # 创建 ...
- Yii2 创建新项目目录
默认的高级应用模板包括三个应用 backend – 应用的后台 frontend – 应用的前台 console – 应用的控制台应用 那么如果我们要在增加应用呢?比如在加一个手机端的应用,或者后台和 ...
- HotSpot JVM 常用配置设置
本文讨论的选项是针对HotSpot虚拟机的. 1.选项分类及语法 HotspotJVM提供以下三大类选项: 1.1.标准选项 这类选项的功能是很稳定的,在后续版本中也不太会发生变化. 运行java或者 ...
- Java第二次实验20135204
一.实验过程: 1.先创建一个学号命名的文档: 2.一个百分制成绩转化为等级: 3.新建一个包,另一个测试: 4.打开UML,建模软件umbrello进行建模: 相关程序: 5.我的保存: 二.遇到的 ...