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

然后就比较妙了,把对偶图随便搞一个生成树出来,然后对于每个询问,如果一条边是树边,那么如果这条边在树上是向上的就加它子树的和,否则就减

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
const int N=2000005;
int n,m,k,cnt=1,tot,rt,a[N],fa[N],ne[N],c[N];
long long s1[N],s2[N],ans1,ans2;
bool v[N],vis[N];
struct dian
{
double x,y;
dian(double X=0,double Y=0)
{
x=X,y=Y;
}
dian operator + (const dian &a) const
{
return dian(x+a.x,y+a.y);
}
dian operator - (const dian &a) const
{
return dian(x-a.x,y-a.y);
}
}p[N];
struct bian
{
int x,y,id;
double a;
bian(int X=0,int Y=0,int ID=0)
{
x=X,y=Y,id=ID,a=atan2(p[y].y-p[x].y,p[y].x-p[x].x);
}
bool operator < (const bian &b) const
{
return a<b.a;
}
}b[N];
vector<bian>f[N],g[N];
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
double cj(dian a,dian b)
{
return a.x*b.y-a.y*b.x;
}
long long gcd(long long a,long long b)
{
return !b?a:gcd(b,a%b);
}
void dfs(int u)
{
vis[u]=1;
for(int i=0;i<g[u].size();i++)
if(!vis[g[u][i].y])
{
fa[g[u][i].y]=u;
v[g[u][i].id]=v[g[u][i].id^1]=1;
dfs(g[u][i].y);
s1[u]+=s1[g[u][i].y];
s2[u]+=s2[g[u][i].y];
}
}
int main()
{
n=read(),m=read(),k=read();
for(int i=1;i<=n;i++)
p[i].x=read(),p[i].y=read();
for(int i=1;i<=m;i++)
{
int x=read(),y=read();
cnt++;
b[cnt]=bian(x,y,cnt);
f[x].push_back(b[cnt]);
cnt++;
b[cnt]=bian(y,x,cnt);
f[y].push_back(b[cnt]);
}
for(int i=1;i<=n;i++)
sort(f[i].begin(),f[i].end());
for(int i=2;i<=cnt;i++)
{
int nw=lower_bound(f[b[i].y].begin(),f[b[i].y].end(),b[i^1])-f[b[i].y].begin()-1;
if(nw<0)
nw+=f[b[i].y].size();
ne[i]=f[b[i].y][nw].id;
}
for(int i=2;i<=cnt;i++)
if(!c[i])
{
long long mj=0,nw=i,st=b[i].x;
c[i]=++tot;
while(1)
{
int tmp=ne[nw];
c[tmp]=tot;
if(b[tmp].y==st)
break;
mj+=cj(p[b[tmp].x]-p[st],p[b[tmp].y]-p[st]);
nw=tmp;
}
s1[tot]=mj*mj,s2[tot]=mj;
if(mj<=0)
rt=tot;
}
for(int i=2;i<=cnt;i++)
g[c[i]].push_back(bian(c[i],c[i^1],i));
dfs(rt);
// for(int i=1;i<=cnt;i++)
// cerr<<v[i]<<" ";cerr<<endl;
while(k--)
{
int tot=(read()+ans1)%n+1;
for(int i=1;i<=tot;i++)
a[i]=(read()+ans1)%n+1;
ans1=ans2=0;
a[tot+1]=a[1];
for(int i=1;i<=tot;i++)
{
int nw=f[a[i]][lower_bound(f[a[i]].begin(),f[a[i]].end(),bian(a[i],a[i+1],0))-f[a[i]].begin()].id;
if(v[nw])
{
if(c[nw]==fa[c[nw^1]])
ans1+=s1[c[nw^1]],ans2+=s2[c[nw^1]];
else
ans1-=s1[c[nw]],ans2-=s2[c[nw]];
}
}
if(ans2<0)
ans1*=-1,ans2*=-1;
long long g=gcd(ans1,ans2);
ans1/=g,ans2/=g;
if(ans1&1)
ans2<<=1;
else
ans1>>=1;
printf("%lld %lld\n",ans1,ans2);
}
return 0;
}

