先给你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. Kafka Connector无法启动的原因

    如图:启动Connector的时候一直提示报错. 后面找了一下网上发现原因, 基本原因就是Kafka的lib包和插件包都添加到ClassPath里面了 而这两地方都有Kafka-Client的jar包 ...

  2. 用elasticsearch分析中国大学省份分布

    1.去教育部官网下载excel数据:http://www.moe.gov.cn/srcsite/A03/moe_634/201706/W020170616379651135432.xls 2.把xls ...

  3. ES6中Set和Map

    1.Set 实例的创建 Set实例它类似于数组,但是成员的值都是唯一的,没有重复的值. Set本身是一个构造函数用来生成Set数据结构. Set 函数可以接受一个数组(或者具有 iterable 接口 ...

  4. OpenResty + Lua + Kafka 实现日志收集系统以及部署过程中遇到的坑

    ********************* 部署过程 ************************** 一:场景描述 对于线上大流量服务或者需要上报日志的nginx服务,每天会产生大量的日志,这些 ...

  5. sql次级语句

    select upper(n_id) from nrc_news;select left(n_content,1) from nrc_news;select len(n_content) from n ...

  6. Linux文件属性之用户和组基础知识介绍

    一.Linux多用户多任务介绍 Linux/Unix 是一个多用户.多任务的操作系统:在讲Linux账号及账号组管理之前,我们先简单了解多用户.多任务操作系统的基本概念. 1.1Linux单用户多任务 ...

  7. HDU 4417 【线段树+离线处理】

    http://acm.hdu.edu.cn/showproblem.php?pid=4417 题意:找出给定区间内,有多少个数小于等于给定的数.用线段树维护的话会超时,要用到线段树的离线操作,对询问与 ...

  8. Minimum Number of Arrows to Burst Balloons

    There are a number of spherical balloons spread in two-dimensional space. For each balloon, provided ...

  9. [转帖]postgresql 在等待服务器启动时超时

    postgresql 在等待服务器启动时超时 2018年12月24日 :: my_name_nb 阅读数 版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接 ...

  10. [转帖]传输层安全协议TLS 1.3 RFC 8446使互联网更快、更安全

    传输层安全协议TLS 1.3 RFC 8446使互联网更快.更安全 2018-08-12 11:38:19作者:LINUX人稿源:开源社区 https://ywnz.com/linuxyffq/261 ...