LOJ


看到离线区间操作仍然考虑莫队,然后可以发现:我们对于原来的凸包集合按照极角序维护一个链表,那么删除一个位置可以\(O(1)\),撤回删除操作也可以\(O(1)\)(因为原来的链表结构中当前节点就记录着其之前的前驱后继),但是动态加入操作至少要一个二分的\(log\)的复杂度。所以我们要尽可能避免动态加入。

因为没学过回滚莫队所以我的写法比较奇怪:设\(solve(l,r)\)表示正在解决左端点在块\(l\)内、右端点在块\(r\)内的询问,并且此时已经维护出块\(l\)左端点到块\(r\)的右端点的凸包链表并维护出答案。

此时对于左端点在块\(l\)内、右端点在块\(r\)内的询问,我们只需要把零散的部分减掉就可以得到答案,然后栈序撤销删除操作。

询问做完之后通过删除元素递归进\(solve(l+1,r)\)和\(solve(l,r-1)\)。记得重复的\(solve\)步骤不要做多遍。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int read(){
  4. int a = 0; char c = getchar(); bool f = 0;
  5. while(!isdigit(c)){f = c == '-'; c = getchar();}
  6. while(isdigit(c)){
  7. a = a * 10 + c - 48; c = getchar();
  8. }
  9. return f ? -a : a;
  10. }
  11. #define int long long
  12. const int _ = 1.5e5 + 7 , T = sqrt(_) + 10;
  13. struct node{int P , S;}now[_]; struct query{int l , r , id;};
  14. #define PII pair < int , int >
  15. int N , M , id[_] , ans[_] , S; vector < query > qry[T][T];
  16. PII pos[_]; long double ang[_]; bool vis[T][T];
  17. int operator %(PII A , PII B){return A.first * B.second - A.second * B.first;}
  18. int cnt = 0;
  19. void del(int x){
  20. ++cnt;
  21. S = S - pos[x] % pos[now[x].S] - pos[now[x].P] % pos[x] + pos[now[x].P] % pos[now[x].S];
  22. now[now[x].P].S = now[x].S; now[now[x].S].P = now[x].P;
  23. }
  24. void add(int x){
  25. ++cnt;
  26. S = S - pos[now[x].P] % pos[now[x].S] + pos[now[x].P] % pos[x] + pos[x] % pos[now[x].S];
  27. now[now[x].P].S = x; now[now[x].S].P = x;
  28. }
  29. void solve(int l , int r){
  30. //cerr << l << ' ' << r << endl;
  31. if(vis[l / T][r / T]) return;
  32. vis[l / T][r / T] = 1;
  33. for(auto t : qry[l / T][r / T]){
  34. assert(t.l - l <= T && r - t.r <= T);
  35. for(int i = l ; i < t.l ; ++i) del(i);
  36. for(int i = r ; i > t.r ; --i) del(i);
  37. ans[t.id] = S;
  38. for(int i = t.r + 1 ; i <= r ; ++i) add(i);
  39. for(int i = t.l - 1 ; i >= l ; --i) add(i);
  40. }
  41. if(r - l > T){
  42. int cur = l; do{del(l++);}while(l % T); solve(l , r); do{add(--l);}while(l != cur);
  43. cur = r; do{del(r--);}while((r + 1) % T); solve(l , r); do{add(++r);}while(r != cur);
  44. }
  45. }
  46. signed main(){
  47. N = read(); M = read();
  48. for(int i = 0 ; i < N ; ++i){
  49. pos[i].first = read(); pos[i].second = read();
  50. id[i] = i; ang[i] = atan2(pos[i].second , pos[i].first);
  51. }
  52. sort(id , id + N , [&](int x , int y){return ang[x] < ang[y];});
  53. 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];}
  54. 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});}
  55. for(int i = 0 ; i < N ; ++i){S += pos[i] % pos[now[i].S];}
  56. solve(0 , N - 1); for(int i = 1 ; i <= M ; ++i) printf("%lld\n" , ans[i]);
  57. cerr << cnt << endl;
  58. return 0;
  59. }

