「HNOI2016」矿区
题解
平面图转对偶图。。
首先我们转的话需要给所有的平面标号,然后找到每条边看看他们隔开了哪两个平面。
做法就是对每个点维护它的所有排好序的出边,然后对于每一条有序边找到它的一条后继边。
如果一直找下去,就会找到一个平面,依次标号就好了。
我们转好了对偶图,\(dfs\)出对偶图的一颗生成树,然后对于一次询问,它肯定是切出了树上的一些联通块。
所以我们讨论一下每一条边的方向算一下答案就好了。
代码
#include<bits/stdc++.h>
#define N 200009
#define M 1200009
using namespace std;
typedef long long ll;
const double eps=1e-9;
int tot=1,n,m,q,pos[M],rt,b[N],nxt[M],num;
ll s[M],S[M],f[M];
bool ms[M],vis[M];
inline ll rd(){
ll x=0;char c=getchar();bool f=0;
while(!isdigit(c)){if(c=='-')f=1;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();};
return f?-x:x;
}
struct point{
ll x,y;
inline point operator +(const point &b)const{return point{x+b.x,y+b.y};}
inline point operator -(const point &b)const{return point{x-b.x,y-b.y};}
inline ll operator *(const point &b)const{return x*b.y-y*b.x;}
}a[N];
struct edge{
int id,u,v;
double ang;
inline bool operator <(const edge &b)const{
if(fabs(ang-b.ang)>eps)return ang<b.ang;
}
}e[M];
vector<edge>vec[N];
vector<int>ed[M],ps[M];
inline void add(int x,int y){
++tot;e[tot]=edge{tot,x,y,atan2(a[y].y-a[x].y,a[y].x-a[x].x)};
vec[x].push_back(e[tot]);
}
inline void build(){
for(int i=1;i<=n;++i)sort(vec[i].begin(),vec[i].end());
for(int i=2;i<=tot;++i){
int id=e[i].v;
vector<edge>::iterator it=lower_bound(vec[id].begin(),vec[id].end(),e[i^1]);
if(it==vec[id].begin())it=vec[id].end();
--it;nxt[i]=it->id;
}
for(int i=2;i<=tot;++i)if(!pos[i]){
pos[i]=pos[nxt[i]]=++num;
int x=nxt[i];
while(1){
if(e[x].v==e[i].u)break;
s[num]+=(a[e[x].u]-a[e[i].u])*(a[e[x].v]-a[e[i].u]);
x=nxt[x];pos[x]=num;
}
if(s[num]<=0)rt=num,s[num]=0;
}
for(int i=2;i<=tot;++i)ed[pos[i]].push_back(pos[i^1]),ps[pos[i]].push_back(i);
}
void dfs(int u,int fa){
f[u]=fa;
S[u]=s[u]*s[u];s[u]<<=1;vis[u]=1;
for(int i=0;i<ed[u].size();++i){
int v=ed[u][i],tg=ps[u][i];
if(vis[v])continue;
ms[tg]=ms[tg^1]=1;
dfs(v,u);
S[u]+=S[v];s[u]+=s[v];
}
}
ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
void solve(){
ll ans1=0,ans2=0;
while(q--){
int x=(rd()+ans1)%n+1;
for(int i=1;i<=x;++i)b[i]=(rd()+ans1)%n+1;
ans1=ans2=0;
b[x+1]=b[1];
for(int i=1;i<=x;++i){
int xx=b[i],yy=b[i+1];
// cout<<xx<<" "<<ans1<<" "<<ans2<<" ";
edge z=edge{0,xx,yy,atan2(a[yy].y-a[xx].y,a[yy].x-a[xx].x)};
vector<edge>::iterator it=lower_bound(vec[xx].begin(),vec[xx].end(),z);
int j=it->id;
if(!ms[j])continue;
if(f[pos[j]]==pos[j^1])ans1+=S[pos[j]],ans2+=s[pos[j]];
else ans1-=S[pos[j^1]],ans2-=s[pos[j^1]];
}
ll g=gcd(ans1,ans2);
ans1/=g;ans2/=g;
printf("%lld %lld\n",ans1,ans2);
}
}
int main(){
n=rd();m=rd();q=rd();
int x,y;
for(int i=1;i<=n;++i){
x=rd();y=rd();
a[i]=point{x,y};
}
for(int i=1;i<=m;++i){
x=rd();y=rd();
add(x,y);add(y,x);
}
build();dfs(rt,0);solve();
return 0;
}
「HNOI2016」矿区的更多相关文章
- LOJ#2052. 「HNOI2016」矿区(平面图转对偶图)
题面 传送门 题解 总算会平面图转对偶图了-- 首先我们把无向边拆成两条单向边,这样的话每条边都属于一个面.然后把以每一个点为起点的边按极角排序,那么对于一条边\((u,v)\),我们在所有以\(v\ ...
- 【LOJ】#2052. 「HNOI2016」矿区
题解 之前尝试HNOI2016的时候弃坑的一道,然后给补回来 (为啥我一些计算几何就写得好长,不过我写啥都长orz) 我们尝试给这个平面图分域,好把这个平面图转成对偶图 怎么分呢,我今天也是第一次会 ...
- loj2052 「HNOI2016」矿区
学习一发平面图的姿势--ref #include <algorithm> #include <iostream> #include <cstdio> #includ ...
- 「HNOI2016」数据结构大毒瘤
真是 \(6\) 道数据结构毒瘤... 开始口胡各种做法... 「HNOI2016」网络 整体二分+树状数组. 开始想了一个大常数 \(O(n\log^2 n)\) 做法,然后就被卡掉了... 发现直 ...
- 「HNOI2016」树 解题报告
「HNOI2016」树 事毒瘤题... 我一开始以为每次把大树的子树再接给大树,然后死活不知道咋做,心想怕不是个神仙题哦 然后看题解后才发现是把模板树的子树给大树,虽然思维上难度没啥了,但是还是很难写 ...
- 「HNOI2016」序列 解题报告
「HNOI2016」序列 有一些高妙的做法,懒得看 考虑莫队,考虑莫队咋移动区间 然后你在区间内部找一个最小值的位置,假设现在从右边加 最小值左边区间显然可以\(O(1)\),最小值右边的区间是断掉的 ...
- 「HNOI2016」网络 解题报告
「HNOI2016」网络 我有一个绝妙的可持久化树套树思路,可惜的是,它的空间是\(n\log^2 n\)的... 注意到对一个询问,我们可以二分答案 然后统计经过这个点大于当前答案的路径条数,如果这 ...
- 「HNOI2016」最小公倍数 解题报告
「HNOI2016」最小公倍数 考虑暴力,对每个询问,处理出\(\le a,\le b\)的与询问点在一起的联通块,然后判断是否是一个联通块,且联通块\(a,b\)最大值是否满足要求. 然后很显然需要 ...
- loj #2051. 「HNOI2016」序列
#2051. 「HNOI2016」序列 题目描述 给定长度为 n nn 的序列:a1,a2,⋯,an a_1, a_2, \cdots , a_na1,a2,⋯,an,记为 a[1: ...
随机推荐
- Scrapy输出文件格式问题汇总
Q:Scrapy抓取的内容(包含中文)输出到JSON Lines文件时如何确保输出的是字符本身而不是其unicode编码? A:默认的JsonLinesItemExporter其ensure_asci ...
- java版微信支付/查询/撤销
最近公司接入微信刷卡支付,网上根本没见到很直接的教程(可能眼拙),一直摸滚打爬,加班加点才走通,忍不了必须写一写 微信 刷卡支付/查询/撤销... 必须要有公众号然后去申请,申请自己去看文档,这里主要 ...
- Quartz任务调度的测试Demo1(含有配置文件的demo)
Quartz是一个作业任务调度的框架,所在项目组中“消息推送模块”使用到此框架,于是写个demo熟悉下quart的用法: 使用Spring框架来集成Quartz的任务调度任务. 1.搭建Spring框 ...
- TestCase维护和思维导图
在软件整个生命周期中,测试应该尽早地开始,因为测试对象不只是程序,还有文档和数据,所以针对需求分析说明书.概要设计和详细设计说明书,测试如何快速理解项目需求,进行下一步的工作呢? 本人觉得,如果只是看 ...
- NoSQL特点
- IDEA--错误:找不到或无法加载XXXXX--解决方法--创建javafx或其他项目出现的问题
今天一上午超厂长在学习javafx的时候,总是创建一个然后运行就会出现 出现错误:找不到或无法加载主类 找了二个小时,都说是jdk或者其他环境配置问题 按照那些改了也没用重新创建一个也提示出现错误:找 ...
- 使用pdfjs插件在线预览PDF文件
前言 本文介绍在html中使用 pdfjs插件在线预览PDF文件的方法. 实现步骤 下载 pdfjs 并引入项目中 到PDFJS官网 http://mozilla.github.io/pdf.js/g ...
- Eclipse Git分支实战
切换分支 右键工程,创建新分支 命名新分支 点击finish,可以看到项目已经切换到hot_fix 修改代码: Ctrl+#提交到本地仓库,之后提交到远程仓库 Next,Finish 等待一下, 点击 ...
- Apache 配置内网站点
基于端口常用于内部网站,不对外开发的网站 [root@Nagios-Server extra]# vim ../httpd.conf Listen 80 Listen 8000 Listen 9000 ...
- PAT Basic 1036 跟奥巴马一起编程 (15 分)
美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统.2014 年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个 ...