csp-s模拟43,44 A,C,F
题面:https://www.cnblogs.com/Juve/articles/11534880.html
A:
T可以写成如下形式:$T=b^k*S+m*a$,
其中$m=\sum\limits_{i=1}^{k}p_i*b^i$
然后k最多64,所以枚举即可
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define int long long
#define re register
using namespace std;
int s,t,a,b,ans=0x7fffffff,res,tot=0,n=1;
signed main(){
scanf("%lld%lld%lld%lld",&s,&t,&a,&b);
while(t-s*n>=0){
re int p=t-s*n;
if(p%a==0){
p/=a;
res=0;
for(re int i=tot;i>=0;--i){
int q=pow(b,i);
res+=p/q;
p%=q;
}
ans=min(res+tot,ans);
}
n*=b;
++tot;
}
printf("%lld\n",ans);
return 0;
}
C:
有一个贪心策略
对于每一个点,我们找能加热到它的加热器中右端点最大的一个,然后加热
如果没有符合的就用特殊加热器
如果扫到当前点它已经加热超过p了就跳过
然后有一个部分分算法
如果p很小,我们可以枚举特殊加热器的使用次数,提前给他们加热,然后用贪心策略解决
之后我们优化贪心
我们发现预先枚举的使用特殊加热器的次数所得到的答案具有单谷性质,所以我们可以三分
修改操作用差分和树状数组即可
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#define int long long
#define re register
using namespace std;
const int MAXN=1e5+5;
int n,m,t,p[MAXN],maxx=0,ans,g[MAXN],c[MAXN],l,r;
struct node{
int l,r;
friend bool operator < (node a,node b){
return a.l==b.l?a.r<b.r:a.l<b.l;
}
}pos[MAXN];
int lowbit(int x){
return x&-x;
}
int update(int x,int val){
while(x<=n){
c[x]+=val;
x+=lowbit(x);
}
}
int query(int x){
int res=0;
while(x>0){
res+=c[x];
x-=lowbit(x);
}
return res;
}
int check(int k){
int res=k*t;
for(int i=1;i<=n;++i) c[i]=0;
for(int i=1;i<=n;++i){
int q=query(i);
if(q+k>=p[i]) continue;
if(g[i]==0||g[i]>n){
return -0x7fffffffffffffff;
}else{
int tim=p[i]-q-k;
res+=tim;
update(i,tim);
update(g[i]+1,-tim);
}
}
return -res;
}
signed main(){
scanf("%lld%lld%lld",&n,&m,&t);
for(int i=1;i<=n;++i){
scanf("%lld",&p[i]);
maxx=max(maxx,p[i]);
}
for(int i=1;i<=m;++i)
scanf("%lld%lld",&pos[i].l,&pos[i].r);
sort(pos+1,pos+m+1);
int j=1,mx=0;
for(int i=1;i<=n;++i){
if(mx<i) mx=0;
while(j<=m&&pos[j].l<=i) mx=max(mx,pos[j++].r);
g[i]=mx;
}
l=0,r=maxx;
while(r-l>2){
int lmid=(l+r)>>1;
int rmid=lmid+1;
if(check(lmid)<=check(rmid)) l=lmid;
else r=rmid;
}
ans=min(min(-check(l),-check(r)),-check(l+1));
printf("%lld\n",ans);
return 0;
}
F:
30分dp:设f[i][j]表示前i个操作,指针一个在p[i],一个在j的最小代价
转移:
$f[i][j]=min{f[i-1][j]+abs(pos[i]-pos[i-1])}$
$f[i][pos[i-1]]=min(f[i][pos[i-1]],f[i-1][j]+abs(j-pos[i]))$
然后考虑优化
第一个式子我们可以用线段树的区间加
第二个式子我们把abs拆开,用线段树维护f[i][j]+j和f[i][j]-j的最小值
具体操作:先用线段树分别找f[i][j]+j和f[i][j]-j的最小值,比较f[i][j]+j-pos[i]和f[i][j]-j+pos[i],
然后将整个区间加上abs(pos[i]-pos[i-1]),最后将pos[i-1]处的权值修改为上面的最小值
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
#define re register
using namespace std;
const int MAXN=1e5+5;
int n,q,a,b,pos[MAXN];
struct node{
int val,min1,min2,l,r,laz;
}tr[MAXN<<2];
void pushup(int k){
tr[k].val=min(tr[k<<1].val,tr[k<<1|1].val);
tr[k].min1=min(tr[k<<1].min1,tr[k<<1|1].min1);
tr[k].min2=min(tr[k<<1].min2,tr[k<<1|1].min2);
}
void down(int k){
tr[k<<1].val+=tr[k].laz;
tr[k<<1].min1+=tr[k].laz;
tr[k<<1].min2+=tr[k].laz;
tr[k<<1].laz+=tr[k].laz;
tr[k<<1|1].val+=tr[k].laz;
tr[k<<1|1].min1+=tr[k].laz;
tr[k<<1|1].min2+=tr[k].laz;
tr[k<<1|1].laz+=tr[k].laz;
tr[k].laz=0;
}
void build(int k,int l,int r){
tr[k].l=l,tr[k].r=r;
tr[k].laz=0;
tr[k].val=tr[k].min1=tr[k].min2=0x7fffffff;
if(l==r){
tr[k].val=tr[k].min1=tr[k].min2=0x7fffffff;
if(l==a){
tr[k].val=abs(pos[1]-b);
tr[k].min1=tr[k].val-l;
tr[k].min2=tr[k].val+l;
}
if(l==b){
tr[k].val=abs(pos[1]-a);
tr[k].min1=tr[k].val-l;
tr[k].min2=tr[k].val+l;
}
return ;
}
int mid=(l+r)>>1;
build(k<<1,l,mid),build(k<<1|1,mid+1,r);
pushup(k);
}
void update(int k,int opt,int val){
int l=tr[k].l,r=tr[k].r;
if(l==r){
tr[k].val=val;
tr[k].min1=tr[k].val-tr[k].l;
tr[k].min2=tr[k].val+tr[k].l;
return ;
}
if(tr[k].laz) down(k);
int mid=(l+r)>>1;
if(opt<=mid) update(k<<1,opt,val);
else update(k<<1|1,opt,val);
pushup(k);
}
void change(int k,int opl,int opr,int val){
int l=tr[k].l,r=tr[k].r;
if(opl<=l&&r<=opr){
tr[k].val+=val;
tr[k].min1+=val;
tr[k].min2+=val;
tr[k].laz+=val;
return ;
}
if(tr[k].laz) down(k);
int mid=(l+r)>>1;
if(opl<=mid) change(k<<1,opl,opr,val);
if(opr>mid) change(k<<1|1,opl,opr,val);
pushup(k);
}
int query1(int k,int opl,int opr){
int l=tr[k].l,r=tr[k].r;
if(opl<=l&&r<=opr){
return tr[k].min1;
}
if(tr[k].laz) down(k);
int mid=(l+r)>>1,res=0x7fffffff;
if(opl<=mid) res=min(res,query1(k<<1,opl,opr));
if(opr>mid) res=min(res,query1(k<<1|1,opl,opr));
return res;
}
int query2(int k,int opl,int opr){
int l=tr[k].l,r=tr[k].r;
if(opl<=l&&r<=opr){
return tr[k].min2;
}
if(tr[k].laz) down(k);
int mid=(l+r)>>1,res=0x7fffffff;
if(opl<=mid) res=min(res,query2(k<<1,opl,opr));
if(opr>mid) res=min(res,query2(k<<1|1,opl,opr));
return res;
}
signed main(){
scanf("%lld%lld%lld%lld",&n,&q,&a,&b);
for(re int i=1;i<=q;++i) scanf("%lld",&pos[i]);
build(1,1,n);
for(int i=2;i<=q;++i){
int res=min(query1(1,1,pos[i])+pos[i],query2(1,pos[i],n)-pos[i]);
change(1,1,n,abs(pos[i]-pos[i-1]));
update(1,pos[i-1],res);
}
printf("%lld\n",tr[1].val);
return 0;
}
csp-s模拟43,44 A,C,F的更多相关文章
- csp-s模拟测试44「D·E·F」
		用心出题,用脚造数据 乱搞场 1 #include<bits/stdc++.h> 2 #define re register 3 #define int long long 4 #defi ... 
