社区讨论
wa70求助
P1280尼克的任务参与者 2已保存回复 10
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 9 条
- 当前快照
- 1 份
- 快照标识符
- @lo4aomjn
- 此快照首次捕获于
- 2023/10/24 20:20 2 年前
- 此快照最后确认于
- 2023/11/02 11:32 2 年前
emmm我是正着推的dp柿子,全程也是个人自己想的,然后wa70pts,答案竟然比正解还要大,所以我估计可能在upper_bound那附近挂了,老师太水不想给我改,求助。
(盲猜青白大佬会帮忙)
CPP#include<bits/stdc++.h>
using namespace std;
#define int long long
/*
其实感觉更像模拟?
因为空闲时它必须要做事,我不能拒绝
除非存在两个起始时间相同的东西我才有选择
不能贪心选择短的,反例很容易给出
考虑什么时候能休息
如果我选择了一段,那就可以休息从这个任务结束到下一次第一个和他区间没有交集的左端点。
那么我对所有区间找到他的左侧第一个和他没有交集的区间,用dp的话可以从那里转移过来
每个点的右侧只能有最多一个区间是作为第一个,那么总共的转移次数不超过2*n,应该是可以过的
那么问题在于:怎么找?
学一下struct 的upper_bound就好了
找到了,wa70?why?
*/
struct node{
int le;
int ri;
int len;
int id;
bool operator <(const node &a)const{
return a.le>le;
}
}p[10004];
vector<int>from[100005];
int dp[100005];
signed main(){
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
ios::sync_with_stdio(false);
int n,k;
cin >> n >> k;
for(int i=1;i<=k;i++){
cin >> p[i].le >> p[i].len;
p[i].ri=p[i].le+p[i].len-1;
}
k++;
p[k].le=n+1;
p[k].ri=114514;
sort(p+1,p+1+k);
for(int i=1;i<=k-1;i++){
p[i].id=i;
int pos=upper_bound(p+1,p+1+k,(node){p[i].ri,0,0,0})-p;
int now=p[pos].le;
while(p[pos].le==now){
from[pos].push_back(i);
pos++;
}
}
int now=p[1].le;
int pos=1;
while(p[pos].le==now){
from[pos].push_back(0);
pos++;
}
int ans=0;
for(int i=1;i<=k;i++){
for(int j=0;j<from[i].size();j++){
int f=from[i][j];
dp[i]=max(dp[i],dp[f]+p[i].le-p[f].ri-1);
}
ans=max(ans,dp[i]);
}
cout<<ans;
}
回复
共 10 条回复,欢迎继续交流。
正在加载回复...