ACM - 4743E - 线段树

题目链接

题目理解难度点:
(1)每次改动不恢复,修改的状态保持。
(2)对于一个给定的堆,堆中有i个石子,允许搬运j次。很容易猜想:要平均分配所有的石子,用数学方法可以证明。
当j=2时,7=3+4=5+2=6+1,9+16 < 4+25 < 1+36.
所以,类似贪心,而不是DP,初始化就可以把表格直接打好。
(3)如何维护。线段树。
每次修改第i堆的石子为j,跟搬运次数没有关系,那么就是单点修改,依次pushup修改总方案即可。

剩下的就是线段树模板。代码如下。

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef long long ull;
typedef long double ld;

const ll MOD = 1e9 + 7;
const int N = 400 + 10;
const int INF = 0x3f3f3f3f;

#define mid ((l + r) >> 1)
#define lson rt << 1, l, mid
#define rson rt << 1 | 1, mid + 1, r
ll n, m, q, x, v;
ll dp[N << 2][N], a[N];

ll calc(ll x, int p){
    ll num = x / p;
    ll cnt1 = x % p;
    ll cnt2 = p - cnt1;
    return cnt2 * num * num + cnt1 * (num + 1) * (num + 1);
}

void pushup(int rt){
    memset(dp[rt], 0x3f, sizeof(dp[rt]));
    for(int i = 1; i <= m; i++)
        for(int j = 1; j + i <= m; j++)
            dp[rt][i + j] = min(dp[rt][i + j], dp[rt << 1][i] + dp [rt << 1 | 1][j]);
}

void build(int rt, int l, int r){
    if (l == r){
        for(int i = 1; i <= m; i++)
            dp[rt][i] = calc(a[l], i);
        return;
    }
    build(lson);
    build(rson);
    pushup(rt);
}

void update(int rt, int l, int r, int pos){
    if (l == r){
        for(int i = 1; i <= m; i++)
            dp[rt][i] = calc(a[l], i);
        return;
    }
    if (pos <= mid) update(lson, pos);
    else update(rson ,pos);
    pushup(rt);
}

int main(){
    //freopen("input.txt", "r", stdin);
    scanf("%lld%lld" , &n , &m);
    for(int i = 1 ; i <= n ; ++i)
        scanf("%lld" , &a[i]);
    build(1 , 1 , n);
    int T;
    scanf("%d" , &T);
    while(T--){
        scanf("%lld%lld" , &x , &v);
        a[x] = v;
        update(1 , 1 , n , x);
        printf("%lld\n" , dp[1][m]);
    }
    return 0;
}

备注参考链接
点我看本套题的题解

全部评论

相关推荐

03-27 16:40
已编辑
门头沟学院 C++
26学院本太难了,很多公司机筛就给我刷了。机会都难拿到如果是简历存在问题也欢迎拷打————————————————————分割线——————————————————————2026.3.4更新:发完贴之后,时不时投递又收到了不少的笔试/面试邀请。主要是之前投递简历出去之后基本上都是沉默状态,年后好转了不少timeline:2026.01.21&nbsp;文远知行笔试,半年多没刷算法题&nbsp;-&gt;挂&nbsp;(后续HR说春招可以重新安排笔试)2026.2.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;小鹏汇天&nbsp;技术一面,第二周收到结果&nbsp;-&gt;挂2026.2.12&nbsp;&nbsp;&nbsp;大众Cariad代招&nbsp;技术二面&nbsp;-&gt;Offer2026.2.28&nbsp;&nbsp;&nbsp;多益网络技术面试,由于风评太差,一直在犹豫要不要接面试&nbsp;-&gt;推迟-----------分割线-----------2026.3&nbsp;月前的某一天,临时去电网报名了二批计算机岗位的笔试2026.3.6&nbsp;从上家公司实习离职,氛围最好的一家公司,leader&nbsp;说可以帮忙转正,但是流程太长,而且我们部门据说只有一个&nbsp;hc,更想要研究生,我很有可能是会被签外包公司在这里干活,就离职了。2026.3.9&nbsp;入职新公司,大众Cariad&nbsp;以外部公司的身份进组,项目组签了三年,后续三年应该都可以在这里呆,不知道有没有希望原地跳槽。2026.3.10&nbsp;电网考试居然说我通过资格审查了,短信约我去参加资格审查,请假一天,买了&nbsp;12&nbsp;号晚上的机票回成都2026.3.15&nbsp;参加国家电网计算机类笔试2026.3.17&nbsp;电网出成绩了,感觉很低。觉得已经🈚️了2026.3.18&nbsp;收到电网面试通知,通知&nbsp;3.22-3.25&nbsp;这个时间去面试,我的岗位只招&nbsp;1&nbsp;个人。据说面试只有&nbsp;2-3&nbsp;人,不知道能不能成功----------分割线-----------2026.3.21&nbsp;电网面试结束,感觉回答的还勉勉强强,大概是2个岗位分别招1个人,一共11人面试,实际来了9人2026.3.27&nbsp;出面试成绩,满分100分,早上10:20左右发现面试成绩46,我震惊了,没截图,后面过了十分钟重新看发现面试成绩给我改成58了。但同样震惊。朋友问我是不是把面试官打了,哈哈
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 大厂实习和小厂实习最大的区别是什么? #
2477次浏览 20人参与
# 参加完秋招的机械人,还参加春招吗? #
119948次浏览 761人参与
# 厦门银行科技岗值不值得投 #
9872次浏览 253人参与
# 牛友の3月总结 #
1881次浏览 28人参与
# 这些公司卡简历很严格 #
95210次浏览 417人参与
# 面试被问到不会的问题,你怎么应对? #
692次浏览 8人参与
# 开放七大实习专项,百度暑期实习值得冲吗 #
18840次浏览 307人参与
# 拼多多工作体验 #
52687次浏览 342人参与
# 研究所VS国企,该如何选 #
259071次浏览 2013人参与
# 通信硬件知识分享 #
48135次浏览 538人参与
# 找AI工作可以去哪些公司? #
17113次浏览 755人参与
# 从事AI岗需要掌握哪些技术栈? #
14951次浏览 850人参与
# 你做过最难的笔试是哪家公司 #
47513次浏览 762人参与
# 实习最想跑路的瞬间 #
130959次浏览 740人参与
# 金三银四,你的春招进行到哪个阶段了? #
24583次浏览 297人参与
# 说说你知道的学历厂 #
391008次浏览 1379人参与
# AI面会问哪些问题? #
36247次浏览 1080人参与
# 想给25届机械人的秋招建议 #
47743次浏览 251人参与
# 机械人避雷的岗位/公司 #
62887次浏览 395人参与
# 大厂无回复,继续等待还是奔赴小厂 #
343363次浏览 1988人参与
# 滴!实习打卡 #
814713次浏览 6858人参与
# 我心目中的理想工作是这样的 #
100873次浏览 907人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务