题解:AT_arc200_c [ARC200C] Movie Theater

· · 题解

考虑一对区间 (i,j) 对答案的贡献,显然:

为了最小化答案,我们应该让包含关系的内部区间的 P_i 小。于是从内部区间向外部区间连边,最优方案就是 DAG 的拓扑序。由于要最小化 P 的字典序,用菜肴制作的套路跑反图最大字典序解决。


/*

        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;
}