首页 > 其他分享 >P9744 「KDOI-06-S」消除序列

P9744 「KDOI-06-S」消除序列

时间:2023-10-16 20:45:00浏览次数:32  
标签:P9744 ll 06 min int sum KDOI displaystyle sumb

题目传送门

这道题在比赛时先花了一个小时理解好题意才打了一个 \(70\) 分的 \(O(n^2)\) 暴力。下午刚起床,有点困,还没进入状态,打得挺慢。

具体地,会发现操作实际上是在这个长度为 \(n\) 的序列找一个点 \(i\),将 \([0,i]\) 通过操作 \(1\) 全变 \(0\),设 \(x=\displaystyle\sum_{k\in P}(k≤i)×c_k\),\(y=\displaystyle\sum_{k=i+1}^{n}b_i-\displaystyle\sum_{k\in P}(k>i)×b_k\),说人话就是 \(x\) 表示把前面已经统一为 \(0\) 的区间再把一些值变回 \(1\) 使得区间 \([0,i]\) 满足限制的代价,\(y\) 表示后面没有统一变为 \(0\) 的区间把一些值变为 \(0\) 使得区间 \([i+1,n+1]\) 满足限制的代价,那么该操作的总代价为 \(a_i+x+y\),考虑直接枚举 \(i\),边扫边维护,对于每个 \(i\),\(O(1)\)求出来然后答案取 \(min\),总复杂度 \(O(nq)\),可拿到 \(70\) 分。

#include<bits/stdc++.h>
#define ll long long
#define N 500001
using namespace std;
ll n,a[N],b[N],c[N],q,m,p[N],tr[N<<2],sumb,ans;
int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=n;i++)cin>>b[i],sumb+=b[i];
	for(int i=1;i<=n;i++)cin>>c[i];
	cin>>q;
	while(q--){ll sumc=0,sum=sumb;
		cin>>m,ans=1000000000000000;
		for(int i=1;i<=m;i++)cin>>p[i],sum-=b[p[i]];
		for(int i=0,j=1;i<=n;i++){
			if(j<=m&&i>=p[j])sumc+=c[p[j]],j++;
			else sum-=b[i];
			ans=min(ans,a[i]+sumc+sum);
		}
		cout<<ans<<'\n';
	}
} 

考虑优化,这道题我第一眼线段树,但一开始脑子抽了,打了暴力后才想到怎么维护,花了 \(30\) 分钟调出来。整道题花了我一个半小时,感觉打得有点慢。

考虑 \(v_i\) 和 \(v_{i+1}\) 之间,发现 \([v_i,v_{i+1})\) 区间中任意取的 \(a\) ,加的 \(x\) 是相等的。

那么我们可以对于每个 \([l,r]\),线段树维护 \(\displaystyle\min_{l≤i≤r}a_i\) 。

但我们发现虽然 \([v_i,v_{i+1})\) 之间加的 \(x\) 是相同的,但是 \(y\) 不相同,这样维护的线段树不能确保能找到总代价最小的值。

我们能不能用线段树维护 \(\displaystyle\min_{l≤i≤r}a_i+y\) 呢?我们发现只需要开一个关于 \(b\) 的后缀树组 \(sumb\),因为我们只需要维护区间 \([v_i,v_{i+1})\) 中 \(y\) 的相对大小。所以可以线段树维护 \(\displaystyle\min_{l≤i≤r}a_i+sumb_i\)。区间查询 \([v_i,v_{i+1})\) 后只需再减去 \(sumb\) 多加上的 b,时间复杂度\(O(logn\sum m)\)。

#include<bits/stdc++.h>
#define ll long long
#define N 500001
using namespace std;
ll n,a[N],b[N],c[N],q,m,p[N],tr[N<<2],sumb[N],ans;
void build(ll rt,ll l,ll r){if(l==r){tr[rt]=a[l]+sumb[l];return;}
	ll mid=(r+l)>>1;
	build(rt<<1,l,mid),build(rt<<1|1,mid+1,r);
	tr[rt]=min(tr[rt<<1],tr[rt<<1|1]); 
}
ll ask(ll rt,ll l,ll r,ll x,ll y){if(x<=l&&r<=y){return tr[rt];}
	ll mid=(r+l)>>1,minn=1000000000000000;
	if(mid>=x)minn=min(minn,ask(rt<<1,l,mid,x,y));
	if(mid<y)minn=min(minn,ask(rt<<1|1,mid+1,r,x,y));
	return minn;
}
int main(){//freopen("reserve.in","r",stdin),freopen("reserve.out","w",stdout); 
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=n;i++)cin>>b[i];
	for(int i=1;i<=n;i++)cin>>c[i];
	for(int i=n;i>=0;i--)sumb[i]=sumb[i+1]+b[i+1];
	cin>>q,build(1,0,n);
	while(q--){ll sumc=0,sum=0;
		cin>>m,ans=1000000000000000;
		for(int i=1;i<=m;i++)cin>>p[i],sum+=b[p[i]];
		p[m+1]=n+1;
		for(int i=0;i<=m;i++){ll x=p[i],y=p[i+1]-1,res=ask(1,0,n,x,y);
			res-=(sum-=b[p[i]]),sumc+=c[p[i]];
			ans=min(ans,res+sumc);
		}
		cout<<ans<<'\n';
	}
} 

