loj2052 「HNOI2016」矿区
学习一发平面图的姿势……ref
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
using namespace std;
typedef long long ll;
int n, m, k, cnt, uu, vv, nxt[1200005], bel[1200005], belcnt, rot, fa[1200005];
int ask[200005];
bool vis[1200005], isn[1200005];
ll s[1200005], sp[1200005];
struct Point{
int x, y;
Point operator-(const Point &u){
return (Point){x-u.x, y-u.y};
}
ll operator*(const Point &u){
return (ll)x*u.y-(ll)y*u.x;
}
}p[200005];
struct Edge{
int fro, too, idx;
double ang;
Edge(int f=0, int t=0, int i=0){
fro = f; too = t; idx = i;
ang = atan2(p[t].y-p[f].y, p[t].x-p[f].x);
}
bool operator<(const Edge &x)const{
return ang<x.ang;
}
}edge[1200005];
vector<Edge> w[200005], tr[1200005];
void add_edge(int fro, int too){
edge[cnt] = Edge(fro, too, cnt);
w[fro].push_back(edge[cnt]);
cnt++;
}
ll getGcd(ll a, ll b){
return !b?a:getGcd(b, a%b);
}
void rn(int &x){
char ch=getchar();
x = 0;
int f=1;
while(ch<'0' || ch>'9'){
if(ch=='-') f = -1;
ch = getchar();
}
while(ch>='0' && ch<='9'){
x = x * 10 + ch - '0';
ch = getchar();
}
x *= f;
}
int findEdge(int f, const Edge &x){
int l=0, r=w[f].size()-1, mid, re;
while(l<=r){
mid = (l + r) >> 1;
if(w[f][mid]<x) l = mid + 1;
else re = mid, r = mid - 1;
}
return re;
}
void dfs(int x){
vis[x] = true;
sp[x] = s[x] * s[x];
s[x] <<= 1;
for(int i=0; i<tr[x].size(); i++){
int t=tr[x][i].too;
if(vis[t]) continue;
fa[t] = x;
isn[tr[x][i].idx] = isn[tr[x][i].idx^1] = true;
dfs(t);
s[x] += s[t];
sp[x] += sp[t];
}
}
int main(){
rn(n); rn(m); rn(k);
for(int i=1; i<=n; i++){
rn(p[i].x);
rn(p[i].y);
}
for(int i=1; i<=m; i++){
rn(uu); rn(vv);
add_edge(uu, vv);
add_edge(vv, uu);
}
for(int i=1; i<=n; i++)
sort(w[i].begin(), w[i].end());
for(int i=0; i<cnt; i++){
int qwq=findEdge(edge[i].too, edge[i^1])-1;
if(qwq==-1) qwq = w[edge[i].too].size() - 1;
nxt[i] = w[edge[i].too][qwq].idx;
}
for(int i=0; i<cnt; i++)
if(!bel[i]){
bel[i] = bel[nxt[i]] = ++belcnt;
for(int j=nxt[i]; edge[j].too!=edge[i].fro; j=nxt[j]){
s[belcnt] += (p[edge[j].fro]-p[edge[i].fro]) * (p[edge[j].too]-p[edge[i].fro]);
bel[nxt[j]] = belcnt;
}
if(s[belcnt]<=0) rot = belcnt;
}
for(int i=0; i<cnt; i++)
tr[bel[i]].push_back(Edge(bel[i], bel[i^1], i));
dfs(rot);
ll p=0, q=0;
int d;
while(k--){
rn(d); d = (d + p) % n + 1;
for(int i=1; i<=d; i++){
rn(ask[i]);
ask[i] = (ask[i] + p) % n + 1;
}
ask[d+1] = ask[1];
p = q = 0;
for(int i=1; i<=d; i++){
int j=w[ask[i]][findEdge(ask[i], Edge(ask[i],ask[i+1],0))].idx;
if(!isn[j]) continue;
if(fa[bel[j]]==bel[j^1])
p += sp[bel[j]], q += s[bel[j]];
else
p -= sp[bel[j^1]], q -= s[bel[j^1]];
}
ll gcd=getGcd(p, q);
p /= gcd; q /= gcd;
printf("%lld %lld\n", p, q);
}
return 0;
}
loj2052 「HNOI2016」矿区的更多相关文章
- LOJ#2052. 「HNOI2016」矿区(平面图转对偶图)
题面 传送门 题解 总算会平面图转对偶图了-- 首先我们把无向边拆成两条单向边,这样的话每条边都属于一个面.然后把以每一个点为起点的边按极角排序,那么对于一条边\((u,v)\),我们在所有以\(v\ ...
- 【LOJ】#2052. 「HNOI2016」矿区
题解 之前尝试HNOI2016的时候弃坑的一道,然后给补回来 (为啥我一些计算几何就写得好长,不过我写啥都长orz) 我们尝试给这个平面图分域,好把这个平面图转成对偶图 怎么分呢,我今天也是第一次会 ...
- 「HNOI2016」矿区
https://loj.ac/problem/2052 题解 平面图转对偶图.. 首先我们转的话需要给所有的平面标号,然后找到每条边看看他们隔开了哪两个平面. 做法就是对每个点维护它的所有排好序的出边 ...
- 「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: ...
随机推荐
- Vue2.0搭建脚手架(vue-cli)
一.安装node.js 进入官网下载node.js 二.安装 cnpm 1.说明:npm(node package manager)是nodejs的包管理器,用于node插件管理(包括安装.卸载.管理 ...
- ECMAScript 原始值和引用值
原始值和引用值 在ECMAScript中,变量可以存在两种类型的值,即原始值和引用值 原始值 存储
- JAVA方法定义和调用
类的方法代表的是实例的某种行为或功能 定义类的方法 访问修饰 类型 方法名(参数列表){ //方法体 } 1.把方法当作一个模块,是个“黑匣子”,完成某个特定的功能,并返回处理结果 2.方法分类“ 返 ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:10.项目介绍之架构(2)
欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 前言 前面我们讲到<迷你微信>服务器端的主架构,现在我们来描述一下它的模块详细信息. 网络模块 从上图我 ...
- [Unity3D] 如何识别屏幕边缘
出现的问题 Unity3D中长度单位是米 使用Screen.resolutions获取的屏幕信息单位是像素 也就是说,即使获取了屏幕相关信息及参数,也无法把信息转换成可在editor中使用的信息.当时 ...
- cms-数据库设计
业务相关的3张表 1.类型表: CREATE TABLE `t_arctype` (`id` int(11) NOT NULL AUTO_INCREMENT,//id`typeName` varcha ...
- 【BZOJ4866】[YNOI2017] 由乃的商场之旅(莫队)
点此看题面 大致题意: 给你一个字符串,每次给你一段区间,问这段区间内有多少个字符串在重新排列后可以变成一个回文串. 关于莫队 详见这篇博客:莫队算法学习笔记(一)--普通莫队. 关于回文 要使一个字 ...
- 【洛谷1967】货车运输(最大生成树+倍增LCA)
点此看题面 大致题意: 有\(n\)个城市和\(m\)条道路,每条道路有一个限重.多组询问,每次询问从\(x\)到\(y\)的最大载重为多少. 一个贪心的想法 首先,让我们来贪心一波. 由于要求最大载 ...
- Quartz 配置文件属性
主要配置 Property Name Req'd Type Default Value org.quartz.scheduler.instanceName no string 'QuartzSched ...
- 解决Jquery中使用each循环时,循环外的js依旧会执行
今天在改项目bug时,发现一个问题,我获取一个div中所有的input,并取值时,判断某一条件,但是循环外的js依然可以执行. $(".tab-reg-next input").e ...