先给你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. DHCP服务+PXE自动安装系统

    DHCP服务+PXE自动安装系统 DHCP安装 安装DHCP服务器 yum install dhcp -y 安装完dhcp默认无法启动,需要编辑配置文件设置分配地址范围等相关信息,服务器自身IP地址要 ...

  2. SQL -------- JDBC 查询所有记录

    package demo; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; ...

  3. sass与less对比学习

    参考链接:https://blog.csdn.net/luluan_lin/article/details/83749176

  4. Web工作方式

    我们平时浏览网页的时候,会打开浏览器,输入网址后按下回车键,然后就会显示出你想要浏览的内容.在这个看似简单的用户行为背后,到底隐藏了些什么呢? 对于普通的上网过程,系统其实是这样做的:浏览器本身是一个 ...

  5. SpringCloud学习(三)服务消费者(Feign)(Finchley版本)

    上一篇文章,讲述了如何通过RestTemplate+Ribbon去消费服务,这篇文章主要讲述如何通过Feign去消费服务. Feign简介 Feign是一个声明式的伪Http客户端,它使得写Http客 ...

  6. nRF5 SDK Bootloader and DFU moudles(2)

    镜像的验证 在执行设备固件更新之前,应验证新映像. 在传输实际固件(预验证)之前,可以检查某些信息(例如,兼容性). 其他信息,例如图像的散列,应在传输(验证后)后进行验证. Init packet ...

  7. [转帖]k8s.gcr.io/pause的作用

    k8s.gcr.io/pause的作用 https://blog.51cto.com/liuzhengwei521/2422120 weilovepan520关注0人评论196人阅读2019-07-2 ...

  8. [git] git error: unable to unlink old

    今天git pull ,结果报错 :   git error: unable to unlink old 原因是   文件夹内 一个exe 处于打开状态. 哈哈哈哈,又是个低级错误~~~ 下次注意呀~

  9. Contains Duplicate III -leetcode

    Contains Duplicate III Given an array of integers, find out whether there are two distinct indices i ...

  10. Java EE javax.servlet.http中的HttpRequest抽象类

    HttpRequest抽象类 public abstract class HttpServlet extends GenericServlet 实现的接口有:Serializable, Servlet ...