专栏文章
题解:AT_arc200_c [ARC200C] Movie Theater
AT_arc200_c题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @min8musl
- 此快照首次捕获于
- 2025/12/01 22:21 3 个月前
- 此快照最后确认于
- 2025/12/01 22:21 3 个月前
考虑一对区间 对答案的贡献,显然:
- 若相离,贡献为 ;
- 若相交但不包含,贡献为 ;
- 若包含,贡献为 。
为了最小化答案,我们应该让包含关系的内部区间的 小。于是从内部区间向外部区间连边,最优方案就是 DAG 的拓扑序。由于要最小化 的字典序,用菜肴制作的套路跑反图最大字典序解决。
CPP
/*
2025.11.13
* Happy Zenith Noises *
*/
#include<bits/stdc++.h>
#define int long long
#define fi first
#define se second
#define pb push_back
#define RG register
using namespace std;
typedef pair<int,int>P;
typedef pair<int,P>PP;
const int MAXN=1005;
int n,l[MAXN],r[MAXN],in[MAXN],ans[MAXN],tot;
vector<int>g[MAXN];
void solve(){
cin>>n;tot=n;
for(int i=1;i<=n;i++)cin>>l[i]>>r[i],in[i]=0,g[i].clear();
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(l[j]>l[i]&&r[j]<r[i])g[i].pb(j),in[j]++;
}
}
priority_queue<int>q;
for(int i=1;i<=n;i++)if(!in[i])q.push(i);
while(!q.empty()){
int x=q.top();q.pop();ans[x]=tot--;
for(int i:g[x]){
in[i]--;
if(!in[i])q.push(i);
}
}
for(int i=1;i<=n;i++)cout<<ans[i]<<" ";cout<<"\n";
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
int T;cin>>T;
while(T--)solve();
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...