首页 > 其他分享 >CCPC 2022桂林 J.Permutation Puzzle

CCPC 2022桂林 J.Permutation Puzzle

时间:2022-11-05 15:45:11浏览次数:98  
标签:node set int Puzzle namespace CCPC 下界 2022 线段

模拟赛的时候这道题细节写挂了,硬是调不出来。。。

首先想到拓补排序。然后可以发现,正反各跑一次可以获得每个点的取值范围,即上界和下界。(特殊地,对于已知点,其上下界相等且等于自己)

然后,将这些上下界看成一条条线段,问题转化:\(n\) 个线段区间,每次取 \([1,n]\) 中一个值,且包含在线段内。

经典问题。按照 \(r\) 排序,将排列存在 \(set\) 中, 最后对左端点 \(lowerbound\) 一下即可。

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define N 1000010

int n; 
int a[N]; 
set <int> s; 

struct node{
	int u, v, next;
} ;

namespace zheng{

node t[N << 1]; 

int head[N]; 

int bian = 0;
inline void addedge(int u, int v){
	t[++bian] = (node){u, v, head[u]}, head[u] = bian;
	return ; 
}

int in[N]; 

}

namespace fan{
	node t[N << 1]; 
	int head[N]; 

int bian = 0;
inline void addedge(int u, int v){
	t[++bian] = (node){u, v, head[u]}, head[u] = bian;
	return ; 
}

int in[N]; 
	
}

int lim[N], lmax[N];

struct point{
int l, r, id; 

bool operator < (const point& a) const{
	return r < a.r || (r == a.r && l < a.l);
}

} h[N] ; 

bool isfixed(int i){
	return a[i] >= 1 && a[i] <= n; 
}

void topo_fan(){
	queue <int> q; 
	for(int i = 1; i <= n; i++){
		if(isfixed(i)) lim[i] = a[i]; 
		else lim[i] = 1; 
	}
	
	for(int i = 1; i <= n; i++){
		if(!fan::in[i]) q.push(i); 
	}
	
	while(!q.empty()){
		int u = q.front(); q.pop(); 
		for(int i = fan::head[u]; i; i = fan::t[i].next){
			int v = fan::t[i].v; 
			lim[v] = max(lim[v], lim[u] + 1); 
			fan::in[v]--; 
			if(!fan::in[v]){
				q.push(v); 
			}
		}
	}
	return ; 
}


int ans[N]; 

void topo_zheng(){
	queue <int> q; 
	for(int i = 1; i <= n; i++){
		lmax[i] = n; 
		if(isfixed(i)) lmax[i] = a[i]; 
	}

  for(int i = 1; i <= n; i++)
    if(!zheng::in[i]) q.push(i); 

	while(!q.empty()){
		int u = q.front(); 
		q.pop();
		for(int i = zheng::head[u]; i; i = zheng::t[i].next){
			int v = zheng::t[i].v; 
			lmax[v] = min(lmax[v], lmax[u] - 1); 
			zheng::in[v]--; 
			if(zheng::in[v] == 0) q.push(v); 
		}
	}
	
	return ; 
}

int m; 

void clean(){
	for(int i = 0; i <= n; i++) zheng::head[i] = fan::head[i] = 0; 
	zheng::bian = fan::bian = 0;
	for(int i = 0; i <= n; i++)
		zheng::in[i] = fan::in[i] = 0; 
  for(int i = 0; i <= n; i++)
    h[i].l = h[i].r = 0; 
	s.clear(); 
	return ; 
}

