专栏文章

题解: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 个月前
查看原文
考虑一对区间 (i,j)(i,j) 对答案的贡献,显然:
  • 若相离,贡献为 00
  • 若相交但不包含,贡献为 11
  • 若包含,贡献为 2×[Pin>Pout]2 \times [P_{in}>P_{out}]
为了最小化答案,我们应该让包含关系的内部区间的 PiP_i 小。于是从内部区间向外部区间连边,最优方案就是 DAG 的拓扑序。由于要最小化 PP 的字典序,用菜肴制作的套路跑反图最大字典序解决。
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 条评论,欢迎与作者交流。

正在加载评论...