热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

P3309[SDOI2014]向量集

传送门达成成就:一人独霸三页提交自己写的莫名其妙MLE死都不知道怎么回事,照着题解打一直RE一个点最后发现竟然是凸包上一个点求错了……四个半小时就一直用

传送门

达成成就:一人独霸三页提交

自己写的莫名其妙MLE死都不知道怎么回事,照着题解打一直RE一个点最后发现竟然是凸包上一个点求错了……四个半小时就一直用来调代码了……

5bf69369bd582.png

那么我们只要维护好这个凸壳,因为这是一个凸函数,所以只要在上面三分找最值即可

于是现在我们需要维护一个资瓷插入的凸壳。考虑线段树,我们发现每一次在线段树上询问的区间必然都是已经把点插满了的。那么我们可以考虑线段树上每一个节点内的所有元素都插入完之后,再构建凸壳,那么显然每个节点只会被构建一次凸包,所以复杂度是\(O(nlog^2n)\)

然后注意一个细节……因为我们维护好的凸包要便于分成上下凸壳,所以凸包的起点应该是\(x\)坐标最小的,这样才满足它左右两边分别是上凸壳和下凸壳……我按照以前的写法找\(y\)坐标最小的当起点然后就没有然后了……

//minamoto
#include
#define fp(i,a,b) for(register int i=a,I=b+1;i#define fd(i,a,b) for(register int i=a,I=b-1;i>I;--i)
#define ll long long
#define inf 1e18
using namespace std;
templateinline bool cmax(T&a,const T&b){return aint flag=0,all;ll lasans=0;
int read(){int res,f&#61;1;char ch;while((ch&#61;getchar())>&#39;9&#39;||ch<&#39;0&#39;)(ch&#61;&#61;&#39;-&#39;)&&(f&#61;-1);for(res&#61;ch-&#39;0&#39;;(ch&#61;getchar())>&#61;&#39;0&#39;&&ch<&#61;&#39;9&#39;;res&#61;res*10&#43;ch-&#39;0&#39;);res*&#61;f;if(flag)res^&#61;(lasans&0x7fffffff);return res;
}
char sr[1<<21],z[20];int C&#61;-1,Z&#61;0;
inline void Ot(){fwrite(sr,1,C&#43;1,stdout),C&#61;-1;}
void print(ll x){if(C>1<<20)Ot();if(x<0)sr[&#43;&#43;C]&#61;&#39;-&#39;,x&#61;-x;while(z[&#43;&#43;Z]&#61;x%10&#43;48,x/&#61;10);while(sr[&#43;&#43;C]&#61;z[Z],--Z);sr[&#43;&#43;C]&#61;&#39;\n&#39;;
}
const int N&#61;4e5&#43;5;
struct node{int x,y;}b[N],st[N];
struct seg{int l,r,pos,sz;seg *ch[2];vectormp;
}pool[N<<2],*rt;
inline node operator -(node a,node b){return (node){a.x-b.x,a.y-b.y};}
inline ll operator *(node a,node b){return 1ll*a.x*b.y-1ll*b.x*a.y;}
inline ll dot(node a,node b){return 1ll*a.x*b.x&#43;1ll*a.y*b.y;}
inline bool operator <(node a,node b){a&#61;a-st[1],b&#61;b-st[1];return a*b&#61;&#61;0?1ll*a.x*a.x&#43;1ll*a.y*a.y<1ll*b.x*b.x&#43;1ll*b.y*b.y:a*b>0;
}
void graham(seg *p){int top&#61;1,sz&#61;p->r-p->l&#43;1,k&#61;1;fp(i,1,sz)b[i]&#61;p->mp[i-1];fp(i,2,sz)if(b[i].x1&&(b[i]-st[top-1])*(st[top]-st[top-1])>&#61;0)--top;st[&#43;&#43;top]&#61;b[i];}st[&#43;&#43;top]&#61;b[1];p->sz&#61;top;vector().swap(p->mp);
// p->mp.clear();fp(i,1,top)p->mp.push_back(st[i]);fp(i,1,top-1)if(st[i&#43;1].x<&#61;st[i].x){p->pos&#61;i-1;break;}
}
ll calc(seg *p,node q){int l,r,m1,m2;ll ans&#61;-inf;q.y>0?(l&#61;p->pos,r&#61;p->sz-1):(l&#61;0,r&#61;p->pos);while(r-l>&#61;3){m1&#61;l&#43;(r-l)/3,m2&#61;r-(r-l)/3;dot(q,p->mp[m1])>dot(q,p->mp[m2])?r&#61;m2:l&#61;m1;}fp(i,l,r)cmax(ans,dot(q,p->mp[i]));return ans;
}
void ins(seg *p,int pos,node x){p->mp.push_back(x);if(pos&#61;&#61;p->r)graham(p);if(p->l&#61;&#61;p->r)return;int mid&#61;(p->l&#43;p->r)>>1;pos<&#61;mid?ins(p->ch[0],pos,x):ins(p->ch[1],pos,x);
}
ll query(seg *p,int l,int r,node x){if(l<&#61;p->l&&r>&#61;p->r)return calc(p,x);int mid&#61;(p->l&#43;p->r)>>1;ll res&#61;-inf;if(l<&#61;mid)cmax(res,query(p->ch[0],l,r,x));if(r>mid)cmax(res,query(p->ch[1],l,r,x));return res;
}
void build(seg *p,int l,int r){p->l&#61;l,p->r&#61;r;if(l&#61;&#61;r)return;int mid&#61;(l&#43;r)>>1;build(p->ch[0]&#61;pool&#43; &#43;&#43;all,l,mid),build(p->ch[1]&#61;pool&#43; &#43;&#43;all,mid&#43;1,r);
}
int main(){
// freopen("testdata.in","r",stdin);int n,l,r,tot&#61;0;char s[10];node x;n&#61;read(),scanf("%s",s),flag&#61;s[0]!&#61;&#39;E&#39;;build(rt&#61;pool&#43; &#43;&#43;all,1,n);while(n--){scanf("%s",s),x.x&#61;read(),x.y&#61;read();if(s[0]&#61;&#61;&#39;Q&#39;)l&#61;read(),r&#61;read(),print(lasans&#61;query(rt,l,r,x));else ins(rt,&#43;&#43;tot,x);}return Ot(),0;
}

转载于:https://www.cnblogs.com/bztMinamoto/p/10003415.html


推荐阅读
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • Java 11相对于Java 8,OptaPlanner性能提升有多大?
    本文通过基准测试比较了Java 11和Java 8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java 11相对于Java 8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。 ... [详细]
  • 本文介绍了使用Python编写购物程序的实现步骤和代码示例。程序启动后,用户需要输入工资,并打印商品列表。用户可以根据商品编号选择购买商品,程序会检测余额是否充足,如果充足则直接扣款,否则提醒用户。用户可以随时退出程序,在退出时打印已购买商品的数量和余额。附带了完整的代码示例。 ... [详细]
author-avatar
覃维欢
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有