bzoj 4541: [Hnoi2016]矿区【平面图转对偶图+生成树】的更多相关文章

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

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

  2. ●BZOJ 4541 [Hnoi2016]矿区

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

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

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

  4. 4541: [Hnoi2016]矿区

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

  5. BZOJ 4423: [AMPPZ2013]Bytehattan 平面图转对偶图 + 并查集

    Description 比特哈顿镇有n*n个格点,形成了一个网格图.一开始整张图是完整的.有k次操作,每次会删掉图中的一条边(u,v),你需要回答在删除这条边之后u和v是否仍然连通. Input 第一 ...

  6. [HNOI2016]矿区

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

  7. BZOJ 4541 【HNOI2016】 矿区

    题目链接:矿区 这道题去年暑假就想写了,但是一直拖拉,以至于现在才来写这道题.以前一直在刻意回避几何类的题目,但到了现在这个时候,已经没有什么好害怕的了. 正巧今天神犇\(xzy\)讲了这道题,那我就 ...

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

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

  9. 【BZOJ 2007】 2007: [Noi2010]海拔 (平面图转对偶图+spfa)

    2007: [Noi2010]海拔 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2504  Solved: 1195 Description YT市 ...

随机推荐

  1. PHP中的面向对象 中的类(class)

    2.11 上午讲的是面向对象中的类(class),一个非常抽象的概念, 类里面成员的定义有 public$abc; private$abc(私有变量): protect $abc(受保护的变量): 下 ...

  2. EasyCamera海康摄像机向EasyDarwin云平台推送音视频数据的缓存设计

    本文转自EasyDarwin团队成员Alex的博客:http://blog.csdn.net/cai6811376 EasyCamera在向EasyDarwin云平台推送音视频数据时,有时一个I帧会很 ...

  3. 用live555将内网摄像机视频推送到外网服务器,附源码

    最近很多人问,如何将内网的摄像机流媒体数据发布到公网,如果用公网与局域网间的端口映射方式太过麻烦,一个摄像机要做一组映射,而且不是每一个局域网都是有固定ip地址,即使外网主机配置好了每一个摄像机的映射 ...

  4. EasyRTSPClient:基于live555封装的支持重连的RTSP客户端RTSPClient

    今天先简单介绍一下EasyRTSPClient,后面的文章我们再仔细介绍EasyRTSPClient内部的设计过程: EasyRTSPClient:https://github.com/EasyDar ...

  5. 基于EasyDarwin实现幼儿园监控类项目

    移动互联网越来越普及,幼儿园监控类的项目也越来越多,如何能够以最低的成本.最快的速度搭建一套幼儿园监控类的平台成了许多开发者的需求,那么我们今天就来简单探讨一下如何基于EasyDarwin实现一套幼儿 ...

  6. 指定查询条件,查询对应的集合List(单表)

    TestDao.java(测试类) @Test public void findCollectionByConditionNoPage(){  ApplicationContext ac = new ...

  7. 超简单易用的 “在 pcduino 开发板上写 Linux 驱动控制板载 LED 的闪烁”

    版权声明:本文为博主原创文章,未经博主同意不得转载.转载联系 QQ 30952589,加好友请注明来意. https://blog.csdn.net/sleks/article/details/251 ...

  8. windows server安装oracle

    倒腾windows server的时候一定要先整net framework然后再安装oracle不然连不上或者装一下client 也能连上但是为了不安装client一定要先装framework!

  9. 阿里妈妈-RAP项目的实践(2)

    接口详情 (id: 32872) Mock数据 接口名称 datalist1 请求类型 get 请求Url /datas/list1 接口描述 数据列表 请求参数列表 变量名 含义 类型 备注 响应参 ...

  10. poj3349 Snowflake Snow Snowflakes —— 哈希表

    题目链接:http://poj.org/problem?id=3349 题意:雪花有6个瓣,有n个雪花,输入每个雪花的瓣长,判断是否有一模一样的雪花(通过旋转或翻转最终一样,即瓣长对应相等).如果前面 ...