关闭

【JZOJ5390】逗气

251人阅读 评论(0) 收藏 举报
分类:

Description

这里写图片描述

Solution

这题首先把绝对值拆掉,发现它是这样一个东西:bjajdi+cidi(ajci),我们发现cidi对我们求解没有影响,先去掉,然后就是这个东西ajdi+bj,于是对于每一个aj,bj,可以当作一个一次函数f(x)=ajx+bj,那么这里的di就作为自变量x。现在对于一个di要求最大值,那么也就是求当前所加入的直线与x=di这条与y轴平行线的交点的最高点。

那么我们有经典做法线段树:区间[l,r]记录在此区间内往上露出最长长度的线段(你可以理解为一束光在这个区间内从上往下照,照到长度最多的线段)(对于这题是直线),那么更新就维护区间的性质即可(如果没有则直接覆盖,有则选择向上露出长度多的那条,剩下的那条往下更新区间)。查询也很容易,就从根一直往下找这个位置取最大值就可以了。

Code

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define fo(i,j,k) for(int i=j;i<=k;i++)
#define fd(i,j,k) for(int i=j;i>=k;i--)
#define N 200010
#define inf 10000000000000000ll
#define ll long long
using namespace std;
struct node{
    int x,y;
    int wz;
}w1[N],w2[N];
bool cmp(node x,node y){
    return x.x<y.x;
}
struct tree{
    int l,r,o;
}tr[N];
struct line{
    int k,b;
    ll f(int x){
        return (ll)k*x+b;
    }
}ln[N];
int cc=1,tot=0;
void pdl(int v){
    if(!tr[v].l) tr[v].l=++cc;
}
void pdr(int v){
    if(!tr[v].r) tr[v].r=++cc;
}
double meet(int x,int y){
    return (ln[y].b-ln[x].b)*1.0/(ln[x].k-ln[y].k);
}
void change(int v,int l,int r,int x)
{
    if(!tr[v].o) {tr[v].o=x;return;}
    int o=tr[v].o;
    double p=meet(x,o);
    int mid=(l+r)/2;
    if(p<=l*1.0 || p>=r*1.0 || ln[x].k==ln[o].k)
    {
        if(ln[x].f(mid)>ln[o].f(mid)) tr[v].o=x;
        return;
    }
    if(p<=mid*1.0)
    {
        pdl(v);
        if(ln[x].k>ln[o].k) tr[v].o=x,change(tr[v].l,l,mid,o);
        else change(tr[v].l,l,mid,x);
    }
    else
    {
        pdr(v);
        if(ln[x].k<ln[o].k) tr[v].o=x,change(tr[v].r,mid+1,r,o);
        else change(tr[v].r,mid+1,r,x);
    }
}
ll find(int v,int l,int r,int x)
{
    if(!v) return -inf;
    int o=tr[v].o;
    if(!o) return -inf;
    ll tmp=ln[o].f(x);
    if(l==r) return tmp;
    int mid=(l+r)/2;
    if(x<=mid) return max(tmp,find(tr[v].l,l,mid,x));
    else return max(tmp,find(tr[v].r,mid+1,r,x));
}
int lf=1;
void add(int x){
    ln[++tot].k=lf*w1[x].x,ln[tot].b=w1[x].y;
}
ll z[N];
int main()
{
    freopen("gas.in","r",stdin);
    freopen("gas.out","w",stdout);
    int n,m;
    scanf("%d %d",&n,&m);
    int mx=0;
    fo(i,1,n) scanf("%d %d",&w1[i].x,&w1[i].y),mx=max(mx,max(w1[i].x,w1[i].y));
    fo(i,1,m) scanf("%d %d",&w2[i].x,&w2[i].y),w2[i].wz=i,mx=max(mx,max(w2[i].x,w2[i].y));
    sort(w1+1,w1+n+1,cmp),sort(w2+1,w2+m+1,cmp);
    int p=0;
    fo(i,1,m)
    {
        while(w1[p+1].x<=w2[i].x && p<n) p++,add(p),change(1,1,mx,tot);
        int wz=w2[i].wz;
        z[wz]=max(z[wz],find(1,1,mx,w2[i].y)-(ll)w2[i].x*w2[i].y);
    }
    lf=-1,p=n+1;
    memset(tr,0,sizeof(tr)),tot=0,cc=1;
    fd(i,m,1)
    {
        while(w1[p-1].x>=w2[i].x && p>1) p--,add(p),change(1,1,mx,tot);
        int wz=w2[i].wz;
        z[wz]=max(z[wz],find(1,1,mx,w2[i].y)+(ll)w2[i].x*w2[i].y);
    }
    fo(i,1,m) printf("%lld\n",z[i]);
}
1
0
查看评论

