「雅礼集训 2018 Day5」Convex 凸包、莫队
看到离线区间操作仍然考虑莫队,然后可以发现:我们对于原来的凸包集合按照极角序维护一个链表,那么删除一个位置可以\(O(1)\),撤回删除操作也可以\(O(1)\)(因为原来的链表结构中当前节点就记录着其之前的前驱后继),但是动态加入操作至少要一个二分的\(log\)的复杂度。所以我们要尽可能避免动态加入。
因为没学过回滚莫队所以我的写法比较奇怪:设\(solve(l,r)\)表示正在解决左端点在块\(l\)内、右端点在块\(r\)内的询问,并且此时已经维护出块\(l\)左端点到块\(r\)的右端点的凸包链表并维护出答案。
此时对于左端点在块\(l\)内、右端点在块\(r\)内的询问,我们只需要把零散的部分减掉就可以得到答案,然后栈序撤销删除操作。
询问做完之后通过删除元素递归进\(solve(l+1,r)\)和\(solve(l,r-1)\)。记得重复的\(solve\)步骤不要做多遍。
#include<bits/stdc++.h>
using namespace std;
int read(){
int a = 0; char c = getchar(); bool f = 0;
while(!isdigit(c)){f = c == '-'; c = getchar();}
while(isdigit(c)){
a = a * 10 + c - 48; c = getchar();
}
return f ? -a : a;
}
#define int long long
const int _ = 1.5e5 + 7 , T = sqrt(_) + 10;
struct node{int P , S;}now[_]; struct query{int l , r , id;};
#define PII pair < int , int >
int N , M , id[_] , ans[_] , S; vector < query > qry[T][T];
PII pos[_]; long double ang[_]; bool vis[T][T];
int operator %(PII A , PII B){return A.first * B.second - A.second * B.first;}
int cnt = 0;
void del(int x){
++cnt;
S = S - pos[x] % pos[now[x].S] - pos[now[x].P] % pos[x] + pos[now[x].P] % pos[now[x].S];
now[now[x].P].S = now[x].S; now[now[x].S].P = now[x].P;
}
void add(int x){
++cnt;
S = S - pos[now[x].P] % pos[now[x].S] + pos[now[x].P] % pos[x] + pos[x] % pos[now[x].S];
now[now[x].P].S = x; now[now[x].S].P = x;
}
void solve(int l , int r){
//cerr << l << ' ' << r << endl;
if(vis[l / T][r / T]) return;
vis[l / T][r / T] = 1;
for(auto t : qry[l / T][r / T]){
assert(t.l - l <= T && r - t.r <= T);
for(int i = l ; i < t.l ; ++i) del(i);
for(int i = r ; i > t.r ; --i) del(i);
ans[t.id] = S;
for(int i = t.r + 1 ; i <= r ; ++i) add(i);
for(int i = t.l - 1 ; i >= l ; --i) add(i);
}
if(r - l > T){
int cur = l; do{del(l++);}while(l % T); solve(l , r); do{add(--l);}while(l != cur);
cur = r; do{del(r--);}while((r + 1) % T); solve(l , r); do{add(++r);}while(r != cur);
}
}
signed main(){
N = read(); M = read();
for(int i = 0 ; i < N ; ++i){
pos[i].first = read(); pos[i].second = read();
id[i] = i; ang[i] = atan2(pos[i].second , pos[i].first);
}
sort(id , id + N , [&](int x , int y){return ang[x] < ang[y];});
for(int i = 0 ; i < N ; ++i){now[id[i]].P = id[i ? i - 1 : N - 1]; now[id[i]].S = id[i == N - 1 ? 0 : i + 1];}
for(int i = 1 ; i <= M ; ++i){int p = read() - 1 , q = read() - 1; qry[p / T][q / T].push_back((query){p , q , i});}
for(int i = 0 ; i < N ; ++i){S += pos[i] % pos[now[i].S];}
solve(0 , N - 1); for(int i = 1 ; i <= M ; ++i) printf("%lld\n" , ans[i]);
cerr << cnt << endl;
return 0;
}
「雅礼集训 2018 Day5」Convex 凸包、莫队的更多相关文章
- LOJ#6504. 「雅礼集训 2018 Day5」Convex(回滚莫队)
题面 传送门 题解 因为并不强制在线,我们可以考虑莫队 然而莫队的时候有个问题,删除很简单,除去它和前驱后继的贡献即可.但是插入的话却要找到前驱后继再插入,非常麻烦 那么我们把它变成只删除的回滚莫队就 ...
- Loj #6503. 「雅礼集训 2018 Day4」Magic
Loj #6503. 「雅礼集训 2018 Day4」Magic 题目描述 前进!前进!不择手段地前进!--托马斯 · 维德 魔法纪元元年. 1453 年 5 月 3 日 16 时,高维碎片接触地球. ...
- 「雅礼集训 2018 Day2」农民
传送门 Description 「搞 OI 不如种田.」 小 D 在家种了一棵二叉树,第 ii 个结点的权值为 \(a_i\). 小 D 为自己种的树买了肥料,每天给树施肥. 可是几天后,小 D 却 ...
- 【loj - 6516】「雅礼集训 2018 Day11」进攻!
目录 description solution accepted code details description 你将向敌方发起进攻!敌方的防御阵地可以用一个 \(N\times M\) 的 \(0 ...
- 「雅礼集训 2017 Day5」珠宝
题目描述 Miranda 准备去市里最有名的珠宝展览会,展览会有可以购买珠宝,但可惜的是只能现金支付,Miranda 十分纠结究竟要带多少的现金,假如现金带多了,就会比较危险,假如带少了,看到想买的右 ...
- LOJ #6509. 「雅礼集训 2018 Day7」C
神仙题 LOJ #6509 题意 给定一棵树,点权为0/1,每次随机一个点(可能和之前所在点相同)走到该点并将其点权异或上1 求期望的移动距离使得所有点点权相同 题解 根本不会解方程 容易发现如果一个 ...
- 「雅礼集训 2017 Day5」矩阵
填坑填坑.. 感谢wwt耐心讲解啊.. 如果要看这篇题解建议从上往下读不要跳哦.. 30pts 把$A$和$C$看成$n$个$n$维向量,那$A_i$是否加入到$C_j$中就可以用$B_{i,j}$表 ...
- [LOJ#6039].「雅礼集训 2017 Day5」珠宝[决策单调性]
题意 题目链接 分析 注意到本题的 \(C\) 很小,考虑定义一个和 \(C\) 有关的状态. 记 \(f(x,j)\) 表示考虑到了价格为 \(x\) 的物品,一共花费了 \(j\) 元的最大收益. ...
- LOJ#6503.「雅礼集训 2018 Day4」Magic[容斥+NTT+启发式合并]
题意 \(n\) 张卡牌 \(m\) 种颜色,询问有多少种本质不同的序列满足相邻颜色相同的位置数量等于 \(k\). 分析 首先本质不同不好直接处理,可以将同种颜色的卡牌看作是不相同的,求出答案后除以 ...
随机推荐
- C# Net 通用json转Object(对象)
C# Net 通用 json 转 Object 对象 C# Net 提取 json 字符串 对象 数组 C# Net json 对象 中有字符串 转为 对象 例如输入:{"1" ...
- mysql语法之union
UNION的语法结构: SELECT ... UNION [ ALL | DISTINCT ] SELECT .... [ UNION [ ALL | DISTINCT ] SELECT ..... ...
- 创建readonly只读用户脚本
身为一名运维工作人员,保证服务器的安全是必要项,当开发人员或测试人员需登录到服务器查看日志等操作时,可只给定特定的权限防止误操作的惨况产生. 以下脚本内容均为我本人环境,如有更改可自行修改. ~]# ...
- Nginx常见的安装方式
Nginx常见的安装方式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Nginx概述 Nginx的安装版本分为开发版.稳定版和过期版, Nginx安装可以使用yum或源码安装 ...
- istio部署-helm
参考 istio/istio istio/Kubernetes Customizable Install with Helm Istio安装参数介绍 1. Istio Chart 目录结构 PATH: ...
- 洛谷P2680 运输计划(倍增LCA + 树上差分 + 二分答案)
[题目链接] [思路]: 根据题意可以明显看出,当所有任务都完成时的时间是最终的结果,也就是说本题要求,求出最小的最大值. 那这样的话就暗示了将答案二分,进行check. [check方法]: 如果说 ...
- pycharm与github的使用
1.clone代码: 输入github的存储库地址,输入本地存储目录,点击clone即可: 2.上传代码: 输入存储库名字,点击share即可:github上就会有你分享的代码啦
- ESA2GJK1DH1K升级篇: 移植远程更新程序到STM32F103RET6型号的单片机,基于(GPRS模块AT指令TCP透传方式)
前言 上节实现远程更新是更新的STM32F103C8T6的单片机 GPRS网络(Air202/SIM800)升级STM32: 测试STM32远程乒乓升级,基于(GPRS模块AT指令TCP透传方式),定 ...
- 关于很狗的军训qwq
我该用哪种方式来证明我存在过 说起这个很狗的军训呀,,, 军训嘛 就不得不先说最基本的,,, 那就是很狗的衣服,,, 一套军装,+一个帽子+一双特别特别特别硌脚的胶鞋!!! 然后... 我胖了..q ...
- 【border相关】【P3426】 [POI2005]SZA-Template
[border相关][P3426] [POI2005]SZA-Template Description 给定一个字符串 \(S\),要求一个最短的字符串 \(T\),使得 \(S\) 可以由 \(T\ ...