牛客挑战赛42 E

小睿睿的疑惑

https://ac.nowcoder.com/acm/contest/6944/E

分析

为以 结尾的最小代价。 ,后面的可以前缀和优化一下。 。令 的决策点,那么可以化简为 。那么这个就是个一次函数。其中 ,所以为了让 最小,那么我们显然要让 最小。那么现在就是要求 的最小值,放在坐标轴上,就是求直线 与所有一次函数的最小值,这个可以李超线段树来求,这样单次查询的复杂度为 。因为查询的直线有时间顺序,所以要可持久化一下,每次查询的就是一个前缀树,其实如果不是强制在线,这道题其实还可以 分治。

代码

#include<bits/stdc++.h>
using namespace std;
#define LL long long 
LL read() {
    LL x = 0,f = 0;char ch = getchar();
    while(!isdigit(ch)) {if(ch == '-')f = 1;ch = getchar();}
    while(isdigit(ch)) {x = x * 10 + ch - '0';ch = getchar();}
    return f ? -x:x;
}
const LL N = 1e5 + 100,M = 1e7,inf = 0x3f3f3f3f3f3f3f3f;
LL n,m,h[N],S[N],g[N],last = 0,A[N],B[N],rt[N],lastans;
LL size,lc[N * 30],rc[N * 30],id[N * 30];
LL f(LL Id,LL x) {return A[Id] * x + B[Id];}
void update(LL &a,LL b,LL l,LL r,LL u) {
    a = ++size;id[a] = id[b];lc[a] = lc[b];rc[a] = rc[b];
    LL val_l = f(id[a],l),val_r = f(id[a],r);
    LL val_L = f(u,l),val_R = f(u,r);
    if(!id[a] || (val_R <= val_r && val_L <= val_l)) {id[a] = u;return;}
    if(val_r <= val_R && val_l <= val_L) return;
    LL mid = l + r >> 1;
    update(lc[a],lc[b],l,mid,u);
    update(rc[a],rc[b],mid+1,r,u);
}
LL query(LL u,LL l,LL r,LL p) {
    if(l == r) return f(id[u],p);
    LL ans = f(id[u],p);
    LL mid = l + r >> 1;
    if(p <= mid) return min(ans,query(lc[u],l,mid,p));
    else return min(ans,query(rc[u],mid+1,r,p));
}
int main() {
    n = read();m = read();
    for(LL i = 1;i <= n;i++) h[i] = read();
    for(LL i = 1;i <= n;i++) S[i] = S[i-1] + read();
    B[0] = inf;
    g[1] = 0;A[1] = -2 * h[1];B[1] = h[1] * h[1] - S[1];
    update(rt[1],rt[0],1,M,1);
    for(LL i = 2;i <= n;i++) {
        g[i] = h[i] * h[i] + S[i-1] + query(rt[i-1],1,M,h[i]);
        A[i] = -2 * h[i];B[i] = g[i] + h[i] * h[i] - S[i];
        update(rt[i],rt[i-1],1,M,i);
    }
    while(m--) {
        LL x = ((read() ^ lastans) % n + n) % n + 1,y = read();
        if(x == 1) lastans = 0;
        else lastans = query(rt[x-1],1,M,y) + y * y + S[x-1];
        printf("%lld\n",lastans);
    }
    return 0;
}
全部评论

相关推荐

06-02 00:21
门头沟学院 Java
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
05-26 15:37
1、这群人晚上&nbsp;11&nbsp;点发朋友圈:"凌晨&nbsp;11&nbsp;点,三环的灯还亮着。"&nbsp;实际下班时间:19:30。2、什么是嘉豪呀?我最近在字节实习,没什么时间上网3、同龄人:学校社团、酒吧蹦迪;我:acm、字节/腾讯实习4、别人朋友圈发:“今天不想上课”;我朋友圈发:“今天的班就上到这里啦”,定位:字节跳动5、别人的朋友圈都是到处旅游的定位,我的朋友圈天天都是“字节定位”,还一定要是在【公司的健身房】里拍张照片,实际只练了10分钟,其中凹造型5分钟6、mentor布置任务的时候,别人都是:”好的收到“,我:”是不是要xxxx,xxxx这么做也可以吧,这个技术方案会不会更好些“7、别人书包里装的:王道408、轻薄本、四六级真题。我书包里面装的:显存24GB4090独显gpu(24小时开机运行,屏幕上贴着“字节/腾讯等贴纸”)、速效救心丸(代码报错用)、电棍(熬夜写代码困了用),就很……你们懂吧8、入职大厂第一件事:发朋友圈、发小红书,晒工牌,985计算机硕|字节实习生|可以接咨询|有偿改简历,9、别人的社交软件简介:25岁|男|希望遇见有趣的灵魂;嘉豪的社交软件简介:25岁|程序员|字节跳动工程师|一张佩戴工牌的自拍照大厂嘉豪标配:1.&nbsp;挂胸前的工牌(地铁里只挂不收,怕你看不见&nbsp;logo)2.&nbsp;降噪耳机(不放音乐也戴着,避免别人跟自己说话)3.&nbsp;印&nbsp;logo&nbsp;的电脑包(字节红&nbsp;/&nbsp;腾讯蓝&nbsp;/&nbsp;阿里橙&nbsp;/&nbsp;美团黄)4.&nbsp;手表(最好显示心率,午饭后必发"步数已破&nbsp;6,000")
布布永不言弃:可曾见过“我在未上市小厂实习,丢人了xxx”,然后接着说“这个小厂的创始人是张一鸣” 然后别人要是真不认识张一鸣 就直接急了
点赞 评论 收藏
分享
评论
3
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务