首页 > 其他分享 >[CF1941E] Rudolf and k Bridges 的题解

[CF1941E] Rudolf and k Bridges 的题解

时间:2024-07-14 13:55:50浏览次数:11  
标签:Bridges le 桥墩 int 题解 cdot 修建 return CF1941E

题目大意

在第 \((i,j)\) 个格子修建一个桥墩需要 \(a_{i,j}+1\) 的花费而且要求 \((i,0)\) 与 \((i,m)\) 必须修建桥墩并且桥墩之间的距离不得大于 \(d\)。现在需要求见 \(k\) 个连续的桥,求最小代价。

其中 \(1\le k\le n \le 100,3\le m\le 2\cdot 10,1\le d\le m\)。

思路

因为每一座桥修建的代价与其他桥是否修建无关,所以我们可以将每一座桥的修建代价求解出来,最终求出连续 \(k\) 座桥全部修建的最小值。

假设 \(f_i\) 表示在第 \(i\) 个位置修建桥墩而且 \(1\) 至 \(i-1\) 在修建则桥墩之后全部可以修桥的最小花费。

因为在第 \(i\) 个位置修建桥墩前,从 \(i-d-1\) 到 \(i-1\) 只要有一个修建桥墩就可以,所以状态转移方程如下:

\[f_i= \min_{j=i-d-1}^{i-1} f_j \]

这样写的时间复杂度为 \(O(T\cdot nmd)\) 无法通过此题,可以考虑使用单点修改区间最小值查询线段树进行维护,这样时间复杂度就变成了 \(O(T\cdot nm \log d)\)。

AC Code

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5,INF=0x3f3f3f3f3f3f3f3f;
int n,m,num,d,a[N],f[N],s[N<<2],ans[N];
void change(int k,int l,int r,int x,int v) {
	if(l==r&&l==x) {
        s[k]=v;
		return;
	}
	if(x<l||x>r) return;
	int mid=(l+r)/2;
	if(l<=x&&x<=mid) change(k*2,l,mid,x,v);
	if(mid+1<=x&&x<=r) change(k*2+1,mid+1,r,x,v);
	s[k]=min(s[k*2],s[k*2+1]);
}
int ask(int k,int l,int r,int x,int y) {
	if(y<l||x>r) return INF;
	if(x<=l&&r<=y) return s[k];
	int mid=(l+r)/2;
	return min(ask(k*2,l,mid,x,y),ask(k*2+1,mid+1,r,x,y));
}
void go(int number){
	for(int i=1;i<=m;i++) cin>>a[i];
	f[1]=1;
	change(1,1,m,1,1);
	for(int i=2;i<=m;i++){
		f[i]=ask(1,1,m,max(i-d-1,1ll),max(i-1,1ll))+a[i]+1;
		change(1,1,m,i,f[i]);
	}
	ans[number]=f[m];
}
void solve(){
	cin>>n>>m>>num>>d;
	for(int i=1;i<=n;i++) go(i);
	for(int i=1;i<=n;i++) ans[i]+=ans[i-1];
	int sum=INF;
	for(int i=1;i+num-1<=n;i++) sum=min(sum,ans[i+num-1]-ans[i-1]);
	cout<<sum<<'\n';
}signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T;cin>>T;
	while(T--) solve();
	return 0;
}

标签:Bridges,le,桥墩,int,题解,cdot,修建,return,CF1941E
From: https://www.cnblogs.com/liudagou/p/18301452

