首页 > TAG信息列表 > lmid

三分算法

时间复杂度O(2log(3)n)//以3为底 单谷函数求最大值 double l=0,r=1000; while(r-l>1e-9) { double lmid=l+(r-l)/3; double rmid=r-(r-l)/3; if(check(lmid)<=check(rmid)) l=lmid; else r=rmid; } 单谷函数求最小值 double l=0,r=1000; while(r-l>1e-9) { double lmid=

【模板】三分

难度10+大佬的讲解 对于单峰曲线,我们要用到三分。 double get(double x); double divide(double l,double r) { while(fabs(r-l) >= eps) { double mid = (l+r)/2.0; double lmid = mid-eps, rmid = mid+eps; if(get(lmid) < get(rmid)) l = mid; else r = mid;

洛谷P3372 【模板】线段树 1

两个操作,第一个打懒标记处理,第二个直接询问即可,线段树中每个节点存的是区间内所有元素之和。 1 //p3372 2 #include<bits/stdc++.h> 3 typedef long long ll; 4 using namespace std; 5 #define lson k<<1,l,mid 6 #define rson k<<1|1,mid+1,r 7 const int N=1e5+10; 8

P1438 无聊的数列

P1438 无聊的数列 分析 老规矩,先看操作 1 l r K D:给出一个长度等于 r-l+1 的等差数列,首项为 K,公差为 D,并将它对应加到 [l,r] 范围中的每一个数上。即令 \(a_l=a_l+K,a_{l+1}=a_{l+1}+K+D\ldots a_r=a_r+K+(r-l) \times D\) 2 p:询问序列的第 p 个数的值 \(a_p\)。 一看第一个操作

BZOJ1857 SCOI2010 传送带 (三分)

经典的三分问题。 一看到这道题好懵啊,无用地想了一会果断看题解,发现要用到三分,于是赶紧去补了补课... 题目大意是这样的:两条线段AB和CD在一个平面中,分别给出在AB,CD,和平面上的速度,要我们从A到D的最短时间。 因为有两条线段,我们可以三分套三分,先对AB三分,找到AB上的最优点x,在x确定的

【模板】线段树

RT,本人自己写的线段树,支持区修区查和RMQ。 //By lzj #include <cstdio> #define ri register int #define ls p<<1 #define rs p<<1|1 #define int long long #define INF 1e15 using namespace std; const int N=1e6+15; struct node{ int l,r; int tag1,tag2

[学习笔记]优化基础技巧

只能说确实挺基础。 集合起来写写吧。 二分系列 二分 略。 三分 对于传统的定义域在实数上的凸函数求最值,可以使用三分法。 lmid = l + ((r - l) >> 1); rmid = lmid + ((r - l) >> 1); if(cal(limd) > cal(rmid)) r = rmid; else l = lmid; 对于凸函数的二分 OI里凸函数大多为横

题解 string

传送门 前40分很好拿,考场上打了个区间覆盖优化,期望骗到50~70pts, 结果写了半天的区间覆盖优化还是只有40分。。。 正解和[HEOI2016/TJOI2016]排序很像然而我并没有做过这道题 以下思路来源于土神: 首先暴力的时间复杂度是\(O(m*nlogn)\), 显然m次操作并不能卡掉 区间覆盖优化:??? 那么尝

P2894 [USACO08FEB]Hotel G(线段树维护区间子串)

#include<bits/stdc++.h> using namespace std; inline int read() { int x=0,f=1;char c=getchar(); while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') x=(x<

【模板】三分法

题目链接 题目描述 如题,给出一个 N 次函数,保证在范围 [l, r] 内存在一点 x,使得 [l, x] 上单调增,[x, r] 上单调减。试求出 x 的值。 输入格式 第一行一次包含一个正整数 N 和两个实数 l, r,含义如题目描述所示。 第二行包含 N + 1 个实数,从高到低依次表示该 N 次函数各项的系数

三分模板(update)

摘自网络: https://www.cnblogs.com/lukelmouse/p/12545973.html 今天朋友打了南京的说板子锅了。 整数的那个, midl和midr改下 ,然后重新赋值那边+-1的去掉。 整数三分模板 int l = 1,r = 100; while(l < r) { int lmid = l + (r - l) / 3; int rmid = r - (r - l) / 3;

NC15667 统计颜色(线段树染色)

一道线段树染色,但是这里是桶,我犯了经验主义以为是覆盖问题 数据不大,用二进制表示即可 #include<iostream> #include<algorithm> #include<stack> #include<vector> #include<cstring> using namespace std; typedef long long ll; const int N=1e5+10; const int mod=1e9+7; int

ZOJ - 3203 Light Bulb(三分)

题意:灯离地面的高度为$H$,人的身高为$h$,灯离墙的距离为$D$,人站在不同位置,影子的长度不一样,求出影子的最长长度。 思路:设人离灯的距离为$x$,当人走到距离灯长度为$L$时,人在墙上的影子消失,此时人再往前走,影子的长度必然会减小,此时的$L$就为三分的左边界,右边界为$R=D$,由形似三角形可以

传送带(信息学奥赛一本通-T1439)

【题目描述】 对于给定的一个长度为N的正整数数列A[i],现要将其分成M(M≤N)段,并要求每段连续,且每段和的最大值最小。 关于最大值最小: 例如一数列4 2 4 5 1要分成3段 将其如下分段: [4 2][4 5][1] 第一段和为6,第2段和为9,第3段和为1,和最大值为9。 将其如下分段: [4][2 4][5 1] 第一段

三分板子

B - Light BulbTime Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%lld & %lluSubmit Status Practice ZOJ 3203   Description Compared to wildleopard's wealthiness, his brother mildleopard is rather poor. His house is narrow and he has on

二分和三分

二分: 二分,即为折半查找,它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。 也就是说,二分的条件为必须满足数列或某一逻辑的顺序性,(单调 只有这样才能进行二分。 查找方法: 首先,假设表中元素是按升序排列,将表中间位置记录的关键

P2221 [HAOI2012]高速公路

思路 考虑每一条边的贡献,然后推式子 \[ \begin{align}&\sum_{i}V_i\times(R-i+1)\times(i-L+1)\\=&\sum_{i}V_i\left[(Ri-i^2+i)-(RL-iL+L)+(R-i+1)\right]\\=&\sum_{i}V_i\left[Ri-i^2+i-RL+Li-L+R-i+1\right]\\=&\sum_{i}Vi\left[(Ri+Li)-i^2-RL+(R-L+1

数学一本通 7.3 函数的凹凸性

众所周知,单调函数可以用二分查找值 而有的函数是单峰(谷)的,这时就可以用三分求极值。 所谓三分,就是将函数分为三部分,每次舍去一部分 最后缩小到答案区间。 如图: 当lmid>rmid时,[rmid,∞)区间内肯定没有答案 反之,lmid<rmid时,(-∞,lmid]区间内肯定没有答案 而两个相等时,极值肯定在中间,

线段树

  早就要学主席树了,可是发现自己连线段树都不会了。 然后重学线段树 搞了几波例题,感觉还不错,不管是状态(自己的)还是细节,还是思路都是有的。 这道题呢 一道算是对5个月前的我来说比较鬼畜的题了。 但是对现在的我的话却是如此简单,尽管浏览了一遍以前的代码。*(我还是会的 考虑lazy

(模板)线段树2

(模板)线段树2 题目描述 如题,已知一个数列,你需要进行下面三种操作: 1.将某区间每一个数乘上x 2.将某区间每一个数加上x 3.求出某区间每一个数的和 第一行包含三个整数N、M、P,分别表示该数列数字的个数、操作的总个数和模数。 第二行包含N个用空格分隔的整数,其中第i个数字表示数列第