CSP 加赛 1

news/2025/1/15 21:01:50/文章来源:https://www.cnblogs.com/HaneDaCafe/p/18415128

A.小W与伙伴招募

考虑贪心,可以发现,每一天只需要优先选择价值低的即可

这种贪心思路有一个错误的扩展,就是先把 \(m\) 天的货一次性补齐再一次性买,这样做的问题在于有可能买到次日的货,而这样做是不被允许的

考虑放到线段树上,维护 “节点能够提供的钻石数量” 和 “节点花费” 两个值,只要我们保证价格在线段树上递增排列(这是很好做到的,排序再建树即可),那么我们就可以通过和平衡树类似的二分来向下递归

  • 如果左子树满足当前要求,直接在左子树里买
  • 否则,先把左子树买完,再在右子树里买

然后考虑怎么维护这两个值

每次补货只能单点修改,复杂度显然太高了,因此,我们设计节点数量 \(t=kb_i+s\),其中 \(b_i\)\(i\) 的每日补货数量,这样我们在每一天新开始的时候,只需要让所有的 \(k\) 都增加 \(1\) 就可以了,而这在线段树上是容易实现的

介于我们并不能同时维护加和乘,所以开两棵线段树(当然也可以合成一颗,不过两者的维护是完全没有关系的),然后在父结点上维护子节点权值和即可

还有问题就是怎么在补货之后比较快地实现 pushdown,可以在外面开两个前缀和来实现(分别对应两颗线段树)

然后是 lazytag,针对本题需要开两个 tag,一个维护补货时候的 k 增量,一个维护买了东西以后的整体清空,执行的时候先清空再增,注意顺序

\(-1\) 直接赋成 \(1e6\) 就行了

另外需要注意的就是,不要直接对 \(m\) 建树,可以考虑微调一下 sort,让价值相同的中,数量最多的排在前面,然后你只要遇到一个 \(-1\) 就说明你一直买这个就行了(后面的都更贵),因此直接对此时的 \(i\) 建树就行了

不过我不明白为啥对 \(m\) 建树会导致答案错掉

#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
template<typename T>
void read(T& x){x=0;bool sym=0;char c=getchar();while(!isdigit(c)){sym^=(c=='-');c=getchar();}while(isdigit(c)){x=x*10+c-48;c=getchar();}if(sym)x=-x;
}
template<typename T,typename... Args>
void read(T& x,Args&... args){read(x);read(args...);
}
#define int long long
struct tree{int l,r;int tot_sum,cost_sum;int lazy_cover,lazy_k;
}t[200001*4];
int tot_sum[200001],cost_sum[200001];
struct item{int a,b;bool operator <(const item &A)const{if(a==A.a) return b>A.b;return a<A.a;}
}w[200001];
#ifndef TOOL_H
#define TOOL_H
#endif
template<typename T>
T floor_sqrt(T x,T l=1,T r=-1){if(r==-1) r=x;int ans=-1;while(l<=r){int mid=(l+r)/2;if(mid*mid<=x){l=mid+1;ans=mid;}else{r=mid-1;}}return ans;
}
void print(__int128 x,bool first=true){if(x<0){putchar('-');print(-x,false);return;}if(x==0){if(first) putchar('0');return;}print(x/10,false);putchar((int)(x%10)+'0');
}
template<typename T>
std::string to_string(T x){std::string res;bool f=false;if(x<0){f=true;x*=-1;}while(x){res.push_back((int)(x%10)+'0');x/=10;}reverse(res.begin(),res.end());if(f) res.push_back('-');if(res.empty()) res.push_back('0');return res;
}
long long to_number(std::string x){long long res=0;bool f=false;for(int i=0;i<=(int)x.length()-1;++i){if(x[i]=='-'){f=true;}else{res=res*10+x[i]-'0';}}return res*(f?-1:1);
}
/*------TOOL_H------*/
#define tol (id*2)
#define tor (id*2+1)
#define mid(l,r) mid=((l)+(r))/2
void build(int id,int l,int r){t[id].l=l;t[id].r=r;if(l==r) return;int mid(l,r);build(tol,l,mid);build(tor,mid+1,r);
}
void update(int id){t[id].tot_sum=t[tol].tot_sum+t[tor].tot_sum;t[id].cost_sum=t[tol].cost_sum+t[tor].cost_sum;
}
void pushdown_cover(int id){if(t[id].lazy_cover){t[tol].tot_sum=t[tol].cost_sum=0;t[tor].tot_sum=t[tor].cost_sum=0;t[tol].lazy_k=t[tor].lazy_k=0;t[tol].lazy_cover=t[tor].lazy_cover=1;t[id].lazy_cover=0;}
}
void pushdown_k(int id){if(t[id].lazy_k){t[tol].tot_sum+=t[id].lazy_k*(tot_sum[t[tol].r]-tot_sum[t[tol].l-1]);t[tor].tot_sum+=t[id].lazy_k*(tot_sum[t[tor].r]-tot_sum[t[tor].l-1]);t[tol].cost_sum+=t[id].lazy_k*(cost_sum[t[tol].r]-cost_sum[t[tol].l-1]);t[tor].cost_sum+=t[id].lazy_k*(cost_sum[t[tor].r]-cost_sum[t[tor].l-1]);t[tol].lazy_k+=t[id].lazy_k;t[tor].lazy_k+=t[id].lazy_k;t[id].lazy_k=0;}
}
void change(int id,int k){if(k>0){t[id].tot_sum+=(tot_sum[t[id].r]-tot_sum[t[id].l-1]);t[id].cost_sum+=(cost_sum[t[id].r]-cost_sum[t[id].l-1]);t[id].lazy_k+=k;}else{t[id].tot_sum=0;t[id].cost_sum=0;t[id].lazy_k=0;t[id].lazy_cover=1;}
}
int ask(int id,int k){if(t[id].l==t[id].r){t[id].tot_sum-=k;t[id].cost_sum-=w[t[id].l].a*k;return w[t[id].l].a*k;}pushdown_cover(id);pushdown_k(id);int res=0;if(k<=t[tol].tot_sum){res=ask(tol,k);}else{res=t[tol].cost_sum+ask(tor,k-t[tol].tot_sum);change(tol,-1);}update(id);return res;
}
int n,m;
int c[200001];
const int inf=1e6;
signed main(){freopen("a.in","r",stdin);freopen("a.out","w",stdout);read(n,m);for(int i=1;i<=n;++i){read(c[i]);}for(int i=1;i<=m;++i){read(w[i].a,w[i].b);if(w[i].b==-1) w[i].b=inf;}sort(w+1,w+m+1);for(int i=1;i<=m;++i){tot_sum[i]=tot_sum[i-1]+w[i].b;cost_sum[i]=cost_sum[i-1]+w[i].a*w[i].b;if(w[i].b==inf){build(1,1,i);break;}}int ans=0;for(int i=1;i<=n;++i){change(1,1);ans+=ask(1,c[i]);}print(ans);
}

