先给你1~N的N个数 再给你每种最多50个的条件(ai,bi,ci) 或者[ai,bi,ci]

(ai,bi,ci)表示下标ai到bi的最小值必为ci [ai,bi,ci]表示下标ai到bi的最大值必为ci

问你能不能有一种1~N的排列满足要求且字典序最小

首先这是一个左边n个 右边n个的二分图 左边表示位置 右边表示值

每个位置只能对应一个值 且要完美匹配才有解

那么如何建边?

我们用l[i] r[i]两个数组表示值i必定出现的最右左界和最左右界

用minn[i] maxn[i]两个数组表示下标i这个位置所有条件里面的最大最小值和最小最大值

这样可以使得连的边数最少.

然后check匹配数是否为N

在完美匹配有解的前提下完成最小字典序

从1~N暴力依次尝试匹配比linkx小的值

#include<bits/stdc++.h>
using namespace std;
const int MAXN = ;
const int N = ;
int l[MAXN], r[MAXN];
int minn[MAXN], maxn[MAXN];
int n;
int useif[N]; //记录y中节点是否使用 0表示没有访问过,1为访问过
int linky[N]; //记录当前与y节点相连的x的节点
int linkx[N];
int mat[N][N]; //记录连接x和y的边,如果i和j之间有边则为1,否则为0
int gn, gm; //二分图中x和y中点的数目
int can(int t)
{
int i;
for (i = ; i <= gm; i++) {
if (useif[i] == && mat[t][i]) {
useif[i] = ;
if (linky[i] == - || can(linky[i])) {
linky[i] = t;
linkx[t] = i;
return ;
}
}
}
return ;
}
int MaxMatch()
{
int i, num;
num = ;
memset(linky, -, sizeof(linky));
memset(linkx, -, sizeof(linkx));
for (i = ; i <= gn; i++) {
memset(useif, , sizeof(useif));
if (can(i)) {
num++;
}
}
return num;
}
void init()
{
memset(mat, , sizeof(mat));
for (int i = ; i <= n; i++) {
minn[i] = l[i] = , maxn[i] = r[i] = n;
}
}
int main()
{
int m1, m2;
while (scanf("%d %d %d", &n, &m1, &m2) != -) {
init();
int u, v, c;
gn = gm = n;
for (int i = ; i <= m1; i++) {
scanf("%d %d %d", &u, &v, &c);
for (int j = u; j <= v; j++) {
minn[j] = max(minn[j], c);
}
l[c] = max(l[c], u);
r[c] = min(r[c], v);
}
for (int i = ; i <= m2; i++) {
scanf("%d %d %d", &u, &v, &c);
for (int j = u; j <= v; j++) {
maxn[j] = min(maxn[j], c);
}
l[c] = max(l[c], u);
r[c] = min(r[c], v);
}
for (int i = ; i <= n; i++) {
for (int j = minn[i]; j <= maxn[i]; j++) {
if (l[j] <= i && i <= r[j]) {
mat[i][j] = ;
}
}
}
int ans = MaxMatch();
if (ans != n) {
printf("-1\n");
} else {
for (int i = ; i <= n; i++) {
int now = linkx[i];
mat[i][now] = ;
linky[now] = -;
bool flag = ;
memset(useif, , sizeof(useif));
for (int j = ; j < now; j++) {
if (useif[j] == && mat[i][j]) {
useif[j] = ;
if (linky[j] == - || can(linky[j])) {
linky[j] = i;
linkx[i] = j;
flag = ;
break;
}
}
}
if (!flag) {
mat[i][now] = ;
linky[now] = i;
linkx[i] = now;
}
now = linkx[i];
for (int j = ; j <= n; j++) {
mat[j][now] = ;
}
}
for (int i = ; i <= n; i++) {
printf("%d", linkx[i]);
if (i != n) {
printf(" ");
} else {
printf("\n");
}
}
}
}
}

