首先平面图转对偶图,大概思路是每条边存正反,每个点存出边按极角排序,然后找每条边在它到达点的出边中极角排序的下一个,这样一定是这条边所属最小多边形的临边,然后根据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. Unable to run Kiwi tests on iOS8 device

    本文转载至 http://stackoverflow.com/questions/25871601/unable-to-run-kiwi-tests-on-ios8-device 5down vote ...

  2. 【BZOJ3728】PA2014Final Zarowki 贪心

    [BZOJ3728]PA2014Final Zarowki Description 有n个房间和n盏灯,你需要在每个房间里放入一盏灯.每盏灯都有一定功率,每间房间都需要不少于一定功率的灯泡才可以完全照 ...

  3. EasyPusher:基于live555的DarwinInjector实现的RTSP直播推送程序

    先简单介绍一下EasyPusher的功能,后面再对具体内部架构做介绍: EasyPusher:https://github.com/EasyDarwin/EasyPusher EasyPusher是什 ...

  4. Running several name-based web sites on a single IP address.

    VirtualHost Examples - Apache HTTP Server Version 2.2 http://httpd.apache.org/docs/2.2/vhosts/exampl ...

  5. 在给mysql数据库备份时,报错: mysqldump: Got error: 145: Table '.\shengdaxcom\pre_forum_thread' is marked as c rashed and should be repaired when using LOCK TABLES

    在给mysql数据库备份时,报错: mysqldump: Got error: 145: Table '.\shengdaxcom\pre_forum_thread' is marked as cra ...

  6. Git 忽略上传文件设置 .gitignore exclude

    1.项目根目录下创建.gitignore vi .gitignore #输入需要忽略的文件,支持正则表达式, *.o *.exe*.pyc 可以用git status来检查是否生效 未添加文件前: M ...

  7. Jpa生成mysql注释,添加ODBC数据源导入数据到EA

    通过Jpa 注解生成表注释 实体类中使用如下注解,生成表字段注释: @Column(name = "userid", columnDefinition = "varcha ...

  8. java基础汇总

    1.关于Http和Hibernatet里面Session的区别HttpSession      HttpSession:是一个抽象接口,J2EE的Web程序在运行的时候,会给每一个新的访问者建立一个H ...

  9. FusionCharts Free 甘特图

    用FusionCharts做甘特图 1.同步方式(用xml格式字符) 前台aspx代码 <!DOCTYPE html> <html xmlns="http://www.w3 ...

  10. IDEA 设置背景颜色及字号

    intellij IDEA 设置背景颜色   File--> Settings 2. Appearance & Behavior --> Appearance 设置边框背景颜色 3 ...