题解:P8896 「DPOI-1」道路规划
题意简述
给定长度为
Part 1
考虑这个 DAG 的拓扑序。由拓扑序的定义,每条边都必须由前面的节点指向后面的节点。又因为每两个点之间都有边,所以每个点的出度就等于拓扑序中在它之后的点数。
于是得到结论:对于每个
Part 2
现在问题变为:给定
直接跑二分图最大匹配显然会超时,所以考虑贪心。
在所有包含 NO 即可(因为每个区间都要得到配对)。否则,继续将这些区间中
于是得到做法:建立优先队列 NO。否则,将其出队,继续循环。
“找
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
struct node {
int l,r;
inline bool operator < (node n) {return l<n.l;}
}a[100001];
priority_queue<int,vector<int>,greater<int> > q;
int main() {
int T,n,i,j;
cin>>T;
while(T--) {
cin>>n;
for(i=0;i<n;i++) cin>>a[i].l;
for(i=0;i<n;i++) cin>>a[i].r;
sort(a,a+n);
j=0;
for(i=0;i<n;i++) {
while(j<n && a[j].l<=i) q.push(a[j++].r);
if(q.empty() || q.top()<i) break;
q.pop();
}
while(!q.empty()) q.pop();
if(i==n) cout<<"YES\n";
else cout<<"NO\n";
}
return 0;
}
:::: AC 记录。