P3992 [BJOI2017]开车

P3992 [BJOI2017]开车

题意:

在这里插入图片描述

题解:

我们要先将问题转换
圈是车,x是加油站。红色部分为车移动的路线
数组a是车数量的前缀和
数组b是加油站的前缀和
而a[i]与b[i]的差的绝对值就是对应的红色路被走的次数
在这里插入图片描述
现在车发生位置移动,b数组没有影响,a数组i到j这段整体减一
在这里插入图片描述
现在我们要做的就是维护a序列,支持区间+1/-1,询问∑| a[i] - b[i] |
线段树不能实现
用分块实现
实现过程:
按照下标分块,每块按照a[i] - b[i] 排序
在这里插入图片描述

代码:

代码为借鉴

#pragma optimize("Ofast")
#include<bits/stdc++.h>
#define MAXN 150005
#define MAXB 2005
using namespace std;
typedef long long ll;int N,B,Q;
int a[MAXN], w[MAXN];
map<int,int> mp;
map<int,int>::iterator it;
map<int,int> id;int q[MAXN][2];
struct Node{int w,val,id,sw;Node(int id=0, ll val=0, int w=0):id(id), val(val), w(w){}bool operator < (const Node& n1) const{return val < n1.val;}
};
vector<Node> adj[MAXN];
ll ANS = 0, ans[MAXN], base[MAXN];void rebuild(int id){ANS -= ans[id]; ans[id] = 0;sort(adj[id].begin(), adj[id].end());for(int k=0;k<adj[id].size();k++){ans[id] += abs((ll)adj[id][k].val + base[id]) * adj[id][k].w;if(k==0) adj[id][k].sw = adj[id][k].w;else adj[id][k].sw = adj[id][k-1].sw + adj[id][k].w;}ANS += ans[id];
}void work(int l, int r, int f){int idl = l/B, idr = r/B;if(idl==idr){for(int k=0;k<adj[idl].size();k++){if(l<=adj[idl][k].id && adj[idl][k].id<=r){if(f==0) adj[idl][k].val -= 1;if(f==1) adj[idl][k].val += 1;}}rebuild(idl);}else{if(idl+1<idr){for(int id=idl+1;id<idr;id++){//int lb = 0, rb = adj[id].size()-1, mid;if(f==0){if(adj[id][rb].val + base[id] <= 0){ans[id] += adj[id][rb].sw;ANS += adj[id][rb].sw;base[id] -= 1;continue;}while(lb < rb){mid = (lb + rb)/2;if(adj[id][mid].val + base[id] > 0) rb = mid;else lb = mid + 1;}base[id] -= 1;int p = rb;if(p==0){ans[id] -= adj[id][adj[id].size()-1].sw;ANS -= adj[id][adj[id].size()-1].sw;}else{ans[id] += adj[id][p-1].sw;ANS += adj[id][p-1].sw;ans[id] -= adj[id][adj[id].size()-1].sw - adj[id][p-1].sw;ANS -= adj[id][adj[id].size()-1].sw - adj[id][p-1].sw;}}else{if(adj[id][rb].val + base[id] < 0){ans[id] -= adj[id][rb].sw;ANS -= adj[id][rb].sw;base[id] += 1;continue;}while(lb < rb){mid = (lb + rb)/2;if(adj[id][mid].val + base[id] >= 0) rb = mid;else lb = mid + 1;}base[id] += 1;int p = rb;if(p==0){ans[id] += adj[id][adj[id].size()-1].sw;ANS += adj[id][adj[id].size()-1].sw;}else{ans[id] -= adj[id][p-1].sw;ANS -= adj[id][p-1].sw;ans[id] += adj[id][adj[id].size()-1].sw - adj[id][p-1].sw;ANS += adj[id][adj[id].size()-1].sw - adj[id][p-1].sw;}}}}for(int k=0;k<adj[idl].size();k++){if(l<=adj[idl][k].id && adj[idl][k].id<=r){if(f==0) adj[idl][k].val -= 1;if(f==1) adj[idl][k].val += 1;}}rebuild(idl);for(int k=0;k<adj[idr].size();k++){if(l<=adj[idr][k].id && adj[idr][k].id<=r){if(f==0) adj[idr][k].val -= 1;if(f==1) adj[idr][k].val += 1;}}rebuild(idr);}
}int pos[MAXN];int main(){scanf("%d", &N);int x;for(int i=1;i<=N;i++){scanf("%d", &x);pos[i] = x;mp[x] += 1;}for(int i=1;i<=N;i++){scanf("%d", &x);mp[x] -= 1;}scanf("%d", &Q);for(int i=1;i<=Q;i++){scanf("%d%d", &q[i][0], &q[i][1]);if(mp.count(q[i][1])==0) mp[q[i][1]] = 0;}int n = 0, x0 = 0;for(it=mp.begin(); it!=mp.end(); ++it){x = it->first;id[x] = ++n;w[n-1] = x - x0;a[n] = a[n-1] + it->second;x0 = x;}N = n; B = sqrt(N); //cerr<<"B = "<<B<<endl;for(int i=1;i<=N;i++){adj[i/B].push_back(Node(i,a[i],w[i]));}for(int id=0;id<=N/B;++id){rebuild(id);}printf("%lld\n", ANS);int l,r;for(int i=1;i<=Q;i++){l = id[pos[q[i][0]]];r = id[q[i][1]];pos[q[i][0]] = q[i][1];//cerr<<"work "<<l<<" "<<r<<endl;if(l < r) work(l, r-1, 0);if(l > r) work(r, l-1, 1);printf("%lld\n", ANS);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318153.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IdentityServer4-MVC+Hybrid实现Claims授权验证(四)

上节IdentityServer4-客户端的授权模式原理分析&#xff08;三&#xff09;以对话形式&#xff0c;大概说了几种客户端授权模式的原理&#xff0c;这节重点介绍Hybrid模式在MVC下的使用。且为实现IdentityServer4从数据库获取User进行验证&#xff0c;并对Claim进行权限设置打下…

漫谈何时从单体架构迁移到微服务?

面对微服务如火如荼的发展&#xff0c;很多人都在了解&#xff0c;学习希望能在自己的项目中帮得上忙&#xff0c;当你对微服务的庐山真面目有所了解后&#xff0c;接下来就是说服自己了&#xff0c;到底如何评估微服务&#xff0c;什么时候使用微服务&#xff0c;什么时间点最…

[CSP-S Day1,Day2 游记]提高组考后总结及学习编程C++以来的心得体会

怀着沉重而感慨的心情写下了这篇blog考试中暴露的问题Day1Day2综上解决方法学习历程及以来的心得体会职业精神这篇博客我可能会写好几天&#xff0c;我jio得这篇博客对我的学习历程以及态度产生深刻影响考试中暴露的问题 首先先说这次提高组考试的每道题所遇到的各种问题吧 Da…

【.NET Core项目实战-统一认证平台】第十二章 授权篇-深入理解JWT生成及验证流程...

上篇文章介绍了基于Ids4密码授权模式&#xff0c;从使用场景、原理分析、自定义帐户体系集成完整的介绍了密码授权模式的内容&#xff0c;并最后给出了三个思考问题&#xff0c;本篇就针对第一个思考问题详细的讲解下Ids4是如何生成access_token的&#xff0c;如何验证access_t…

P5049 [NOIP2018 提高组] 旅行

P5049 [NOIP2018 提高组] 旅行 题意&#xff1a; 一棵树(可能是基环树)&#xff0c;从1出发&#xff0c;每到达一个新的点就记录下编号。求一种走法使得记录下来的编号字典序最小。 1≤n≤500000 mn−1 或 mn 题解&#xff1a; 如果不是基环树&#xff0c;那直接每次走字典…

[2019CSP-S Day1]提高组Day1题解(格雷码[模拟(k转二进制取反的做法带证明)] + 括号树[DP] + 树上的数(暴力+菊花图+单链))

Day1T1&#xff1a;格雷码题目题解代码实现T2&#xff1a;括号树题目题解代码实现T3&#xff1a;树上的数题目10pts暴力题解代码实现25pts菊花图题解代码实现25pts单链题解代码实现T1&#xff1a;格雷码 题目 通常&#xff0c;人们习惯将所有 n位二进制串按照字典序排列&…

使用PerfView监测.NET程序性能(四):折叠,过滤和时间范围选择

在上一篇文章使用PerfView监测.NET程序性能&#xff08;三&#xff09;&#xff1a;分组中&#xff0c;我们使用了Perfview的分组功能。分组功能旨在对某些函数按照某个格式进行分组&#xff0c;以减少视图中的各种无关函数的数量。但仅有分组还不够&#xff0c;有时我们想将一…

带旋treap概念及模板,带例题:普通平衡树

带旋Treap二叉查找树BST(Binary Search Tree)定义Treap定义模板合集&#xff08;均为O(logn)O(logn)O(logn)&#xff09;push_up模板旋转模板插入模板删除模板查找前驱模板查找后驱模板查找键值key模板查找节点的修正值rank模板PS&#xff1a;rd的比较问题例题&#xff1a;普通…

微服务系列实践 .NET CORE

从事这个行业转眼已经6年了&#xff0c;从当初刚毕业的在北京朝八晚十&#xff0c;从二环到五环&#xff0c;仍每天精力充沛的小愤青&#xff1b;再到深圳一点一滴的辛勤在软件行业的耕种&#xff0c;从当初单体应用架构到现在微服务架构的经历&#xff0c;回想起来自己的收获倒…

P2607 [ZJOI2008]骑士

P2607 [ZJOI2008]骑士 题意&#xff1a; n个点n个边&#xff0c;每个点都有权值&#xff0c;相邻的点不能同时选择&#xff0c;问如何选择能使得权值最大 题解&#xff1a; 这个题很有P1352 没有上司的舞会这个题的感觉&#xff0c;唯一的区别是那个题保证是树&#xff0c;…

模板:线段树优化建图

前言 百川到海&#xff0c;天下归一 解析 线段树优化建图是用于对一个区间的点连边时的优化方法 建一棵in树一棵出树分别往上和下指即可 大概长这样 &#xff08;pia的洛谷的照片&#xff09; 建树 正常动态开点即可 void build(int &k,int l,int r){tr[ktot](tree){0…

[非旋平衡树]fhq_treap概念及模板,例题:普通平衡树,文艺线段树

文章目录概念全套模板push_up模板split拆树模板(按权值拆)split拆树模板(按个数拆)merge合并模板&#xff08;地址版&#xff09;merge合并模板&#xff08;带返回根&#xff09;区间模板insert插入模板delete删除模板find_kth找第k大模板get_rank找排名模板pre找前驱模板suf找…

surging 微服务引擎 1.0 正式发布

surging 是一个分布式微服务引擎,提供高性能RPC远程服务调用&#xff0c;服务引擎支持http、TCP、WS、Mqtt协议,采用Zookeeper、Consul作为surging服务的注册中心&#xff0c;集成了哈希一致性&#xff0c;随机&#xff0c;轮询、压力最小优先作为负载均衡的算法&#xff0c;底…

YBTOJ:彩色圆环

文章目录前言题目描述InputOutputSample InputSample Output解析代码前言 尽信书&#xff0c;则不如无书 题目描述 Input 仅有一行&#xff0c;该行给出依次两个正整数N, M&#xff0c;分别表示宝石的个数和宝石在变化时可能变成的颜色种类数。 Output 应仅有一行&#xff0…

【2019CSP-J 普及组题解】数字游戏(number),公交换乘(transfer),纪念品(souvenir),加工领奖(work) CSP普及游记

文章目录T1&#xff1a;数字游戏题目CODET2&#xff1a;公交换乘题目CODET3&#xff1a;纪念品题目题解CODET4&#xff1a;加工领奖题目题解CODE关于普及组的想法&游记T1&#xff1a;数字游戏 题目 小 K 同学向小 P 同学发送了一个长度为 8 的 01 字符串来玩数字游戏&…

搭建基于Docker社区版的Kubernetes本地集群

Kubernetes的本地集群搭建是一件颇费苦心的活&#xff0c;网上有各种参考资源&#xff0c;由于版本和容器的不断发展&#xff0c;搭建的方式也是各不相同&#xff0c;这里基于Docker CE的18.09.0版本&#xff0c;在Mac OS、Win10下分别搭建了一次。一、Mac OS下搭建安装Docker …

Infinite Tree

Infinite Tree 题意&#xff1a; 题解&#xff1a; 参考博客 看了好一阵子才明白。。。emm。 我们先按照题意画出一部分树 我们先不考虑复杂度&#xff0c;这题应该怎么做&#xff1f; 题目给了每个点的权值w[i]&#xff0c;问一个点到所有的节点路径长度*点权之和最小是多少…

IdentityServer4-从数据库获取User登录并对Claims授权验证(五)

本节将在第四节基础上介绍如何实现IdentityServer4从数据库获取User进行验证&#xff0c;并对Claim进行权限设置。一、新建Web API资源服务&#xff0c;命名为ResourceAPI&#xff08;1&#xff09;新建API项目&#xff0c;用来进行user的身份验证服务。&#xff08;2&#xff…

周末狂欢赛1(玩游戏/Game,函数,JOIOI王国)

狂欢1T1&#xff1a;玩游戏 / Game题目题解代码实现T2&#xff1a;函数题目题解代码实现T3&#xff1a;JOIOI王国题目题解代码实现T1&#xff1a;玩游戏 / Game 题目 ljcc 和他的学妹在玩游戏&#xff0c;这个游戏共有 n 轮&#xff0c;在第 i 轮获胜会获得 i 分&#xff0c;…

用ABP只要加人即可马上加快项目进展(二) - 分工篇 - BDD实战篇 - .NET Core里跑Specflow...

这是<如何用ABP框架快速完成项目 >系列中的一篇文章。BDD很赞&#xff01;比TDD先进很多&#xff0c;能够大大提高编码效率。上一篇文章说了如何在.NET Core里安装Specflow. 然而文章成果只到了hello world级别。要想真的和实际业务结合&#xff0c;比如要能够IOC new cl…