「DPOI-1」道路规划 题解
「DPOI-1」官方题解
题意
给你一个无向完全图,问你能不能把每条边定向,使得这张图变成一个有向无环图,而且第
思路
诈骗题。
由于
给定
上面的题目就可以贪心求解。我们可以枚举
设当前搜到了
贪心策略的正确性怎么证明呢?现在我们假定在讨论
代码
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define inf (int)2e9
#define ldb long double
#define db double
#define ft float
#define pb push_back
#define ins insert
#define myset(a,b,c,d) for(int i=b;i<=c;i++)a[i]=d;
using namespace std;
priority_queue<int,vector<int>,greater<int> > q;//小根堆
struct node
{
int l,r;
}a[100005];
vector<int> v[100005];//储存右端点
int main()
{
int t;
cin>>t;
while(t--)
{
q=priority_queue<int,vector<int>,greater<int> >();//清空
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
v[i].clear();
int x;
scanf("%d",&x);
a[i].r=n-x;//计算右端点
}
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
a[i].l=n-x;//计算左端点
v[a[i].l].pb(a[i].r);//记录右端点
}
int now=1,op=0;
for(int i=1;i<=n;i++)
{
for(int j=0;j<(int)v[i].size();j++)q.push(v[i][j]);//右端点插入堆中
if(q.empty())//堆为空
{
cout<<"NO\n";
op=1;
break;
}
int x=q.top();q.pop();
if(x<i)//右端点不合法
{
cout<<"NO\n";
op=1;
break;
}
}
if(!op)cout<<"YES\n";
}
return 0;
}