「雅礼集训 2018 Day5」Convex 凸包、莫队的更多相关文章

  1. LOJ#6504. 「雅礼集训 2018 Day5」Convex(回滚莫队)

    题面 传送门 题解 因为并不强制在线,我们可以考虑莫队 然而莫队的时候有个问题,删除很简单,除去它和前驱后继的贡献即可.但是插入的话却要找到前驱后继再插入,非常麻烦 那么我们把它变成只删除的回滚莫队就 ...

  2. Loj #6503. 「雅礼集训 2018 Day4」Magic

    Loj #6503. 「雅礼集训 2018 Day4」Magic 题目描述 前进!前进!不择手段地前进!--托马斯 · 维德 魔法纪元元年. 1453 年 5 月 3 日 16 时,高维碎片接触地球. ...

  3. 「雅礼集训 2018 Day2」农民

    传送门 Description  「搞 OI 不如种田.」 小 D 在家种了一棵二叉树,第 ii 个结点的权值为 \(a_i\). 小 D 为自己种的树买了肥料,每天给树施肥. 可是几天后,小 D 却 ...

  4. 【loj - 6516】「雅礼集训 2018 Day11」进攻!

    目录 description solution accepted code details description 你将向敌方发起进攻!敌方的防御阵地可以用一个 \(N\times M\) 的 \(0 ...

  5. 「雅礼集训 2017 Day5」珠宝

    题目描述 Miranda 准备去市里最有名的珠宝展览会,展览会有可以购买珠宝,但可惜的是只能现金支付,Miranda 十分纠结究竟要带多少的现金,假如现金带多了,就会比较危险,假如带少了,看到想买的右 ...

  6. LOJ #6509. 「雅礼集训 2018 Day7」C

    神仙题 LOJ #6509 题意 给定一棵树,点权为0/1,每次随机一个点(可能和之前所在点相同)走到该点并将其点权异或上1 求期望的移动距离使得所有点点权相同 题解 根本不会解方程 容易发现如果一个 ...

  7. 「雅礼集训 2017 Day5」矩阵

    填坑填坑.. 感谢wwt耐心讲解啊.. 如果要看这篇题解建议从上往下读不要跳哦.. 30pts 把$A$和$C$看成$n$个$n$维向量,那$A_i$是否加入到$C_j$中就可以用$B_{i,j}$表 ...

  8. [LOJ#6039].「雅礼集训 2017 Day5」珠宝[决策单调性]

    题意 题目链接 分析 注意到本题的 \(C\) 很小,考虑定义一个和 \(C\) 有关的状态. 记 \(f(x,j)\) 表示考虑到了价格为 \(x\) 的物品,一共花费了 \(j\) 元的最大收益. ...

  9. LOJ#6503.「雅礼集训 2018 Day4」Magic[容斥+NTT+启发式合并]

    题意 \(n\) 张卡牌 \(m\) 种颜色,询问有多少种本质不同的序列满足相邻颜色相同的位置数量等于 \(k\). 分析 首先本质不同不好直接处理,可以将同种颜色的卡牌看作是不相同的,求出答案后除以 ...

随机推荐

  1. vue+element创建动态的form表单.以及动态生成表格的行和列

    动态创建form表单,网上有插件 (form-create) 不过我不知道它怎么用,没有使用成功,如果你使用成功了,欢迎下方留言. 最后我使用了笨方法,针对各个表单写好通用的组件,然后根据type用v ...

  2. ecshop 中的$GLOBALS

    ec二次开发 或研究ec的一些网友 经常在论坛里提到 $GLOBALS['db']; $GLOBALS['ecs'];在那定义的等帖子. 下来就$GLOBALS我说一点:       想搞明白的朋友 ...

  3. Kubernetes概念之mater、node

    很久没写博客了,终于把重心找回来了,不过没有以前有斗志.有理想.有目标了.慢慢来.你若问我我最近几年的规划是什么,还真不知道.突然发现摧毁一个人真的很简单.k8s也是一遍一遍的从入门到放弃,还是要好好 ...

  4. Python之路(第四十五篇)线程Event事件、 条件Condition、定时器Timer、线程queue

    一.事件Event Event(事件):事件处理的机制:全局定义了一个内置标志Flag,如果Flag值为 False,那么当程序执行 event.wait方法时就会阻塞,如果Flag值为True,那么 ...

  5. springboot工程启动即执行一段代码

    最近在做一个项目, 需要Tomcat启动后就执行一段代码 在这里需要用到CommandLineRunner这个接口, Spring boot的CommandLineRunner接口主要用于实现在应用初 ...

  6. Centos6.5硬盘故障修复

    以企业Centos6.5Linux为案例来修复系统,步骤如下: (1)远程备份本地其他重要数据,出现只读文件系统,需要先备份其他重要数据基于rsync|scp远程备份,其中/data为源目录,/dat ...

  7. SpringBoot配置多注册中心(yml,properties)

    dubbo-2.6.6 dubbo.config.multiple=true    dubbo.registries.z1.timeout = 5000    dubbo.registries.z1. ...

  8. 剑指offer-08 二叉树的下一个节点

    剑指offer第8题,本来想找leetcode上对应的题,后来没找到,直接去牛客网上刷了. 题目描述: 给定一个二叉树和其中的一个结点(pNode),请找出中序遍历顺序的下一个结点并且返回.注意,树中 ...

  9. ubuntu无法连接网络

    一,先说一下VMware软件和linux镜像的版本: VMware Workstation 14 Pro ubuntu-14.04.6-desktop-amd64.iso 二,遇到的问题 在第一次安装 ...

  10. 201871010102-常龙龙《面向对象程序设计(java)》第二周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...