int main(){
	// freopen("hh.txt", "r", stdin); 
	int T; cin >> T;
	while(T--){
		clean(); 
		cin >> n >> m;
		for(int i = 1; i <= n; i++)
			scanf("%d", &a[i]); 

		for(int i = 1; i <= n; i++){
			s.insert(i); 
			ans[i] = 0; 
		}
		for(int i = 1; i <= m; i++){
			int x, y;
			scanf("%d %d", &x, &y); 
			zheng::addedge(y, x); 
			zheng::in[x]++; 
			fan::addedge(x, y); 
			fan::in[y]++; 
		}
		topo_fan();   // 
		topo_zheng(); 

    for(int i = 1; i <= n; i++){
		  h[i].l = lim[i]; 
		  h[i].r = lmax[i];
		  h[i].id = i;  
	  }

		sort(h + 1, h + n + 1); 
		bool flag = 1; 
		for(int i = 1; i <= n; i++){
			set<int>::iterator it = s.lower_bound(h[i].l); 
			if(*it > h[i].r || it == s.end()){
				flag = 0; 
				break; 
			} 
			ans[h[i].id] = *it; 
			s.erase(it); 
		}
		if(!flag){
			puts("-1"); 
			continue; 
		}
		for(int i = 1; i <= n; i++)
			printf("%d ", ans[i]); 
		cout << endl; 
		//
	}
	return 0; 
}

标签:node,set,int,Puzzle,namespace,CCPC,下界,2022,线段
From: https://www.cnblogs.com/wondering-world/p/16860319.html

相关文章

  • 【杂题汇总】NOIP 2022 杂题目录
    这里单纯的是一些题目,看到有意思的题会在这里记下来,也可以当做Todolist啦解析的话在这里[ARC147E]Examination[CF573E]BearandBowling[CF498D]TrafficJamsi......
  • P8814 [CSP-J 2022] 解密
    P8814[CSP-J2022]解密//ni=pi*qi//ei*di=pi*qi-pi-qi+2//ei*di=ni-pi-qi+2//pi+qi=ni-ei*di+2//pi*qi=ni//pi......
  • 2022,一个Java程序猿的外设配置
    工欲善其事,必先利其器。是的没错,我就是个器材党,哈哈。正赶上搬家布置了新桌面,经过我的精心挑选和安装,也是凑齐了我新一套的桌面外设。写下来记录一下。键盘套件:腹灵M......
  • 2022-2023-1 20221401 《计算机基础与程序设计》第十周学习总结
    2022-2023-120221401《计算机基础与程序设计》第十周学习总结作业信息这个作业属于哪个课程<班级的链接>2022-2023-1-计算机基础与程序设计这个作业要求在哪......
  • 【python】都2022年不会还有人不会在电脑桌面上养宠物吧~
    前言嗨喽~大家好呀,这里是魔王呐!上班枯燥,对着冷冰冰的电脑,相信很多小伙伴即使摸鱼,心情也不愉快。这时如果有个萌宠能大家进行实时互动,这该有多好呀。再无聊的工作也能......
  • 2022.11.05
    2022.11.05P5024这题在任务栏里摆了一周终于A了。。。只能说写的挺扭曲的,但还好过了。做法:用倍增数组处理状态,然后在询问时分类讨论两点是否在一条链上,最后用倍增数组......
  • 2022期中测试题目-校园社团活动管理系统
    题目要求:校园社团作为高校课外活动的重要组成部分,发展十分迅速,也受到越来越多学生的欢迎,社团规模、数量等都在日益增长,社团活动也更为多样和丰富。然而,大多数高校还没有一......
  • 2022-2023-1 20201324《信息安全系统设计与实现(上)》第12章
    1块设备I/O缓冲区文件系统使用一系列I/O缓冲区作为块设备的缓存内存。当进程试图读取(dev,blk)标识的磁盘块时,它首先在缓冲区缓存中搜索分配给磁盘块的缓冲区。如果该缓......
  • 2022分享一款好用的喜马拉雅音频下载工具,想听啥随便下!
    最近有小伙伴留言,想要找一个跟喜马拉雅听书的软件,很牛的的那种。目前,听书的软件有很多,小编熟知的主要有喜马拉雅、懒人听书、咪咕听书、氧气听书、蜻蜓FM等等。喜马拉雅作......
  • 喜报连连!英码科技边缘计算盒子入选广州市2022年度创新产品榜单
    近日,英码科技喜报接二连三,入选“专精特新企业”名单后,在广州市科技创新企业协会公示的广州市2022年创新产品目录拟入选名单中,英码科技的两款边缘计算盒子榜上有名!  ......