NOIP2023模拟9联测30 T3 高爸
NOIP2023模拟9联测30 T3 高爸
三分啊,三分……
思路
设现在的平均力量值为 \(x\),大于 \(x\) 力量值的龙有 \(n\) 条,小于等于的龙有 \(m\) 条,花费为:
\]
对于 \(a(n \times x-\sum_{i=1}^{n+m} p_i (p_i>x))\) 和 \(b(\sum_{i=1}^{n+m} p_i (p_i \leq x) - m \times x)\) 来说,都具有三分性质,凹函数的和也具有三分性质,所以可以三分。
这里写的是关于 \(x\) 值域的三分。
将 \(p_i\) 离散化后,钦定 \(x\) 后求答案时,使用树状数组求 \(p_i\) 的前缀和和小于 \(x\) 的个数。
三分时间复杂度 \(\log n\),树状数组时间复杂度 \(\log n\),总复杂度 \(O(n \log^2 n)\)。
CODE
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll maxn=1e5+5;
int n,cnt;
int nx[maxn],tmp[maxn],fp[maxn],x[maxn];
ll a,b,sum;
ll ts[maxn],tc[maxn];
unordered_map<ll,int>mp;
set< ll >s;
inline ll read() {
ll s = 0, w = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-')
w = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar();
return s * w;
}
inline void write(ll X)
{
if(X<0) {X=~(X-1); putchar('-');}
if(X>9) write(X/10);
putchar(X%10+'0');
}
inline void lsh()
{
copy(x+1,x+n+1,tmp+1);
sort(tmp+1,tmp+n+1);
tmp[0]=-1;
for(ll i=1;i<=n;i++)
if(tmp[i]!=tmp[i-1]) mp[tmp[i]]=++cnt,fp[cnt]=tmp[i];
for(ll i=1;i<=n;i++) nx[i]=mp[x[i]];
}
ll lowbit(ll x){return x&(-x);}
inline void updata(int x,ll y)
{
while(x<=n)
{
ts[x]+=y;
tc[x]++;
x+=lowbit(x);
}
}
inline pair<ll,ll> gtsum(int x)
{
ll sumcnt=0,sumsum=0;
while(x)
{
sumsum+=ts[x];
sumcnt+=tc[x];
x-=lowbit(x);
}
return make_pair(sumcnt,sumsum);
}
inline ll gt(ll x,ll t)
{
auto k=s.upper_bound(x);
if(k==s.begin()) return (sum-t*x)*b;
k--;
ll tp=0;
tp=mp[*k];
pair<ll,ll> tmp=gtsum(tp);
ll tcnt=tmp.first,tsum=tmp.second;
return (tcnt*x- tsum)*a+(sum-tsum-(t-tcnt)*x)*b;
}
inline ll gtans(int t)
{
int l=1,r=1e9;
ll ans=2e18;
while(l<=r)
{
int mid=l+r>>1;
int midl=mid+l>>1,midr=mid+r>>1;
ll vm=gt(mid,t),vml=gt(midl,t),vmr=gt(midr,t);
if(vml<=vm&&vm<=vmr) ans=vml,r=midr-1;
else if(vml>=vm&&vm>=vmr) ans=vmr,l=midl+1;
else ans=vm,l=midl+1,r=midr+1;
}
return ans;
}
signed main()
{
scanf("%d%lld%lld",&n,&a,&b);
for(int i=1;i<=n;i++) x[i]=read();
lsh();
printf("0\n");
updata(nx[1],x[1]);
sum=x[1];
s.insert(x[1]);
for(int i=2;i<=n;i++)
{
sum+=x[i];
updata(nx[i],x[i]);
s.insert(x[i]);
ll ans=gtans(i);
write(ans);
putchar('\n');
}
}
后记
常数有点小大,需要快读快输和 inline。
NOIP2023模拟9联测30 T3 高爸的更多相关文章
- @NOI模拟2017.06.30 - T3@ Right
目录 @description@ @solution@ @part - 1@ @part - 2@ @accepted code@ @details@ @description@ JOHNKRAM 和 ...
- 面包板入门电子制作(class1)视频 全套30集高清
面包板入门电子制作(class1)套件(30集高清) 本套件以电子制作中最基础的元器件在面包板上搭建电路,用启发性的视频教学方式,使学习者熟悉电子电路基础.发挥想像力.在创新设计和制作中学会独立设计和 ...
- csp-s模拟测试101的T3代码+注释
因为题目过于大神所以单独拿出来说.而且既然下发std了颓代码貌似也不算可耻233 很难讲啊,所以还是写在代码注释里面吧 因为比较认真的写了不少注释,所以建议缩放到80%观看,或者拿到gedit上 1 ...
- Qbxt 模拟题 day3(am) T3 选数字 (select)(贪心)
选数字 (select Time Limit:3000ms Memory Limit:64MB 题目描述 LYK 找到了一个 n*m 的矩阵,这个矩阵上都填有一些数字,对于第 i 行第 j 列的位置上 ...
- NOIP模拟测试18(T3待更新)
T1: 直接模拟,详见代码注释. 复杂度$O(NM)$. Code: #include<iostream> #include<cstdio> #include<vecto ...
- @省选模拟赛03/16 - T3@ 超级树
目录 @description@ @solution@ @accepted code@ @details@ @description@ 一棵 k-超级树(k-SuperTree) 可按如下方法得到:取 ...
- [NOI.AC省选模拟赛3.30] Mas的童年 [二进制乱搞]
题面 传送门 思路 这题其实蛮好想的......就是我考试的时候zz了,一直没有想到标记过的可以不再标记,总复杂度是$O(n)$ 首先我们求个前缀和,那么$ans_i=max(pre[j]+pre[i ...
- NOIP2017赛前模拟10月30日总结
题目1: n个人参赛(n<=100000),每个人有一个权值··已知两个人权值绝对值之差小于等于K时,两个人都有可能赢,若大于则权值大的人赢···比赛为淘汰制,进行n-1轮·问最后可能赢的人有多 ...
- [jzoj 6093] [GDOI2019模拟2019.3.30] 星辰大海 解题报告 (半平面交)
题目链接: https://jzoj.net/senior/#contest/show/2686/2 题目: 题解: 说实话这题调试差不多花了我十小时,不过总算借着这道题大概了解了计算几何的基础知识 ...
- [jzoj 6092] [GDOI2019模拟2019.3.30] 附耳而至 解题报告 (平面图转对偶图+最小割)
题目链接: https://jzoj.net/senior/#main/show/6092 题目: 知识点--平面图转对偶图 在求最小割的时候,我们可以把平面图转为对偶图,用最短路来求最小割,这样会比 ...
随机推荐
- 从网友探秘 《黑神话:悟空》 的脚本说说C#
<黑神话:悟空>千呼万唤始出来.在正式发售后不到24小时,Steam在线玩家峰值突破222万,在Steam所有游戏在线玩家历史峰值中排名第二.第一拨玩家纷纷晒出好评,称这款现象级产品正式开 ...
- 使用 nuxi dev 启动 Nuxt 应用程序的详细指南
title: 使用 nuxi dev 启动 Nuxt 应用程序的详细指南 date: 2024/9/2 updated: 2024/9/2 author: cmdragon excerpt: 摘要:本 ...
- 消息队列为什么选用redis?聊聊如何做技术方案选型?
消息队列为什么选用redis?聊聊如何做技术方案选型? 老生常谈,消息队列主要有几大用途: 解耦:下单完成之后,需要订单服务去调用库存服务减库存,调用营销服务加营销数据. 引入消息队列,可以把订单完成 ...
- 用 SQL 写的俄罗斯方块游戏「GitHub 热点速览」
在开始介绍上周热门开源项目之前,要插播一条开源新闻:Nginx 已正式迁移至 GitHub. 近日,Nginx 官方宣布将 Nginx 开源项目,从 Mercurial 迁移至 GitHub 代码托管 ...
- 画流程图、状态图、时序图、甘特图的JS库-mermaid-js
参考地址:https://github.com/mermaid-js/mermaid 原生使用方式: <!DOCTYPE html> <html> <head> & ...
- JS的可选链操作符(?.)与双问号(??),你用到了吗?
可选链操作符(?.) 以前一般这样使用: let nestedProp = obj.first && obj.first.second; 或者这样: let temp = obj.fi ...
- JS之AMD、CMD、CommonJS、ES6、UMD的使用笔记
前言 如下图: AMD与CMD的主要区别: 1. 对于依赖的模块,AMD 是提前执行,CMD 是延迟执行.不过 RequireJS 从 2.0 开始,也改成可以延迟执行(根据写法不同,处理方式不同). ...
- CSS & JS Effect – fade in
参考: stackoverflow – Is there a CSS-only (pure CSS) workaround to apply fade-in and fade-out on objec ...
- 反DDD模式之“复用”
本文书接上回<反DDD模式之关系型数据库>,关注公众号(老肖想当外语大佬)获取信息: 最新文章更新: DDD框架源码(.NET.Java双平台): 加群畅聊,建模分析.技术实现交流: 视频 ...
- Go语言中的位运算符
位运算(bitwise operations)是计算机科学中非常基础且重要的运算类型,它直接操作二进制位.Go语言中提供了一组位运算符,用于执行位级别的操作. Go语言中的位运算符 按位与(& ...