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]矿区(平面图转对偶图)的更多相关文章

  1. BZOJ 4541: [Hnoi2016]矿区 平面图转对偶图+DFS树

    4541: [Hnoi2016]矿区 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 433  Solved: 182[Submit][Status][ ...

  2. BZOJ4541 [Hnoi2016]矿区

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  3. BZOJ4541 HNOI2016矿区(平面图转对偶图)

    考虑先将平面图转化为对偶图.具体地,将无向边拆成两条有向边.每次考虑找到包围一个区域的所有边.对当前考虑的边,找到该边的反向边在该边终点的出边集中,按极角序排序的后继,这条后继边也是包围该区域的边.这 ...

  4. [HNOI2016]矿区

    [HNOI2016]矿区 平面图转对偶图 方法: 1.分成正反两个单向边,每个边属于一个面 2.每个点按照极角序sort出边 3.枚举每一个边,这个边的nxt就是反边的前一个(这样找到的是面的边逆时针 ...

  5. LOJ#2052. 「HNOI2016」矿区(平面图转对偶图)

    题面 传送门 题解 总算会平面图转对偶图了-- 首先我们把无向边拆成两条单向边,这样的话每条边都属于一个面.然后把以每一个点为起点的边按极角排序,那么对于一条边\((u,v)\),我们在所有以\(v\ ...

  6. bzoj 4541: [Hnoi2016]矿区【平面图转对偶图+生成树】

    首先平面图转对偶图,大概思路是每条边存正反,每个点存出边按极角排序,然后找每条边在它到达点的出边中极角排序的下一个,这样一定是这条边所属最小多边形的临边,然后根据next边找出所有多边形,用三角剖分计 ...

  7. 【LG3249】[HNOI2016]矿区

    [LG3249][HNOI2016]矿区 题面 洛谷 题解 先平面图转对偶图, 建好了对偶图之后随意拿出一个生成树,以无边界的范围为根. 无边界的范围很好求,用叉积算出有向面积时,算出来是负数的就是无 ...

  8. 【BZOJ-2007】海拔 最小割 (平面图转对偶图 + 最短路)

    2007: [Noi2010]海拔 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2095  Solved: 1002[Submit][Status] ...

  9. 平面图转对偶图(Bzoj1001:狼抓兔子)

    如果只会用最小割做这道题那就太菜辣 引入 来自某学长 平面图:在平面上边不相交的图(边可以绕着画) 那么平面图的边与边就围成了许多个区域(这与你画图的方式有关) 定义对偶图:把相邻的两个区域连上边,形 ...

随机推荐

  1. AD域相关的属性和C#操作AD域

     “常规”标签  姓 Sn 名 Givename 英文缩写 Initials 显示名称 displayName 描述 Description 办公室 physicalDeliveryOfficeNam ...

  2. 【vim】缩写 :ab [缩写] [要替换的文字]

    一个很可能是最令人印象深刻的窍门是你可以在 Vim 中定义缩写,它可以实时地把你输入的东西替换为另外的东西.语法格式如下: :ab [缩写] [要替换的文字] 一个通用的例子是: :ab asap a ...

  3. ARMV8 datasheet学习笔记4:AArch64系统级体系结构之Self-hosted debug

    1. 前言 2. 关于self-hosted debug Debugger调试器 是操作系统或系统软件的一部分,它会处理debug exception或修改debug system register, ...

  4. 使用C#进行应用程序间通信(WPF与Unity通信)

    首先程序主体来自网络,我只是应用在我自己的项目中,其中出现了一系列的问题,有些已经解决,有些使用了折中的方案,如果有大神能够给予知道,感激不尽! 首先是发送端程序: 这是我的程序任务执行主界面,此处已 ...

  5. svn使用openldap验证apache访问方式

    启用svn服务器的sasl验证机制 1.安装cyrus-sasl认证包 # yum install -y *sasl* # rpm -qa|grep sasl cyrus-sasl-2.1.23-15 ...

  6. JS算法之二分查找

    二分查找法主要是解决「在一堆有序的数中找出指定的数」这类问题,不管这些数是一维数组还是 多维数组,只要有序,就可以用二分查找来优化. 二分查找是一种「分治」思想的算法,大概流程如下: 1.数组中排在中 ...

  7. 总结Selenium WebDriver中一些鼠标和键盘事件的使用

    在使用 Selenium WebDriver 做自动化测试的时候,会经常模拟鼠标和键盘的一些行为.比如使用鼠标单击.双击.右击.拖拽等动作:或者键盘输入.快捷键使用.组合键使用等模拟键盘的操作.在 W ...

  8. jmeter打开其他设备转过来的历史脚本出现报错

    报错大概如下 missing class com.thoughtworks.xstream.converters.ConversionException Debugging information 还 ...

  9. FakeImageExploiter v1.3

    FakeImageExploiter v1.3 - backdoor images.jpg[.ps1] CodeName: Metamorphosis Version release: v1.3 (S ...

  10. Codeigniter使用HMVC(一)

    涉及三方代码: https://tutorials.kode-blog.com/codeigniter-admin-panel https://bitbucket.org/wiredesignz/co ...