B.小W与制胡串谜题

[](string a,string b){return a+b<b+a;}

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

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

相关文章

基于Java+Springboot+Vue开发的民宿预订管理系统

项目简介该项目是基于Java+Springboot+Vue开发的民宿预订管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的民宿预订管理系统项目,大学生可以在实践中学…

基于Java+Springboot+Vue开发的电影订票管理系统

项目简介该项目是基于Java+Springboot+Vue开发的电影订票管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的电影订票管理系统项目,大学生可以在实践中学…

解决c盘无故被大量占用问题

解决c盘无故被大量占用问题 问题引出 在用win10、win11的时候经常遇到c盘莫名其妙的就被占用完了,即便清理后也还是没将内存释放出来,这可能是因为虚拟内存过大导致的。 虚拟内存是什么 1.Windows虚拟内存机制 Windows虚拟内存是一种内存管理技术,它允许计算机在物理内存不足…

xyctf2024 pwn

hello world checksec大多保护都开启了 main函数 int __fastcall main(int argc, const char **argv, const char **envp) {char buf[20]; // [rsp+0h] [rbp-20h] BYREFinit();printf("%s", "please input your name: ");read(0, buf, 0x48uLL);printf(&qu…

BILIBILI 字幕提取教程简略版

首先是通过 F12 拿到 AID 和 CID(见其它文章),然后调用这个接口: https://api.bilibili.com/x/player/wbi/v2?aid={av}&cid={cid}{"code":0,"message":"0","ttl":1,"data":{"aid":1855215937,"bvid…

k8s Service 服务

目录一、为什么需要 Service二、Kubernetes 中的服务发现与负载均衡 -- Service三、用例解读1、Service 语法2、创建和查看 Service四、Headless Service五、集群内访问 Service六、向集群外暴露 Service七、操作示例1、获取集群状态信息2、创建 Service、Deployment3、创建客户…

获取动态页面html

AJAX AJAX(异步JavaScript和XML)是一种无需重新加载整个页面的情况下,与服务器交换数据,将增量信息局部更新在用户界面上的技术。AJAX具有异步性,AJAX请求不会阻塞用户界面,用户可以在请求处理的同时继续与页面交互,具有更强的交互性。AJAX能使网页从浏览器请求少量信息…

V-By-One协议详解

V-By-One协议详解 V-By-One协议简介 V-by-One是一种高速串行接口技术,由日本赛恩电子公司(THine Electronics)开发,主要用于平板显示器的信号传输。它旨在替代传统的LVDS(Low Voltage Differential Signaling)技术,提供更高的传输速率和更低的功耗。 V-By-One协议特点及…

(2)Proteus8.7添加STM32F103C6直接使用编译xxx.hex文件关键步骤

1)新建工程中选项 2)Protues8.7支持芯片如下:3)点击STM32选择 Keil编译生成的 xxx.hex文件 4)使用virtual terminal显示串口信息。仿真状态,点击Debug菜单项,按图操作。

AI 框架作用是什么?

AI 框架作用 深度学习范式主要是通过发现经验数据中,错综复杂的结构进行学习。通过构建包含多个处理层的计算模型(网络模型),深度学习可以创建多个级别的抽象层来表示数据。例如,卷积神经网络 CNN 可以使用大量图像进行训练,例如对猫狗分类去学习猫和狗图片的特征。这种类…

分布式学习:Raft算法以及具体实现

Raft算法 一致性算法的要求:安全性,网络延迟、分区、丢包、重复和乱序等错误需要保证正确 可用性:集群中只需要大多数机器即可运行 不依赖时序保证一致性三种状态:follower,candidate,leader 任期:逻辑时钟的作用,每一段任期从一次选举开始分票可能会导致一个任期没有l…

通过API接口获取下来的数据需要怎样应用?

在当今数字化时代,通过API接口获取数据已成为企业获取、处理和分析信息的重要手段。API接口不仅能够提高数据交互的效率,还能促进数据的安全性和灵活性。以下是如何将通过API接口获取的数据有效应用的一些方法和策略。数据整合与分析 企业可以通过API接口将不同来源的数据整合…