第十五届四川省省赛 SCU - 4443 Range Query的更多相关文章

  1. 第十五届四川省省赛 SCU - 4439 Vertex Cover

    给你一个一般图 保证每条边的一端下标不大于30 问最小覆盖集的大小为多少 爆搜:枚举前30个点是否在覆盖集内 剪枝1:如果不在的话 那么他所连的下标大于30的点都必须选 剪纸2:最优解剪枝 #incl ...

  2. 第十五届四川省省赛 SCU - 4444 Travel

    给你一个一共由两种边的完全图 要求你求1到N的最短路 q队列为前沿队列(已探索过且最外围的点)  p队列为未探索队列(未探索过的点) depth这个数组的用法并不是代表实际上这个点在第几层 而是防止死 ...

  3. SCU 4443 Range Query

    二分图最大匹配,枚举. 可以计算出每一个位置可以放哪些数字,每个数字可以放在哪些位置,这样就可以建二分图了. 如果二分图最大匹配不到$n$,则无解.否则构造字典序最小的解,可以枚举每一位放什么数字,然 ...

  4. Minieye杯第十五届华中科技大学程序设计邀请赛现场同步赛 I Matrix Again

    Minieye杯第十五届华中科技大学程序设计邀请赛现场同步赛 I Matrix Again https://ac.nowcoder.com/acm/contest/700/I 时间限制:C/C++ 1 ...

  5. 北京师范大学第十五届ACM决赛-重现赛 B Borrow Classroom (树 ——LCA )

    链接:https://ac.nowcoder.com/acm/contest/3/B 来源:牛客网 Borrow Classroom 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 2 ...

  6. Minieye杯第十五届华中科技大学程序设计邀请赛网络赛D Grid(简单构造)

    链接:https://ac.nowcoder.com/acm/contest/560/D来源:牛客网 题目描述 Give you a rectangular gird which is h cells ...

  7. H-Modify Minieye杯第十五届华中科技大学程序设计邀请赛现场赛

    题面见 https://ac.nowcoder.com/acm/contest/700#question 题目大意是有n个单词,有k条替换规则(单向替换),每个单词会有一个元音度(单词里元音的个数)和 ...

  8. Minieye杯第十五届华中科技大学程序设计邀请赛网络赛 部分题目

    链接:https://pan.baidu.com/s/12gSzPHEgSNbT5Dl2QqDNpA 提取码:fw39 复制这段内容后打开百度网盘手机App,操作更方便哦 D    Grid #inc ...

  9. 福州大学第十五届程序设计竞赛_重现赛B题迷宫寻宝

    Problem B 迷宫寻宝 Accept: 52    Submit: 183Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem De ...

随机推荐

  1. python3 速查参考- python基础 6 -> 函数编程之参数、变量、作用域、递归、匿名函数 lambda

    函数基础 1. 速查笔记 #-- 函数相关的语句和表达式 myfunc('spam') # 函数调用 def myfunc(): # 函数定义 return None # 函数返回值 global a ...

  2. Go语言中切片的内部实现和基础功能

    切片是一种数据结构,这种数据结构便于使用和管理数据集合.切片是围绕动态数组的概念构建的,可以按需自动增长和缩小.切片的动态增长是通过内置函数append来实现的.这个函数可以快速且高效的增长切片.还可 ...

  3. freeRTOS学习二

    临界段,用一句话概括就是一段在执行时不能被中断的代码段. 临界段被打断的情况,一个是系统调度,还有一个就是外部中断. 对临界段的保护就是对中断的开和关. 空闲任务与阻塞延时 xTicksToDelay ...

  4. 使用Minikube运行一个本地单节点Kubernetes集群

    使用Minikube是运行Kubernetes集群最简单.最快捷的途径,Minikube是一个构建单节点集群的工具,对于测试Kubernetes和本地开发应用都非常有用. ⒈安装Minikube Mi ...

  5. springboot2.0结合freemarker生成静态化页面

    目录 1. pom.xml配置 2. application.yml配置 3. 使用模板文件静态化 3.1 创建测试类,编写测试方法 3.2 使用模板字符串静态化 使用freemarker将页面生成h ...

  6. PHP以table形式导出数据表实现单元格内换行

    <br style='mso-data-placement:same-cell;'>

  7. 快速开启关闭mysql,批命令方便!

    很多python开发人员和我一样,都会在自己的电脑上配置一个python开发的环境,便于开发和学习使用,比如我现在电脑上使用的就是mysql数据库,而我的电脑配置又比较低,电脑运行起来会出现卡慢的情况 ...

  8. sort()方法的用法,参数以及排序原理

    sort() 方法用于对数组的元素进行排序,并返回数组.默认排序顺序是根据字符串Unicode码点.语法:arrayObject.sort(sortby):参数sortby可选.规定排序顺序.必须是函 ...

  9. springboot打包的jar项目,不需要安装jdk环境启动

    因为服务器上是JDK7,而springboot至少用JDK8才行,但是又因为是很老的项目,不是很清楚能不能换JDK8,有风险,因此选择以前项目用JDK7,而新的springboot用JDK8.步骤一: ...

  10. python安装OpenCV后import cv2报错解决办法

    现在python安装完成后,运行pip install opencv-python安装成功后,import cv2时会失败 看到有人给出下载https://www.lfd.uci.edu/~gohlk ...