相关文章

  • [ABC206E] Divide Both 的题解
    题目大意求出从\(l\)至\(r\)中满足以下条件的\((x,y)\)的个数。\(\gcd(x,y)\ne1\)且\(\gcd(x,y)\nex\)且\(\gcd(x,y)\ney\)。其中\(1\lel\ler\le10^6\)。思路正难则反,所以可以求出所有互质或者是相互倍数的\((x,y)\)的对数,在将其减去所有的方案数就是......
  • [CF1178D] Prime Graph 的题解
    题目大意构造一个简单无向图,是所有的有度的点的度都是质数而且总共的边的数量的个数是质数。思路因为需要让所有的入度都为质数,所以我们可以找到两个相邻的质数\(2,3\),因为这样即使增加了一条边那么这个节点的度也是质数。先将这个图构成一个巨大的环,接着如果所有的边数并不......
  • [CF1538F] Interesting Function 的题解
    题目大意给定两个正整数\(l,r\),将\(l\)不断加\(1\)直到\(l=r\),求出这一过程中\(l\)发生变化的位数总数。\(1\lel<r\le10^9\)。思路假设从\(l\)处理到\(r\)变化的次数为\(f(l,r)\)。因为直接求解出\(f(l,r)\)十分困难,所以可以通过求出\(f(0,l)\)......
  • 题解:CodeForces 1511 C Yet Another Card Deck[暴力/模拟]
    CodeForces1511CC.YetAnotherCardDeckDescriptionYouhaveacarddeckof\(n\)cards,numberedfromtoptobottom,i. e.thetopcardhasindex\(1\)andbottomcard —index\(n\).Eachcardhasitscolor:the\(i\)-thcardhascolor\(a_i\......
  • 「ABC217F」Make Pair 的题解
    题目大意一共\(2N\)个学生站成一排,其中有\(M\)对朋友关系。老师每次从队列中挑出两个相邻的学生作为同桌。为了关系和睦,每次选出的两个学生必须是朋友关系。选出的两个学生离开队列,空出来的位置左右合拢。请问老师有多少种方式选完所有学生?对于两种选人的方案,即使同桌关系相......
  • [COCI2015-2016#6] PAROVI 的题解
    题意选择一些\(n\)一下互质的二元组\(\{a,b\}\),求对于任意\(x\in\big[2,n\big]\)都不满足\(a,b<x\)和\(a,b\gex\)的个数。简化题意因为无解的情况只发生在所有的\(\{a,b\}\)之间没有多余的位置用于放置\(x\),所以题意可以抽象成这样:选择一些区间互质的区间\([a......
  • [COCI2006-2007#4] ZBRKA 的题解
    题目大意在一个长度为\(n\)的排列中找出逆序对数量恰好为\(c\)的排列总数,其中\(1\len\le10^3,1\lec\le10^4\)。思路考虑将\(1\)到\(n\)这些数从小到大一次填进去,因为每一次填入的数多是最大的,所以逆序对增加的数量只与其所在的位置相关,所以设计\(f_{i,j}\)表......
  • Snow Walking Robot 的题解
    题目大意给你一个机器人和机器人的\(n\)个运动,要求你在给出的运动路径的基础上设计一种不会走重复的路径的方法,注意只能减少原来的步数而不能增加,其中\(1\len\le10^5\)。思路因为这道题目可以自由的配置路径并且要求机器人在最后回到原来的位置,那么就应该要到一种适合所有......
  • [EGOI2021] Luna likes Love 的题解
    题目大意有\(2\timesn\)个人站成一排,然后给每个人分配一个\(1\)至\(n\)之间的数字,每种数字出现\(2\)次。现在,你可以进行两种操作:删除操作,将数字相同且相邻的两人删除,删除后两端剩下的队列合并。交换操作,交换相邻两个人的位置。每次,问至少操作多少次能够删除所有人......
  • Unusual Minesweeper 题解
    题目大意给你\(n\)个炸弹,第\(i\)个炸弹在\((x_i,y_i)\)的位置,可以将这一行与这一列的距离小于\(k\)的其他所有炸弹引爆,而且连锁的引爆不需要时间。每一秒你可以引爆一个炸弹,其中第\(0\)秒也可以引爆,并且第\(i\)个炸弹在第\(timer_i\)的时候会自己爆炸。要求输出引......