[BZOJ4541][HNOI2016]矿区(平面图转对偶图)
https://www.cnblogs.com/ljh2000-jump/p/6423399.html
#include<cmath>
#include<vector>
#include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
typedef long long ll;
using namespace std; const int N=;
int n,m,Q,x,y,d,cnt=,nxt[N],tot,rt,bel[N],fa[N],ask[N];
bool vis[N],in[N];
ll s[N],sp[N],fz,fm; struct P{ int x,y; }p[N];
P operator -(const P &a,const P &b){ return (P){a.x-b.x,a.y-b.y}; }
ll operator *(const P &a,const P &b){ return 1ll*a.x*b.y-1ll*b.x*a.y; } struct E{
int u,v,id; double sl;
E(){}; E(int a,int b,int i):u(a),v(b),id(i),sl(atan2(p[b].y-p[a].y,p[b].x-p[a].x)){}
}e[N];
bool operator <(const E &a,const E &b){ return a.sl<b.sl; }
vector<E>w[N],tr[N];
void add(int u,int v){ cnt++; e[cnt]=(E){u,v,cnt}; w[u].push_back(e[cnt]); } ll gcd(ll a,ll b){ return b ? gcd(b,a%b) : a; } int find(int x,E b){
int l=,r=w[x].size()-;
while (l<r){
int mid=(l+r+)>>;
if (b<w[x][mid]) r=mid-; else l=mid;
}
return l;
} void dfs(int x){
vis[x]=; sp[x]=s[x]*s[x]; s[x]<<=; int ed=tr[x].size()-;
rep(i,,ed){
int v=tr[x][i].v; if (vis[v]) continue;
fa[v]=x; in[tr[x][i].id]=in[tr[x][i].id^]=;
dfs(v); s[x]+=s[v]; sp[x]+=sp[v];
}
} int main(){
freopen("bzoj4541.in","r",stdin);
freopen("bzoj4541.out","w",stdout);
scanf("%d%d%d",&n,&m,&Q);
rep(i,,n) scanf("%d%d",&x,&y),p[i]=(P){x,y};
rep(i,,m) scanf("%d%d",&x,&y),add(x,y),add(y,x);
rep(i,,n) sort(w[i].begin(),w[i].end());
rep(i,,cnt){
int ne=find(e[i].v,e[i^])-;
if (ne==-) ne=w[e[i].v].size()-;
nxt[i]=w[e[i].v][ne].id;
}
rep(i,,cnt) if (!bel[i]){
bel[i]=bel[nxt[i]]=++tot;
for (int x=nxt[i]; e[x].v!=e[i].u; x=nxt[x],bel[x]=tot)
s[tot]+=(p[e[x].u]-p[e[i].u])*(p[e[x].v]-p[e[i].u]);
if (s[tot]<=) rt=tot;
}
rep(i,,cnt) tr[bel[i]].push_back(E(bel[i],bel[i^],i));
dfs(rt);
while (Q--){
scanf("%d",&d); d=(d+fz)%n+;
rep(i,,d) scanf("%d",&ask[i]),ask[i]=(ask[i]+fz)%n+;
ask[d+]=ask[]; fz=fm=;
rep(i,,d){
int x=w[ask[i]][find(ask[i],E(ask[i],ask[i+],))].id;
if (!in[x]) continue;
if (fa[bel[x]]==bel[x^]) fm+=s[bel[x]],fz+=sp[bel[x]];
else fm-=s[bel[x^]],fz-=sp[bel[x^]];
}
ll d=gcd(fz,fm); fz/=d; fm/=d; printf("%lld %lld\n",fz,fm);
}
return ;
}
[BZOJ4541][HNOI2016]矿区(平面图转对偶图)的更多相关文章
- BZOJ 4541: [Hnoi2016]矿区 平面图转对偶图+DFS树
4541: [Hnoi2016]矿区 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 433 Solved: 182[Submit][Status][ ...
- BZOJ4541 [Hnoi2016]矿区
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- BZOJ4541 HNOI2016矿区(平面图转对偶图)
考虑先将平面图转化为对偶图.具体地,将无向边拆成两条有向边.每次考虑找到包围一个区域的所有边.对当前考虑的边,找到该边的反向边在该边终点的出边集中,按极角序排序的后继,这条后继边也是包围该区域的边.这 ...
- [HNOI2016]矿区
[HNOI2016]矿区 平面图转对偶图 方法: 1.分成正反两个单向边,每个边属于一个面 2.每个点按照极角序sort出边 3.枚举每一个边,这个边的nxt就是反边的前一个(这样找到的是面的边逆时针 ...
- LOJ#2052. 「HNOI2016」矿区(平面图转对偶图)
题面 传送门 题解 总算会平面图转对偶图了-- 首先我们把无向边拆成两条单向边,这样的话每条边都属于一个面.然后把以每一个点为起点的边按极角排序,那么对于一条边\((u,v)\),我们在所有以\(v\ ...
- bzoj 4541: [Hnoi2016]矿区【平面图转对偶图+生成树】
首先平面图转对偶图,大概思路是每条边存正反,每个点存出边按极角排序,然后找每条边在它到达点的出边中极角排序的下一个,这样一定是这条边所属最小多边形的临边,然后根据next边找出所有多边形,用三角剖分计 ...
- 【LG3249】[HNOI2016]矿区
[LG3249][HNOI2016]矿区 题面 洛谷 题解 先平面图转对偶图, 建好了对偶图之后随意拿出一个生成树,以无边界的范围为根. 无边界的范围很好求,用叉积算出有向面积时,算出来是负数的就是无 ...
- 【BZOJ-2007】海拔 最小割 (平面图转对偶图 + 最短路)
2007: [Noi2010]海拔 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2095 Solved: 1002[Submit][Status] ...
- 平面图转对偶图(Bzoj1001:狼抓兔子)
如果只会用最小割做这道题那就太菜辣 引入 来自某学长 平面图:在平面上边不相交的图(边可以绕着画) 那么平面图的边与边就围成了许多个区域(这与你画图的方式有关) 定义对偶图:把相邻的两个区域连上边,形 ...
随机推荐
- 【转】SSH服务详解
[转]SSH服务详解 第1章 SSH服务 1.1 SSH服务协议说明 SSH 是 Secure Shell Protocol 的简写,由 IETF 网络工作小组(Network Working Gro ...
- hdfs haadmin命令
HA集群启动后,我们可以通过一些指令来管理HDFS集群."bin/hdfs haadmin -DFSHAAdmin"指令,其可选参数: 1.-transitionToActive ...
- 命令行command line 使用 http proxy的设置方法 Setting Up HTTP Proxy in Terminal
Step 1: Install Shadowsocks Client Shadowsocks is an open-source proxy project to help people visit ...
- Nginx软件优化【转】
转自 Nginx软件优化 - 惨绿少年 - 博客园 Nginx软件优化 - 惨绿少年 - 博客园 https://www.cnblogs.com/clsn/p/8484559.html 1.1 Ngi ...
- nodejs的 new String
已知rwo4的记录中baitaiid是001// row4为jhlist开始循环结果 for(var i=0;i<row4.length;i++) { var baiTaiId=new Stri ...
- 分布式调用技术 RPC VS REST
一 分布式调用大体上就分为两类,RPC式的,REST式的,两者的区别主要是就是: 1. RPC是面向动作的(方法调用) 2. REST是面向资源的(URL表示资源,HTTP动词表示动作) 从变现形式来 ...
- PYTHON-面向对象 继承 派生
1. 什么是继承 继承是一种新建类的方式,新建的类称之为子类/派生类,被继承的类称之为父类/基类/超类 继承有3个特点: 1. 子类可以遗传/重用父类的属性(解决类与类之间代码冗余的问题) 2. 在p ...
- Java基础94 分页查询(以MySQL数据库为例)
1.概述 分页查询,也可叫做分批查询,基于数据库的分页语句(不同数据库是不同的). 本文使用的事MySql数据库. 假设:每页显示10条数据. Select * from c ...
- iOS中按钮点击事件处理方式
写在前面 在iOS开发中,时常会用到按钮,通过按钮的点击来完成界面的跳转等功能.按钮事件的实现方式有多种,其中 较为常用的是目标-动作对模式.但这种方式使得view与controller之间的耦合程度 ...
- IntelliJ IDEA 下的SVN使用
最近公司的很多同事开始使用IntelliJ Idea,便尝试了一下,虽然快捷键与eclipse 有些不同,但是强大的搜索功能与“漂亮的界面”(个人认为没有eclipse好看 ),还是值得我们去使用的. ...