社区讨论
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 条回复,欢迎继续交流。
正在加载回复...