社区讨论

90pts求调

P1545[USACO04DEC] Dividing the Path G参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mhj44tb5
此快照首次捕获于
2025/11/03 20:25
4 个月前
此快照最后确认于
2025/11/03 20:25
4 个月前
查看原帖
rt,判无解的情况错了
CPP
#include<bits/stdc++.h>

using namespace std;

int n,L;
int a,b;

struct node{
	int l,r;
}e[100010];

bool cmp(node a,node b){
	if(a.l!=b.l) return a.l<b.l;
	return a.r<b.r;
}

int l[200010],r[200010];
int f[20000010];
int cnt,now;
bool vis[200010];

deque<int>d;

signed main(){
	memset(f,0x3f,sizeof(f));
	f[0]=0;
	scanf("%d%d%d%d",&n,&L,&a,&b);
	for(int i=1;i<=n;i++){
		scanf("%d%d",&e[i].l,&e[i].r);
	}
	sort(e+1,e+1+n,cmp);
	for(int i=1;i<=n;i++){
		if(vis[i]) continue;
		vis[i]=1;
		l[++cnt]=e[i].l;
		r[cnt]=e[i].r;
		now=i+1;
		while(e[now].l<r[cnt]&&now<=n){
			r[cnt]=max(r[cnt],e[now].r);
			vis[now]=1;
			now++;
			if(now>n) break;
		}
	}
	n=cnt;
	now=1;
	d.push_back(f[0]);
	for(int i=0;i<=L;i+=2){
		while(r[now]<i&&now<=n) now++;
		if(l[now]<i&&i<r[now]) continue;
		//dp[i]=query(i-2*b,i-2*a)+1;
		//if(d.empty()) continue;
		while(!d.empty()&&d.front()<i-2*b) d.pop_front();
		if(f[d.front()]>1e9||i-d.front()<2*a) continue;
		f[i]=f[d.front()]+1;
		//printf("qwq %d %d\n",i,f[i]);
		//while(!d.empty()&&f[d.front()]>f[i]) d.pop_back();
		d.push_back(i);
	}
	if(f[L]>100000000) puts("-1");
	else printf("%d\n",f[L]);
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...