区间--差分约束

给定 n 个区间 [ai,bi]和 n 个整数 ci。
你需要构造一个整数集合 Z,使得∀i∈[1,n],Z 中满足ai≤x≤bi的整数 x 不少于 ci 个。
求这样的整数集合 Z 最少包含多少个数。
输入格式
第一行包含整数 n。
接下来n行,每行包含三个整数ai,bi,ci。
输出格式
输出一个整数表示结果。
数据范围
1≤n≤50000,
0≤ai,bi≤50000,
1≤ci≤bi−ai+1
输入样例:
5
3 7 3
8 10 3
6 8 1
1 3 1
10 11 1
输出样例:
6
思路
差分约束
分析得,最长路,求最小解,转化成大于等于
dist[i] 到i点包含的整数个数
每个数只能用一次
1.dist(i)-dist(i-1)>=0 到i包含的个数必大于i-1包含的整数个数;
2.dist(i)-dist(i-1)<=1 到i包含的个数最多比i-1包含的整数个数大一 dist(i-1)-dist(i)>=-1;
3.题目要求满足a≤x≤b的整数 x 不少于 c个 dist(b)-dist(a-1)>=ci
a-1因为a≤x 包含a
4.因为a,b可以取到0 ,我们让他们都加1 dist可以更容易的表示 严格一点 数据范围要加1 到50001

#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
int n;
int h[N],e[N],ne[N],w[N],idx;
void add(int a,int b,int c){
	e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
int dist[N],st[N];//dist[]从1到i包含的数的个数 
void spfa(){
	memset(dist,-0x3f,sizeof dist);
	queue<int> q;q.push(0);dist[0]=0;
	while(q.size()){
		int t=q.front();q.pop();st[t]=0;
		for(int i=h[t];i!=-1;i=ne[i]){
			int j=e[i];
			if(dist[j]<dist[t]+w[i]){
				dist[j]=dist[t]+w[i];
				if(st[j]!=1) q.push(j),st[j]=1;
			}
		}
	}
}
int main(){
	cin>>n;
	memset(h,-1,sizeof h);
	for(int i=1;i<=50001;i++){
		add(i-1,i,0);add(i,i-1,-1);
	}
	for(int i=1;i<=n;i++){
		int a,b,c;cin>>a>>b>>c;a++,b++;
		add(a-1,b,c);
	}
	spfa();
	cout<<dist[50001];
	return 0;
} 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Crank-Nicolson差分格式是一种常用的数值方法,用于求解偏微分方程的数值解。实际应用中,很多偏微分方程都难以求出解析解,因此需要通过数值计算的方式来求得近似解。 Crank-Nicolson差分格式的原理是将时间轴上的偏微分方程离散化,然后通过差分运算得到一个方程组,进而求解该方程组得到数值解。在离散化过程中,将时间和空间都离散化为若干个区间,其间隔大小分别为Δt和Δx,以此来逼近连续的偏微分方程。对于每个时间步长,我们分别在时间和空间方向上进行更新,进而得到一个更新后的解。 具体来说,Crank-Nicolson差分格式采用的是一个二阶中心差分格式,该格式是一个隐式的数值差分方式,对数值解的数值稳定性和收敛性都有极好的保证。其基本思想是将一个解的时间和空间方向上的差分分别计算出来,然后取两者的平均值作为解的近似值。通过这种方式,能够减少误差,提高计算精度。 总之,Crank-Nicolson差分格式是一种基于二阶中心差分的隐式数值方法,它能够很好地解决偏微分方程计算的误差和收敛性问题,因此在实际应用中受到广泛的欢迎。 ### 回答2: Crank-Nicolson差分格式是一种二阶精度的有限差分格式,被广泛应用于偏微分方程的数值求解,尤其适用于热传导方程、扩散方程等具有稳定解的情况。 其基本思想是将时间步长分为两个部分,用前一半的时间步长采用向前差分(displacement)的方法,用后一半时间步长采用向后差分(Bacward)的方式,即将每个方程都变为两个方程的平均值,这样可以将误差降到二次项。由于这个方法同时使用向前差分和向后差分,所以它同时考虑了未知量的前后信息,从而更加准确。 在时间上离散之后,可以得到离散的差分方程组,然后通过求解线性方程组得到数值解。由于Crank-Nicolson差分格式所计算的每一步都是一个算术平均值,因此结果更加平滑,具有良好的稳定性和收敛性。 Crank-Nicolson差分格式的特点在于其数值解更加准确,因为它同时考虑了未知量的前后信息。其缺点是相对于其它差分格式耗时较大,因为必须计算两个半步长的方程。此外,该方法存在计算的矩阵会是个隐式矩阵,所以需要通过专门的技巧求解线性方程组。 总之,Crank-Nicolson差分格式是一种准确稳定的有限差分格式,适用于求解偏微分方程,特别是求解热传导方程、扩散方程等具有稳定解的情况。 ### 回答3: Crank-Nicolson差分格式是一种常见的数值求解偏微分方程的方法,特别是在热传导等问题中。其原理是使用离散化的空间间隔和时间步长,将偏微分方程转化为线性代数方程组的形式,从而可以通过迭代方法求解数值解。 首先,我们将偏微分方程中的空间变量离散化成网格点,时间变量则离散化成时间步长。这样我们就得到了一个网格,其中每个网格点的值都代表了这个时刻的偏微分方程解。我们通过离散化之后,可以得到一个类似于有限差分的方程组。我们将网格点的值表示为$u_{i,j}$,其中$i$表示空间网格点的编号,$j$表示时间步长的编号。因此,我们将偏微分方程的解离散化为了一个二维矩阵。 接下来,我们将偏微分方程中的时间偏导数用向前差分和向后差分的形式离散化,同时用中心差分的形式离散化空间偏导数。由于Crank-Nicolson方法同时采用了前向差分和后向差分,在时间上具有更高的精度。因为它的中心时间步长和二阶时间导数的中心值相等,从而得到的离散方程形式为: $\frac {1}{2 k}(u_{i,j+1}-u_{i,j-1})=\frac{1}{2h^2}(u_{i+1,j}-2u_{i,j}+u_{i-1,j})+f_{i,j}$ 其中$k$表示时间步长,$h$表示空间步长,$f_{i,j}$是源项。 将上式简化可得: $-r u_{i-1,j}+(2+2r)u_{i,j}-r u_{i+1,j} =s_{i,j-1}+s_{i,j}$ 其中: $r=\frac{k}{2 h^{2}}$ $s_{i,j-1}=\frac{u_{i+1,j-1}-2 u_{i,j-1}+u_{i-1,j-1}}{h^{2}}$ $s_{i,j}=f_{i,j}+\frac{u_{i+1,j-1}-2 u_{i,j-1}+u_{i-1,j-1}}{h^{2}}$ 我们使用上述离散方程组来解决偏微分方程的数值解。初始条件可以通过直接给定或者通过求解另一个初始条件的常微分方程得到。对于边界条件,可以使用指定的边界条件,或者通过用空间点表示数值解的导数来自然地得到。此外,由于离散化的时间步长和空间步长的选择对数值结果有很大影响,因此确定合适的时间和空间步长是使用Crank-Nicolson方法的一个重要考虑因素。 总之,Crank-Nicolson差分格式是一种非常有效的数值求解方法,特别是在处理非线性、高阶或多维偏微分方程时。通过将偏微分方程转化为线性方程组的形式,我们可以应用广泛的数值方法来求解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值