ABC127

ABC127 D#

题目大意:

给定数字a1an,有m次顺序操作,每次可以将最多bi张牌变成ci,求m次操作后卡牌上最大总点数和的情况

题解:

挺新奇的思路,将n张牌和i=1mbi张牌全部丢进去,取最大的n张牌出来

不用实际丢进去,只要一个归并排序的合并方法就可以

ABC127 E#

题目大意:

nm的棋盘中选择k个点,一种方法的贡献是k个点中两两曼哈顿距离之和,求所有方案的贡献和

nm2e5

题解:

对于一种选择方案,贡献是:

i=1k1j=i+1k|xixj|+|yiyj|

显然我没发现x,y可以分开讨论,我们以讨论x的贡献为例

一种好出的想法是枚举两个点的x坐标造成的贡献,然后其他点任意选择

i=1n1j=1n|ij|m2(nm2k2)

这样复杂度无法接受,但是其实只要枚举|ij|就可以了,设d=|ij|

d=1n1d(nd)m2(nm2k2)

ABC127 F#

题目大意:

有一个函数f(x),初始时f(x)=0

有两种操作:

第一种:f(x)=f(x)+|xa|+b

第二种:求令f(x)最小的xf(x)的最小值

题解:

每个b的独立计算的,只要求x0使得i|x0ai|最小

等价于动态求中位数

学到了一种看上去很牛逼的对顶堆写法,超短

Copy
#include<bits/stdc++.h> using namespace std; namespace red{ #define int long long #define ls(p) (p<<1) #define rs(p) (p<<1|1) #define mid ((l+r)>>1) #define eps (1e-12) inline int read() { int x=0;char ch,f=0; for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar()); if(ch=='-') f=1,ch=getchar(); while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} return f?-x:x; } const int N=5e5+10,mod=1e9+7; int n,sum; priority_queue<int,vector<int>,greater<int> > q2; priority_queue<int> q1; inline void main() { n=read(); for(int opt,x,y,i=1;i<=n;++i) { opt=read(); if(opt==1) { x=read(),y=read(); sum+=y; q1.push(x);q2.push(x); int l=q1.top();q1.pop(); int r=q2.top();q2.pop(); if(l>r){sum+=l-r;swap(l,r);} q1.push(l);q2.push(r); } else { printf("%lld %lld\n",q1.top(),sum); } } } } signed main() { red::main(); return 0; }
posted @   lovelyred  阅读(71)  评论(3编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示
CONTENTS