bzoj 4541: [Hnoi2016]矿区【平面图转对偶图+生成树】
首先平面图转对偶图,大概思路是每条边存正反,每个点存出边按极角排序,然后找每条边在它到达点的出边中极角排序的下一个,这样一定是这条边所属最小多边形的临边,然后根据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]矿区【平面图转对偶图+生成树】的更多相关文章
- BZOJ 4541: [Hnoi2016]矿区 平面图转对偶图+DFS树
4541: [Hnoi2016]矿区 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 433 Solved: 182[Submit][Status][ ...
- ●BZOJ 4541 [Hnoi2016]矿区
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4541 题解: 平面图的对偶图,dfs树 平面图的对偶图的求法: 把所有双向边拆为两条互为反向 ...
- [BZOJ4541][HNOI2016]矿区(平面图转对偶图)
https://www.cnblogs.com/ljh2000-jump/p/6423399.html #include<cmath> #include<vector> #in ...
- 4541: [Hnoi2016]矿区
学习了一下平面图剖分的姿势,orz cbh 每次只要随便选择一条边,然后不停尽量向左转就行 #include <bits/stdc++.h> #define N 1300000 #defi ...
- BZOJ 4423: [AMPPZ2013]Bytehattan 平面图转对偶图 + 并查集
Description 比特哈顿镇有n*n个格点,形成了一个网格图.一开始整张图是完整的.有k次操作,每次会删掉图中的一条边(u,v),你需要回答在删除这条边之后u和v是否仍然连通. Input 第一 ...
- [HNOI2016]矿区
[HNOI2016]矿区 平面图转对偶图 方法: 1.分成正反两个单向边,每个边属于一个面 2.每个点按照极角序sort出边 3.枚举每一个边,这个边的nxt就是反边的前一个(这样找到的是面的边逆时针 ...
- BZOJ 4541 【HNOI2016】 矿区
题目链接:矿区 这道题去年暑假就想写了,但是一直拖拉,以至于现在才来写这道题.以前一直在刻意回避几何类的题目,但到了现在这个时候,已经没有什么好害怕的了. 正巧今天神犇\(xzy\)讲了这道题,那我就 ...
- LOJ#2052. 「HNOI2016」矿区(平面图转对偶图)
题面 传送门 题解 总算会平面图转对偶图了-- 首先我们把无向边拆成两条单向边,这样的话每条边都属于一个面.然后把以每一个点为起点的边按极角排序,那么对于一条边\((u,v)\),我们在所有以\(v\ ...
- 【BZOJ 2007】 2007: [Noi2010]海拔 (平面图转对偶图+spfa)
2007: [Noi2010]海拔 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2504 Solved: 1195 Description YT市 ...
随机推荐
- Unable to run Kiwi tests on iOS8 device
本文转载至 http://stackoverflow.com/questions/25871601/unable-to-run-kiwi-tests-on-ios8-device 5down vote ...
- 【BZOJ3728】PA2014Final Zarowki 贪心
[BZOJ3728]PA2014Final Zarowki Description 有n个房间和n盏灯,你需要在每个房间里放入一盏灯.每盏灯都有一定功率,每间房间都需要不少于一定功率的灯泡才可以完全照 ...
- EasyPusher:基于live555的DarwinInjector实现的RTSP直播推送程序
先简单介绍一下EasyPusher的功能,后面再对具体内部架构做介绍: EasyPusher:https://github.com/EasyDarwin/EasyPusher EasyPusher是什 ...
- 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 ...
- 在给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 ...
- Git 忽略上传文件设置 .gitignore exclude
1.项目根目录下创建.gitignore vi .gitignore #输入需要忽略的文件,支持正则表达式, *.o *.exe*.pyc 可以用git status来检查是否生效 未添加文件前: M ...
- Jpa生成mysql注释,添加ODBC数据源导入数据到EA
通过Jpa 注解生成表注释 实体类中使用如下注解,生成表字段注释: @Column(name = "userid", columnDefinition = "varcha ...
- java基础汇总
1.关于Http和Hibernatet里面Session的区别HttpSession HttpSession:是一个抽象接口,J2EE的Web程序在运行的时候,会给每一个新的访问者建立一个H ...
- FusionCharts Free 甘特图
用FusionCharts做甘特图 1.同步方式(用xml格式字符) 前台aspx代码 <!DOCTYPE html> <html xmlns="http://www.w3 ...
- IDEA 设置背景颜色及字号
intellij IDEA 设置背景颜色 File--> Settings 2. Appearance & Behavior --> Appearance 设置边框背景颜色 3 ...