- Noip模拟43 2021.8.18
		T1 地一体 可以树形$dp$,但考场没写出来,只打了没正确性的贪心水了$30$ 然后讲题的时候B哥讲了如何正确的贪心,喜出望外的学习了一下 不难发现 每次士兵都会直接冲到叶子节点 从深的点再返回到另 ... 
- 8.18考试总结[NOIP模拟43]
		又挂了$80$ 好气哦,但要保持优雅.(草 T1 地衣体 小小的贪心:每次肯定从深度较小的点向深度较大的点转移更优. 模拟一下,把边按链接点的子树最大深度排序,发现实际上只有上一个遍历到的点是对当前考 ... 
- [考试反思]0916csp-s模拟测试44:可笑
		出现了有史以来第一个3首杀AK啊...然而跟我没有丝毫关系 (曾经还是有一次考试差点就有那么一点关系的...) 然而反正我考得很水就是了.不是很垃圾,而是很水. 这套题是真的水... T1不会证复杂度 ... 
- 2019.9.16 csp-s模拟测试44 反思总结
		虽然说好像没有什么写这个的价值OAO 来了来了来写总结了,不能怨任何东西,就是自己垃圾x 开题顺序又和主流背道而驰,先一头扎进了公认最迷的T2,瞎搞两个小时头铁出来,然后T1和T3爆炸.基础很差,全靠 ... 
- noip模拟43
		A. 第一题 儿子遍历顺序按深度由小到大即可 B. 第二题 二分最小值,以点权作为初始距离跑最长路即可 直接用大根堆跑 \(dij\) 会 \(T\),考虑初始权值可以处理,且边权一定,用类似蚯蚓的方 ... 
- NOIP模拟22「d·e·f」
		T1:d 枚举. 现在都不敢随便打枚举了. 实际上我们只关注最后留下的矩阵中最小的长与宽即可. 所以我们将所有矩阵按a的降序排列. 从第\(n-m\)个开始枚举. 因为你最多拿 ... 
- [考试总结]noip模拟43
		这个题目出的还是很偷懒.... 第一题...第二题...第三题...四.... 好吧... 这几次考得都有些问题,似乎可能是有些疲惫,脑袋也是转不太动,考完总觉得自己是能力的问题,但是改一分钟之后会发 ... 
- 模拟浏览器搜索功能(Ctrl + F)
		写的匆忙,示意一下,有待完善.把以下代码复制到文本文件中,把文件扩展名改为.html就可以运行了. <html> <head> <style type="tex ... 
随机推荐
- [JZOJ6341] 【NOIP2019模拟2019.9.4】C
			题目 题目大意 给你一颗带点权的树,后面有许多个询问\((u,v)\),问: \[\sum_{i=0}^{k-1}dist(u,d_i) \ or \ a_{d_i}\] \(d\)为\(u\)到\( ... 
- 【JZOJ6346】ZYB和售货机
			description analysis 其实这个连出来的东西叫基环内向树 先考虑很多森林的情况,也就是树根连回自己 明显树根物品是可以被取完的,那么买树根的价钱要是儿子中价钱最小的那个 或者把那个叫 ... 
- 2816: [ZJOI2012]网络
			传送们 把一个点拆成c个即可 浪费时间的水题... //Achen #include<algorithm> #include<iostream> #include<cst ... 
- JAVA 设计的七大原则
			一.开闭原则 开闭原则(Open-Closed Principle, OCP)是指一个软件实体如类.模块和函数应该对 扩展开放,对修改关闭. 所谓的开闭,也正是对扩展和修改两个行为的一个原则.强调 的 ... 
- Web中常见的绕过和技巧
			SQL注入 十六进制绕过引号 slect table_name from information_schema.table where table_schema="sqli"; s ... 
- 17.splash_case06_ScrapySplashTest-master
			taobao.py # -*- coding: utf-8 -*- from scrapy import Spider, Request from urllib.parse import quote ... 
- Python Flask高级编程之从0到1开发《鱼书》精品项目 ✍✍✍
			Python Flask高级编程之从0到1开发<鱼书>精品项目 一 .安装环境我们使用 flask web框架,并用 sqlalchemy来做数据库映射,并使用 migrate做数据迁移 ... 
- 阿里云服务器安装Python3.8
			1.操作系统: CentOS 7.4 64位 2.下载python安装包 wget https://www.python.org/ftp/python/3.8.0/Python-3.8.0.tar.x ... 
- 面试系列九 es 提高查询效率
			,es性能优化是没有什么银弹的,啥意思呢?就是不要期待着随手调一个参数,就可以万能的应对所有的性能慢的场景.也许有的场景是你换个参数,或者调整一下语法,就可以搞定,但是绝对不是所有场景都可以这样. 一 ... 
- 课程笔记-lisanke
			1.判断真需求假需求 真需求:所有人都需要的功能 假需求:只有自己需要的功能 2.找到目标用户 ①不要直接询问是否需要这个功能 ②旁敲侧击式提问:用户使用了什么方式?之前都是怎么做的? case:购物 ... 
