首页 > 其他分享 >NOIP2023模拟9联测30 T3 高爸

NOIP2023模拟9联测30 T3 高爸

时间:2023-11-02 22:35:59浏览次数:32  
标签:tmp ch int ll 30 T3 高爸 maxn sum

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。

标签:tmp,ch,int,ll,30,T3,高爸,maxn,sum
From: https://www.cnblogs.com/binbinbjl/p/17806513.html

相关文章

  • 学习笔记8——20211303ltc
    学习笔记8一、作业要求自学教材第5章,提交学习笔记(10分),评分标准如下1.知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容(4分)“我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题”核......
  • 10.30
    今天实现了对于学生个人信息添加的基本功能,我使用的是springboot实现后端的代码,通过springboot加mybatis实现接口类的实现。POJO包定义类变量以及返回值变量1、PersonInformation.javapackagecom.example.pojo;importlombok.AllArgsConstructor;importlombok.Data;imp......
  • 揭秘!自动化测试效率提升30%如何达成
      一个全新的应用需要经过需求设计、应用开发、应用测试,及应用上架等几个阶段之后,才能到达用户手中。在应用测试中,测试的类型根据不同的开展时机,可以分为单元测试、集成测试、专项测试,以及上架测试。单元测试指对软件中的最小可测试单元进行验证,围绕函数、类、方法等展开,大......
  • 喜讯!INFINI Easysearch 在墨天轮数据库排名中挺进前30!
    近日,2023年10月的墨天轮中国数据库流行度排行火热出炉,本月共有283个数据库参与排名,中国数据库行业竞争日益激烈。其中,极限科技旗下软件产品INFINIEasysearch稳步推进,在国内整个数据库排行中进入了前30的行列!同时在搜索型数据库分类排名中保持领先,稳住了第一名的......
  • 10-30 NOIP模拟赛
    10-30NOIP模拟赛今天分数还看的过去,只是第二题没有正解,第三题没有35我表示很伤心。必须继续努力,保持内心纯净,心无杂念,知行合一,摒除恶念。100+80+5=185芜湖!T1新的阶乘(factorial)题目描述我们定义\(f(x)=x^1×(x−1)^2×(x−2)^3…2^{x−1}×1^x\),请求出\(f(n)\)......
  • 10.30 CF1685 题解
    10.30CF1685A.CircularLocalMiniMax题意给你\(n\)个整数$a_1,a_2,\ldots,a_n$。问有没有可能将它们排列在一个圆上,使每个数字严格地大于其相邻的两个数字或严格地小于其相邻的两个数字?题解直接排序然后按照\(1,4,2,5,3,6\)的规律放,check一下合不合法就行了。......
  • acwing300任务安排1对“费用提前计算”的解释
    我们考查对任意一种方案答案的构成假设最终方案只有这三段那么很显然,答案为$$(S+sumT_[i])\cdotsumC_{i}+(2S+sumT_[j])\cdot(sumC_{j}-sumC_{i})+(3S+sumT_[n])\cdot(sumC_{n}-sumC_{j})$$我们换一种写法,答案为$$sumT_{i}\cdotsumC_{i}+sumT_{j}\cdot(sumC_{j}-sumC_{i}......
  • 20231030
    上午去搓了铁,用小锯子锯了一段钢柱,加工成了一个心形,总之就是很累,学到了这个技术,感觉我也可以去工地了,学什么编程,哈哈。下午上课Java测试,勉强过关,分数低是因为没有写完前端页面,前端功能没实现完。下午和同学确定了一个新的玩具的选题,最近又有事情做了。......
  • (11/1-11/30)11月摸鱼计划,挑战7/14/21天发博文,实体礼品包邮送!
    11月摸鱼计划,来啦!新增优质博文奖,支持博主们写更多的好文章!【活动时间】发文时间:2023年11月1日—2023年11月30日【活动任务】以下任务福利可同享!!任务一:7天更文任务要求任务链接任务奖品7天发布文章(可以非连续)发文直达>>https://blog.51cto.com/creative-center/task”BUG“钥匙扣(款......
  • 「Log」做题记录 2023.10.30-
    \(2023.10.30-2023.11.1\)\(\color{blueviolet}{AT\_abc285\_g}\)神秘题。网络流是显著的,建边方式如下:所有边容量都为\(1\)。每个点拆为入点和出点,\(S\)向入点连边,出点向\(T\)连边。1的入点向出点连边。2的出点向四联通的2或?的入点连边?当做上两个处理。考......