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)
\]

对于 \(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 高爸的更多相关文章

  1. @NOI模拟2017.06.30 - T3@ Right

    目录 @description@ @solution@ @part - 1@ @part - 2@ @accepted code@ @details@ @description@ JOHNKRAM 和 ...

  2. 面包板入门电子制作(class1)视频 全套30集高清

    面包板入门电子制作(class1)套件(30集高清) 本套件以电子制作中最基础的元器件在面包板上搭建电路,用启发性的视频教学方式,使学习者熟悉电子电路基础.发挥想像力.在创新设计和制作中学会独立设计和 ...

  3. csp-s模拟测试101的T3代码+注释

    因为题目过于大神所以单独拿出来说.而且既然下发std了颓代码貌似也不算可耻233 很难讲啊,所以还是写在代码注释里面吧 因为比较认真的写了不少注释,所以建议缩放到80%观看,或者拿到gedit上 1 ...

  4. Qbxt 模拟题 day3(am) T3 选数字 (select)(贪心)

    选数字 (select Time Limit:3000ms Memory Limit:64MB 题目描述 LYK 找到了一个 n*m 的矩阵,这个矩阵上都填有一些数字,对于第 i 行第 j 列的位置上 ...

  5. NOIP模拟测试18(T3待更新)

    T1: 直接模拟,详见代码注释. 复杂度$O(NM)$. Code: #include<iostream> #include<cstdio> #include<vecto ...

  6. @省选模拟赛03/16 - T3@ 超级树

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 一棵 k-超级树(k-SuperTree) 可按如下方法得到:取 ...

  7. [NOI.AC省选模拟赛3.30] Mas的童年 [二进制乱搞]

    题面 传送门 思路 这题其实蛮好想的......就是我考试的时候zz了,一直没有想到标记过的可以不再标记,总复杂度是$O(n)$ 首先我们求个前缀和,那么$ans_i=max(pre[j]+pre[i ...

  8. NOIP2017赛前模拟10月30日总结

    题目1: n个人参赛(n<=100000),每个人有一个权值··已知两个人权值绝对值之差小于等于K时,两个人都有可能赢,若大于则权值大的人赢···比赛为淘汰制,进行n-1轮·问最后可能赢的人有多 ...

  9. [jzoj 6093] [GDOI2019模拟2019.3.30] 星辰大海 解题报告 (半平面交)

    题目链接: https://jzoj.net/senior/#contest/show/2686/2 题目: 题解: 说实话这题调试差不多花了我十小时,不过总算借着这道题大概了解了计算几何的基础知识 ...

  10. [jzoj 6092] [GDOI2019模拟2019.3.30] 附耳而至 解题报告 (平面图转对偶图+最小割)

    题目链接: https://jzoj.net/senior/#main/show/6092 题目: 知识点--平面图转对偶图 在求最小割的时候,我们可以把平面图转为对偶图,用最短路来求最小割,这样会比 ...

随机推荐

  1. Scikit-learn从入门到放弃

    目录 Scikit-learn简介 SVM分类 随机森林回归 K-means聚类 前置建议阅读: 1.NumPy从入门到放弃 2.Pandas从入门到放弃 3.SciPy从入门到放弃 Scikit-l ...

  2. 以太坊Rollup方案之 arbitrum(1)

    什么是Rollup? 以太坊的Rollup扩容是一种Layer 2(第二层)扩容解决方案,旨在提高以太坊区块链的交易吞吐量和性能.它通过将大量的交易数据转移到以太坊区块链之外的第二层网络来实现这一目标 ...

  3. EF Core – JSON Column

    前言 SQL Server 支持 JSON, 以前写过一篇介绍 SQL Server – Work with JSON. 但 EF Core 一直没有支持. 直到 EF Core 7.0 才支持. 参 ...

  4. ASP.NET Core Library – FluentValidation

    前言 之前就有写过学习笔记: Asp.net core 学习笔记 Fluent Validation 但都是用一点记入一点,零零散散不好读, 这一篇来稍微整理一下. 主要参考: Fluent Vali ...

  5. Flutter 2.8 正式发布

    文/ Tim Sneath,Flutter & Dart 产品经理 Flutter 已经更新到 2.8 正式版,发布了多项新特性和改进以不断改善移动和 Web 端的开发体验,同时也正在将桌面端 ...

  6. 反问面试官3个ThreadLocal的问题

    ThreadLocal,一个Java人面试绕不开的话题,我也很奇怪为什么那些面试官很喜欢问这个,也不知道他们自己有没有搞清楚. 接下来,我想先说说ThreadLocal的用法和使用场景,然后反问面试官 ...

  7. Sketch Measure切图插件无法导出标注 (换插件绕过解决)

    环境 MacOS 10.15+ sketch版本 69.2 插件版本 2.8.1 遇到的问题 导出标注卡死 更新版本无解,到插件的github issue中找到解决方法 使用MeaXure插件,git ...

  8. 第15天:信息打点-主机架构&蜜罐识别&WAF识别&端口扫描&协议识别&服务安全

    端口扫描:Nmap.Masscan.网络空间 开放状态:Close Open Filtered https://nmap.org/download.html https://github.com/ro ...

  9. JS时间对象与字符串相互转换

    1.Date => String 代码 /** * 函数描述:时间格式化工具 * @param format {String} 格式(y-年,M-月,d-日,H-时[24],h-时[12],m- ...

  10. dotnet定义扩展方法

    // 扩展方法 // 1.创建静态类静态方法 2. 在静态方法中参数中使用 this 关键字指定需要扩展的类 // 密封类 不能直接继承,通过扩展方法,拿到父类的属性和方法进行扩展补充