[JZOJ5390]【NOIP2017提高A组模拟9.26】逗气

Descrption Solution可以先把所有的n+m个点按照位置排个序,然后正反分别做一次,就可以把绝对值去掉了。那么还是可以推出一个斜率式子的,因为斜率di是会变得,那么维护一个凸包(也就是一个只从后面进的,队头不出的单调队列),每次对于一个di二分顶点查找最优值就行了。##include...
  • hzj1054689699
  • hzj1054689699
  • 2017-09-28 19:43
  • 158

总算搞定了,乐逗游戏校招面试经验汇总

首先,感谢一直以来支持我的家人以及众多的小伙伴们。 好了,我啰嗦废话了,直接上面经:  经过了简历筛选,笔试之后,我很荣幸的收到了乐逗游戏的面试邀约。 一面(视频面试): 面试我的是一个年轻的哥哥,我估计他是在公司面试的我。开始老套路,先自我介绍,然后问我一些基本情况 值得一点注...
  • LHN_hpu
  • LHN_hpu
  • 2016-10-23 19:38
  • 2374

【团队介绍】小逗比们的介绍篇

队长:杨妍喆 联系方式:yangyanzhe@126.com
  • PopushGroup
  • PopushGroup
  • 2014-10-12 22:41
  • 1027

唱歌气沉丹田怎么做 气沉丹田的口诀

唱歌要用气,用丹田的气唱歌,那么丹田在哪里 下面是nibiye小编整理的唱歌气沉丹田怎么做,迎参考!   唱歌的时候怎么样才能气沉丹田?那么就让小编我来告诉大家吧!下面是学啦!让小编我来给你们分享一下我的妙招吧?希望能对你有帮助!   唱歌时如何做到气沉丹田   气沉丹田是学习歌唱...
  • A599677743
  • A599677743
  • 2017-06-24 16:23
  • 1613

逗比的验证码,有没有难道不一样吗?

leve5参考: http://www.cnblogs.com/renzongxian/p/5618631.html 使用sniper(狙击手)模式,对pwd字段进行暴力破解。 最后从得到的结果中按照正则匹配的error进行排序,得到一个不匹配的,然后得到了key。 这题没有我想象的难,...
  • caiqiiqi
  • caiqiiqi
  • 2017-06-07 15:38
  • 530

[hackinglab] 脚本关5 逗比验证码第一期

逗比验证码第一期 分值: 100 逗比的验证码,有没有难道不一样吗?  通关地址:http://lab1.xseclab.com/vcode1_bcfef7eacf7badc64aaf18844cdb1c46/index.php 1、验证码与session对应,session会话不会被...
  • Selukwe
  • Selukwe
  • 2017-05-29 15:43
  • 453

程序员的逗比瞬间

程序员的逗比瞬间
  • Before_Morning
  • Before_Morning
  • 2015-08-31 08:14
  • 493

[hackinglab] 逗比验证码第二期

逗比验证码第二期 分值: 150 验证便失效的验证码 通关地址:http://lab1.xseclab.com/vcode2_a6e6bac0b47c8187b09deb20babc0e85/index.php 登陆一下,用burp抓包 将这个登录请求导入Repeater,经测试,把验证码删掉,...
  • Selukwe
  • Selukwe
  • 2017-05-29 16:34
  • 469

金额三位一逗显示

// 方法一 var n="1232134456.546"; function format1(n){     //要求传入n 本身是一个3位小数     // parseFloat() 函数可解析一个字符串,并返回一个...
  • sixteen_cicle
  • sixteen_cicle
  • 2017-04-17 13:50
  • 279

君子不和牛置气,混蛋让它混到底--“骂”老板(6)

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出版、作者信息和本声明。否则将追究法律责任。本文地址:http://blog.csdn.net/jobchanceleo/archive/2007/08/30/1766022.aspx 上次说到《非我族类其心必异--咱们一起...
  • jobchanceleo
  • jobchanceleo
  • 2007-08-30 21:55
  • 14259
    个人资料
    • 访问:38870次
    • 积分:2305
    • 等级:
    • 排名:第19147名
    • 原创:182篇
    • 转载:1篇
    • 译文:0篇
    • 评论:8条
    不太友好的链接
    最新评论