先给你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. docker清理

    # 删除退出的容器docker rm $(docker ps -qa --no-trunc --filter "status=exited") # 删除悬挂镜像docker rmi ...

  2. Exchange2010---反垃圾邮件配置

    Exchange2010---反垃圾邮件配置  Exchange2010---反垃圾邮件配置   本文以Exchange Server 2010作为反垃圾邮件配置实例为例.  其实,在微软发布的Exc ...

  3. PHP学习(4)——数组的使用

    1.数组的概念 数组就是一个用来存储一系列变量值的命名区域. 每个数组元素有一个相关的索引(也成为关键字),它可以用来访问元素. PHP允许间隔性地使用数字或字符串作为数组的索引. 2.数字索引数组 ...

  4. activeMQ(2)

    queue与topic的对比  JMS MESSAGE:消息头 消息体 消息属性 DeliveryMode: 消息体: 消息属性:识别  去重  重点标注 //创建会话session 事务.签收 如果 ...

  5. 记录sql中统计近五天数据的口径(While+IF)

    话不多说,直接上码↓ IF OBJECT_ID('tempdb..#Table') IS NOT NULL BEGIN DROP TABLE #Table; END; DECLARE @tbRange ...

  6. echarts图例的位置及大小,环图中间字

    https://blog.csdn.net/qq_34790644/article/details/89308738 Echarts饼状图属性设置大全 https://blog.csdn.net/sl ...

  7. shell中防止意外发生的两个实用的设置

    set -o nounset set -o errexit set -o nounset 在默认情况下,遇到不存在的变量,会忽略并继续执行,而这往往不符合预期,加入该选项,可以避免恶果扩大,终止脚本的 ...

  8. T100——单据别的新增、修改设置

    何为单据别,例如下图,新增的时候开窗选择单据别: 新增单据别: 1.首先在azzi600 系统分类码维护作业里面新增新的系统分类码(在系统分类码24下新增),如图: 2.在azzi910 作业基本数据 ...

  9. X86逆向8:向程序中插入新区段

    本节课我们不去破解程序,本节课学习给应用程序插入一些代码片段,这里我就插入一个弹窗喽,当然你也可以插入一段恶意代码,让使用的人中招, 这里有很多原理性的东西我就不多罗嗦了毕竟是新手入门教程,如果想去了 ...

  10. 怎样使用构造函数: Vue()?

    1. 新建一个 .html 文件 => 引入一个在线的 vue 库 => 写一个带 id 的 html 标签 => 写一个 script 标签, 这里的 vApp 是 Vue() 这 ...