最后贴一张我的提交记录:

标签:P9744,ll,06,min,int,sum,KDOI,displaystyle,sumb
From: https://www.cnblogs.com/Exotic-sum/p/17768297.html

相关文章

  • 【题解】「KDOI-06-S」补题
    「KDOI-06-S」A.「KDOI-06-S」消除序列赛时写了一个\(O(nq)\)的线性DP,喜提60分。注意到如果操作1被使用,则一定只会使用一次,而且在最优策略中一定是第一次使用操作1。则我们可以通过以下方式进行操作,使序列满足条件:首先执行\(a_i\)和\(\sum^{j\lei,i\inP}_{j=......
  • P9745 「KDOI-06-S」树上异或 题解
    P9745「KDOI-06-S」树上异或题解\(x_i=0\)这题一看就不是很可做,先考虑部分分。对于一条链的情况,我们可以枚举上一个断边的位置,然后转移。一看数据范围,估计和值域有关,所以考虑\(x_i=1\)的部分分,如果全部点权都是1,那么一种方案只有0和1两种取值,考虑这个状态设计:\(f......
  • Gym101064L The Knapsack problem
    CF传送门发现物品的体积很小,尝试从此处入手。设\(K\)为最大的物品体积。把背包体积\(m\)分成差不超过\(K\)的两部分,然后合并。这样需要求出\(f(\frac{m}{2}-K\sim\frac{m}{2}+K)\)。递归地,可以发现需要求出\(f(\frac{m}{2^k}-K\sim\frac{m}{2^k}+K)\)。最......
  • BitBake使用攻略--BitBake的语法知识二(转载自https://www.cnblogs.com/chegxy/archive
    目录写在前面1.BitBake中的任务2.任务配置2.1依赖2.1.1内部任务间的依赖2.1.2不同菜谱下的任务间依赖2.1.3运行时态下的依赖2.1.4递归依赖2.1.5任务间的依赖2.2事件2.3校验和3.ClassExtensionMechanism 写在前面这是《BitBake使用攻略》系......
  • 「KDOI-03」构造数组
    Saintex1分钟就切啦,有什么好说哒!首先可能想到设\(c_{i,j}\)表示(i,j)被操作的次数,那么答案很好求。但是这个数量并不好记录。如果仅仅钦定(i,j)从小到大之类的东西也不好搞。所以考虑钦定其他的东西。设\(dp_{i,j,k}\)表示前i位,有j个操作(x,y)满足\(x<y\leqi\)......
  • 统信操作系统UOS1060上通过Fail2Ban来Ban IP
    原文链接:统信UOS1060上通过Fail2Ban来BanIPhello,大家好啊,今天给大家带来一篇在统信UOS1060上安装Fail2Ban并且当ip被ban后通过邮件发送通知的文章。Fail2Ban 是一个用于防止暴力attack的开源软件。它可以扫描日志文件(例如,SSH或Web服务器日志文件)以查找IP地址,这些IP地址在定义的......
  • 06-跨时钟域
    什么是跨时钟域的概念呢?在一个电路中launch的时钟和capture时钟,如果不是同一个时钟呢?就是跨时钟域的电路若两个时钟是同步时钟呢,那这个就叫同步时钟域若两个时钟是异步呢时钟呢,那就是异步时钟域,也就是异步跨时钟域电路。看这张图。这是clocka的domain,这是clockb的doamin。......
  • 2023-2024-1 20211306 密码系统设计与实现课程学习笔记5
    20211306密码系统设计与实现课程学习笔记5任务详情自学教材第11章,提交学习笔记知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容“我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题......
  • 2023-2024-1 20231406 《计算机基础与程序设计》第3周学习总结
    2023-2024-120231406《计算机基础与程序设计》第3周学习总结作业信息这个作业属于哪个课程<班级的链接>(如[2023-2024-1-计算机基础与程序设计](https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP)这个作业要求在哪里<作业要求的链接>(如2023-2024-1计算机基础......
  • 2023_10_14_MYSQL_DAY_06_MYSQL优化的种类
    MYSQL优化的种类MYSQL的优化,是每一个程序员在做数据查询处理的时候,经常有的步骤那么SQL的优化有很多种,它可以是在硬件方面的,可以是在代码层面的,可以是在数据库方面的优化。下面就详细整理一下30种优化MYSQL的方案:1.在读表的时候,尽可能的避免全表扫描,合理的根据业务需求,在wher......