ZROI2018提高day2t1
分析
考场上写了前20分和|a[i]|<=1的情况,但是因为没开long long爆零了。实际考场上差不多想到正解了,至少当时不会凸壳...
我们发现对于ax2+bx的大小关系我们可以将其转换成ax+b,所以我们可以将这些直线求一个上凸壳和一个下凸壳,然后离线处理所有x,对于小于0的x找到下凸壳中这个x对应的值,而如果大于等于0则在上凸壳中找。对于凸壳的构造实际就和求一个边凸包一样,只需要比较第i条边和栈顶边的交点是否小于栈顶边和栈中第二个边的交点然后判断是否弹栈就可以了。注意这个题有一些细节,比如对于b的处理,在a相等时要将b作为第二关键字。详见代码。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
const double inf = 40000.0;
const double ep = 1e-;
struct node {
long long a,b;
};
struct que {
long long x,id;
};
node d[];
que X[];
long long ans[],is[],be[],n,m,last;
double fin[];
stack<long long>a;
inline bool cmp(const node p,const node q){
if(p.a==q.a)return p.b>q.b;
return p.a>q.a;
}
inline bool cmp1(const node p,const node q){
if(p.a==q.a)return p.b<q.b;
return p.a<q.a;
}
inline bool cmp2(const que p,const que q){
return p.x<q.x;
}
inline double getnode(long long i1,long long i2){
if(d[i1].a==d[i2].a)return -inf;
return double(d[i2].b-d[i1].b)/(d[i1].a-d[i2].a);
}
inline void init(){
while(!a.empty())a.pop();
memset(is,,sizeof(is));
for(int i=;i<=n;i++)fin[i]=-inf;
}
inline void deal(long long wh){
for(long long i=;i<=n;i++)
if(is[i]){
for(long long j=last+;j<=m;j++){
if(wh==-&&X[j].x>=)return;
if(double(X[j].x)<=fin[i])ans[X[j].id]=d[i].a*X[j].x*X[j].x+d[i].b*X[j].x,last++;
else break;
}
}
return;
}
inline void work(long long wh){
init();
if(wh==-)sort(d+,d+n+,cmp);
else sort(d+,d+n+,cmp1);
a.push();
is[]=;
be[]=;
fin[]=-inf;
for(long long i=;i<=n;i++){
int ok=;
while(){
long long x=a.top();
if(fin[be[x]]>getnode(x,i)){
a.pop();is[x]=;
}else break;
}
be[i]=a.top();fin[a.top()]=getnode(a.top(),i);
a.push(i);is[i]=;
if(wh==)fin[i]=inf;
else fin[i]=;
}
deal(wh);
return;
}
int main(){
long long i,j,k;
scanf("%lld%lld",&n,&m);
for(i=;i<=n;i++)scanf("%lld%lld",&d[i].a,&d[i].b);
for(i=;i<=m;i++)scanf("%lld",&X[i].x),X[i].id=i;
sort(X+,X+m+,cmp2);
work(-);work();
for(i=;i<=m;i++)printf("%lld\n",ans[i]);
}
ZROI2018提高day2t1的更多相关文章
- ZROI2018提高day9t1
传送门 分析 我们首先想到的自然是根据大小关系建图,在这之后我们跑一遍拓扑排序 但是由于l和r的限制关系我们需要对传统的拓扑排序做一些改变 我们考虑将所有入度为0且现在的拓扑序号已经大于等于l的点放入 ...
- ZROI2018提高day6t2
传送门 分析 将所有字母分别转化为1~26,之后将字符串的空位补全为0,?设为-1,我们设dp[p][c][le][ri]表示考虑le到ri个字符串且从第p位开始考虑,这一位最小填c的方案数,具体转移 ...
- ZROI2018提高day6t1
传送门 分析 我们发现这个四元组可以分解成一个逆序对拼上一个顺序对,这个线段树搞搞然后乘一下就可以求出来了,但是我们发现可能有(a,b)为逆序对且(b,c)为顺序对的情况,所以要进行容斥,我们只需要枚 ...
- ZROI2018提高day5t3
传送门 分析我们可以根据性质将这个序列构造成一个环:0,a[1~n],0,a[n~1] 这中间的0是为了起间隔作用的. 我们又知道b[i]=a[i-1]^a[i+1] c[i]=b[i-1]^b[i+ ...
- ZROI2018提高day5t2
传送门 分析 考场上傻了,写了个树剖还莫名weila...... 实际就是按顺序考虑每个点,然后从他往上找,一边走一边将走过的边染色,如果走到以前染过色的边就停下.对于每一个a[i]的答案就是之前走过 ...
- ZROI2018提高day5t1
传送门 分析 我们不难将条件转换为前缀和的形式,即 pre[i]>=pre[i-1]*2,pre[i]>0,pre[k]=n. 所以我们用dp[i][j]表示考虑到第i个数且pre[i]= ...
- ZROI2018提高day4t3
传送门 分析 我们假设如果一个点是0则它的值为-1,如果一个点是1则值为1,则一个区间的答案便是max(pre[i]+sur[i]),这里的pre[i]表示此区间i点和它之前的的前缀的最大值,sur[ ...
- ZROI2018提高day4t2
传送门 分析 我们二分球的直径,然后就像奶酪那道题一样,将所有距离相遇直径的点用并查集连在一起,然后枚举所有与上边的顶距离小于直径的点和所有与下边的距离小于直径的点,如果它们被并查集连在一起则代表这个 ...
- ZROI2018提高day4t1
传送门 分析 一道贪心题,我们用两个优先队列分别维护卖出的物品的价格和买入但没有卖出的物品的价格,然后逐一考虑每一个物品.对于每一个物品如果他比卖出的物品中的最低个价格,则改将现在考虑的物品卖出,将之 ...
随机推荐
- LeetCode OJ:Length of Last Word(最后一个词的长度)
Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return the l ...
- fiddler抓包
1.fiddler安装 下载exe安装文件,傻瓜式安装 2.fiddler配置 点击Tools -->Telerik Fiddler Options -->Https,进入以下对话框 Ht ...
- OpenCV - win7+vs2013(2012)+opencv3.0.0 环境配置 (以及配置技巧)
1. opencv 3.0.0 库下载地址, 这里的版本是3.0.0,其他的版本配置可能不一样,请大家注意. http://sourceforge.net/projects/opencvlibrary ...
- loj 6083.「美团 CodeM 资格赛」数码
题目: 给定两个整数\(l\)和\(r\),对于任意\(x\),满足\(l\leq x\leq r\),把\(x\)所有约数写下来. 对于每个写下来的数,只保留最高位的那个数码.求\([1,9]\)中 ...
- 高性能服务器架构 的几个注意点 (High-Performance Server Architecture)
High-Performance Server Architecture 高性能服务器架构 来源:http://pl.atyp.us/content/tech/servers.html译文来源:htt ...
- QString字符串拼接【转载】
原文网址:http://www.cnblogs.com/ftrako/p/3481571.html for(intloop=1;loop<2;loop++) { QStringtest1=QSt ...
- live555源码分析----RSTPServer创建过程分析
最近五一回家,终于有机会能安静的看一下流媒体这方面相关的知识,准备分析live555的源码,接下来会把我读源码的过程记录成博客,以供其他的同路人参考. 因为再读源码的过程中,并不是一路顺着读下来,往往 ...
- Nunit 2.6 无法调试.Net Framework 4.0
<configuration> <!-- The GUI only runs under .NET 2.0 or higher. The useLegacyV2RuntimeActi ...
- Oracle OCM提纲
ocm提纲 数据库创建详解 ◆ 通过手动方式创建数据库 环境变量的设置 密码文件的创建过程以及使用情景 Oracle数据库中参数文件的演进过程 参数文件的对比 参数的修改方式介绍 数据库启动过程时的内 ...
- 四 Mixer
Mixer在应用程序和基础架构后端之间提供通过中介层.它的设计将策略决策移出应用层,用运维人员能够控制的配置取而代之. Mixer的设计目的是改变层次之间的边界,以此降低总体复杂性.从服务代码中剔除策 ...