[HNOI2016]矿区

时间:2022-09-24 14:02:46

[HNOI2016]矿区

平面图转对偶图

方法:

1.分成正反两个单向边,每个边属于一个面

2.每个点按照极角序sort出边

3.枚举每一个边,这个边的nxt就是反边的前一个(这样找到的是面的边逆时针的)

4.相当有了置换,把每个nxt环找到,加上统一编号,并计算面积

5.有向面积为负数的是无限域,仅有一个

6.原来的单向边“旋转90度”,连接两个面

然后本题再跑一个以无限域为根的生成树

记录每个原来的边是否是生成树上的边

并记录生成树子树的S和S^2

询问:

如果当前的边是生成树边的话,如果属于的面作为儿子,加上S和S^2,否则减去

当面的边逆时针求出的,多边形也是逆时针给出的时候,显然是正确的

(画图理解)

注意新图的点数是2*n级别的。

#include<bits/stdc++.h>
#define reg register int
#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^'0')
#define int long long
using namespace std;
typedef long long ll;
template<class T>il void rd(T &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
template<class T>il void output(T x){if(x/)output(x/);putchar(x%+'');}
template<class T>il void ot(T x){if(x<) putchar('-'),x=-x;output(x);putchar(' ');}
template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');} namespace Miracle{ const int M=+;
const int N=2e5+;
const double eps=1e-;
int n,m,q;
struct po{
ll x,y;
po(){}
po(ll xx,ll yy){
x=xx;y=yy;
}
po friend operator -(po a,po b){
return po(a.x-b.x,a.y-b.y);
}
ll friend operator *(po a,po b){
return a.x*b.y-a.y*b.x;
}
}p[N];
struct edge{
int x,y,id;
double du;
bool friend operator <(edge a,edge b){
if(fabs(a.du-b.du)<eps) return a.y<b.y;
return a.du<b.du;
}
}e[M];
int tot=;
int pos[M],nxt[M];
int on[M];
double an(const po &a,const po &b){//a->b
return atan2(b.y-a.y,b.x-a.x);
}
vector<edge>to[N],b[M];
void add(int x,int y){
e[++tot].x=x;e[tot].y=y;
e[tot].du=atan2(p[y].y-p[x].y,p[y].x-p[x].x);
e[tot].id=tot;
to[x].push_back(e[tot]);
} int cnt;
ll S[M];
int rt;
int mem[M];
void build(){
for(reg i=;i<=n;++i) sort(to[i].begin(),to[i].end());
for(reg i=;i<=tot;++i){
// edge now=(edge){e[i].y,e[i].x,i^1,an(p[e[i].y],p[e[i].x])};
auto it=lower_bound(to[e[i].y].begin(),to[e[i].y].end(),e[i^]);
if(it!=to[e[i].y].begin()) --it;
else it=to[e[i].y].end(),--it;
nxt[i]=(*it).id;
}
for(reg i=;i<=tot;++i){
if(pos[i]) continue;
pos[i]=pos[nxt[i]]=++cnt;
for(reg j=nxt[i];e[j].y!=e[i].x;j=nxt[j],pos[j]=cnt){
S[cnt]+=(p[e[j].x]-p[e[i].x])*(p[e[j].y]-p[e[i].x]);
}
if(S[cnt]<=) rt=cnt;
}
for(reg i=;i<=tot;++i){
b[pos[i]].push_back((edge){pos[i],pos[i^],i,});
}
}
ll S2[M];
int fa[M];
bool vis[M];
void dfs(int x){
// cout<<" xx "<<x<<endl;
vis[x]=;
S2[x]=S[x]*S[x];S[x]<<=;
for(reg i=;i<(int)b[x].size();++i){
int y=b[x][i].y;
if(y==fa[x]) continue;
if(vis[y]) continue;
fa[y]=x;
on[b[x][i].id]=on[b[x][i].id^]=;
dfs(y);
S[x]+=S[y];
S2[x]+=S2[y];
}
}
ll son,mom;
ll gcd(ll a,ll b){
return b?gcd(b,a%b):a;
}
int main(){
rd(n);rd(m);rd(q);
for(reg i=;i<=n;++i){
rd(p[i].x);rd(p[i].y);
}
int x,y;
for(reg i=;i<=m;++i){
rd(x);rd(y);add(x,y);add(y,x);
}
build();
// cout<<" after build "<<endl;
// cout<<" cnt "<<cnt<<endl;
// prt(pos,2,tot);
// prt(nxt,2,tot);
// cout<<" rt "<<rt<<endl;
// prt(S,1,cnt);
dfs(rt); // prt(S2,1,cnt); // prt(on,2,tot); int k;
while(q--){
rd(k);
k=(k+son)%n+;
for(reg i=;i<=k;++i){
rd(x);
x=(x+son)%n+;
mem[i]=x;
}
int las=mem[k];
ll up=,dw=;
for(reg i=;i<=k;++i){
edge now=(edge){las,mem[i],,an(p[las],p[mem[i]])};
auto it=lower_bound(to[las].begin(),to[las].end(),now);
int id=(*it).id;
if(on[id]){
if(fa[pos[id]]==pos[id^]) up+=S2[pos[id]],dw+=S[pos[id]];
else up-=S2[pos[id^]],dw-=S[pos[id^]];
}
las=mem[i];
}
ll g=gcd(up,dw);
son=up/g;
mom=dw/g;
printf("%lld %lld\n",son,mom);
}
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2019/4/13 19:58:12
*/

[HNOI2016]矿区的更多相关文章

  1. 【LG3249】&lbrack;HNOI2016&rsqb;矿区

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

  2. BZOJ 4541&colon; &lbrack;Hnoi2016&rsqb;矿区 平面图转对偶图&plus;DFS树

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

  3. BZOJ4541 &lbrack;Hnoi2016&rsqb;矿区

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

  4. 4541&colon; &lbrack;Hnoi2016&rsqb;矿区

    学习了一下平面图剖分的姿势,orz cbh 每次只要随便选择一条边,然后不停尽量向左转就行 #include <bits/stdc++.h> #define N 1300000 #defi ...

  5. ●BZOJ 4541 &lbrack;Hnoi2016&rsqb;矿区

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4541 题解: 平面图的对偶图,dfs树 平面图的对偶图的求法: 把所有双向边拆为两条互为反向 ...

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

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

  7. &lbrack;BZOJ4541&rsqb;&lbrack;HNOI2016&rsqb;矿区&lpar;平面图转对偶图&rpar;

    https://www.cnblogs.com/ljh2000-jump/p/6423399.html #include<cmath> #include<vector> #in ...

  8. 【bzoj4541】 Hnoi2016—矿区

    http://www.lydsy.com/JudgeOnline/problem.php?id=4541 (题目链接) 题意 给出一个平面图,若干询问,每次询问一个凸多边形内小多边形面积的平方和与面积 ...

  9. bzoj 4541&colon; &lbrack;Hnoi2016&rsqb;矿区【平面图转对偶图&plus;生成树】

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

随机推荐

  1. LR破解版录制手机脚本(一)模拟器录制

    最近在网上听到好多童鞋都在问如何用LR做手机性能测试,恰好自己对这方面也挺感兴趣,经过查阅很多资料,形成此文档以做备注~!如果有感觉我写的不对的地方,敬请指正,谢谢~!     其实自从LR12出来之 ...

  2. 排序图解:js排序算法实现

    之前写过js实现数组去重, 今天继续研究数组: 排序算法实现. 排序是数据结构主要内容,并不限于语言主要在于思想:大学曾经用C语言研究过一段时间的排序实现, 这段时间有空用JS再将排序知识点熟悉一遍. ...

  3. 【社招】来杭州吧,阿里国际UED招前端~~

    来杭州吧,阿里国际UED招前端~~ 依稀记得,几年前在北京的日子,两点一线的生活方式,似乎冲淡模糊了身边的一切,印象最深刻的莫过于北京的地铁站了吧(因为只有等地铁,搭地铁的时候,才能够停下脚步,静静地 ...

  4. IOS 用正则表达式解析HTML等文件&comma;得到所有文本

    获得网页内容 NSURL *url=[NSURL URLWithString:@"http://121.199.34.52/wordpress/?json=core.get_post_con ...

  5. AHOI2009最小割

    1797: [Ahoi2009]Mincut 最小割 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1072  Solved: 446[Submit] ...

  6. MarkDown 格式生产类型

    -- 不默认换行, 真的结束, 包括格式设定,记得空一行. -- 学习参考地址如下, 讲的不好, 太复杂, 不适合新手. 有好读的更好. ** 但是江湖规矩 还是引用下吧 这是地址(http://wo ...

  7. vue&period;js&plus;boostrap

    vue.js+boostrap最佳实践 一.为什么要写这篇文章 最近忙里偷闲学了一下vue.js,同时也复习了一下boostrap,发现这两种东西如果同时运用到一起,可以发挥很强大的作用,boostr ...

  8. Backdoor CTF 2013&colon; 电子取证 250

    0x00 题目 h4x0r厌烦了你对他的城堡的所有攻击,所以他决定报复攻击你,他给你发来一封带有图片的邮件作为警告,希望你能找出他的警告消息:-) 消息的MD5值就是flag. 0x01 解题法1 给 ...

  9. 使用poi根据模版生成word文档,支持插入数据和图片

    一.制作word模版,${xxxx}是一会要替换的内容,最下面的表格是要插入数据,根据是否以$开头来判断是需要替换还是插入数据, 注意如果是需要插入数据,制作的表格模版需要一行空行,也只能有一行空行, ...

  10. 本地广播 localBroadcastManager Android

    使用localBroadcastManager发出的广播只能在本应用程序的内部进行传递. App应用内广播可理解为一种局部广播,广播的发送者和接收者都同属于一个App. 相比于全局广播(普通广播),A ...