第十五届四川省省赛 SCU - 4443 Range Query
先给你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的更多相关文章
- 第十五届四川省省赛 SCU - 4439 Vertex Cover
给你一个一般图 保证每条边的一端下标不大于30 问最小覆盖集的大小为多少 爆搜:枚举前30个点是否在覆盖集内 剪枝1:如果不在的话 那么他所连的下标大于30的点都必须选 剪纸2:最优解剪枝 #incl ...
- 第十五届四川省省赛 SCU - 4444 Travel
给你一个一共由两种边的完全图 要求你求1到N的最短路 q队列为前沿队列(已探索过且最外围的点) p队列为未探索队列(未探索过的点) depth这个数组的用法并不是代表实际上这个点在第几层 而是防止死 ...
- SCU 4443 Range Query
二分图最大匹配,枚举. 可以计算出每一个位置可以放哪些数字,每个数字可以放在哪些位置,这样就可以建二分图了. 如果二分图最大匹配不到$n$,则无解.否则构造字典序最小的解,可以枚举每一位放什么数字,然 ...
- Minieye杯第十五届华中科技大学程序设计邀请赛现场同步赛 I Matrix Again
Minieye杯第十五届华中科技大学程序设计邀请赛现场同步赛 I Matrix Again https://ac.nowcoder.com/acm/contest/700/I 时间限制:C/C++ 1 ...
- 北京师范大学第十五届ACM决赛-重现赛 B Borrow Classroom (树 ——LCA )
链接:https://ac.nowcoder.com/acm/contest/3/B 来源:牛客网 Borrow Classroom 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 2 ...
- Minieye杯第十五届华中科技大学程序设计邀请赛网络赛D Grid(简单构造)
链接:https://ac.nowcoder.com/acm/contest/560/D来源:牛客网 题目描述 Give you a rectangular gird which is h cells ...
- H-Modify Minieye杯第十五届华中科技大学程序设计邀请赛现场赛
题面见 https://ac.nowcoder.com/acm/contest/700#question 题目大意是有n个单词,有k条替换规则(单向替换),每个单词会有一个元音度(单词里元音的个数)和 ...
- Minieye杯第十五届华中科技大学程序设计邀请赛网络赛 部分题目
链接:https://pan.baidu.com/s/12gSzPHEgSNbT5Dl2QqDNpA 提取码:fw39 复制这段内容后打开百度网盘手机App,操作更方便哦 D Grid #inc ...
- 福州大学第十五届程序设计竞赛_重现赛B题迷宫寻宝
Problem B 迷宫寻宝 Accept: 52 Submit: 183Time Limit: 1000 mSec Memory Limit : 32768 KB Problem De ...
随机推荐
- 【POJ - 1703】Find them, Catch them(种类并查集)
Find them, Catch them 直接翻译了 Descriptions 警方决定捣毁两大犯罪团伙:龙帮和蛇帮,显然一个帮派至少有一人.该城有N个罪犯,编号从1至N(N<=100000. ...
- 【POJ - 1950】Dessert(dfs)
-->Dessert Descriptions: 给你一个数N(3<=N<=15);每个数之间有三种运算符“‘+’,‘-’,‘.’”.输出和值等于零的所有的运算情况及次数num,如果 ...
- 【并行计算-CUDA开发】CUDA存储器模型
CUDA存储器模型 除了执行模型以外,CUDA也规定了存储器模型(如图2所示)和一系列用于主控CPU与GPU间通信的不同地址空间.图中红色的区域表示GPU片内的高速存储器,橙色区域表示DRAM中的的地 ...
- @Transactional事务总结
一:加了注解@Transactional就能起作用的原理总结: 1:首先是由类:JdkDynamicAopProxy,在invoke方法里面创建动态代理类,同时由拦截类进行拦截,代码如下所示: Lis ...
- ES6中Set和Map
1.Set 实例的创建 Set实例它类似于数组,但是成员的值都是唯一的,没有重复的值. Set本身是一个构造函数用来生成Set数据结构. Set 函数可以接受一个数组(或者具有 iterable 接口 ...
- C语言Ⅰ博客作业08
这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-3/homework/9978 我在这个课程的目 ...
- VS添加版权声明
C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\ItemTemplates\AspNetCore\ ...
- java水题集
POJ - 1220 进制转换 import java.io.*; import java.util.*; import java.math.*; public class Main { public ...
- 【转载】Python第三方库资源
转自:https://weibo.com/ttarticle/p/show?id=2309404129469920071093 参考:https://github.com/jobbole/awesom ...
- T100 —— 凭证打印时排序
capr110_g01,按扣账日期打印排序: 在adzp188——“字段”中加入pmds001的话,产生的代码的变量是:pmds_t_pmds001 :当在“群组”—“印出排序” 再添加pmds001 ...