CF538H Summer Dichotomy
题意:可以录取x个学生,t<=x<=T。将学生分成两组,大小分别为n1,n2。一共有n个老师需要分进这两个组里,有m对老师互相讨厌不能同组,每个老师都对其所在组的大小有[li,ri]的限制。求一种学生和老师的合法分配方案。li,ri<=1e9,n,m<=1e5.
标程:
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=100005; 4 int t,T,n,m,c[N],n1,n2,l[N],r[N],x,y; 5 vector<int> vec[N]; 6 void fail(){puts("IMPOSSIBLE");exit(0);} 7 void dfs(int x,int col) 8 { 9 if (c[x]) 10 if (c[x]==col) return;else fail(); 11 c[x]=col; 12 for (int i=0;i<vec[x].size();i++) dfs(vec[x][i],3-col); 13 } 14 bool in(int i,int x) {return l[i]<=x&&x<=r[i];} 15 int main() 16 { 17 scanf("%d%d",&t,&T); 18 scanf("%d%d",&n,&m);n1=1e9; 19 for (int i=1;i<=n;i++) scanf("%d%d",&l[i],&r[i]),n1=min(n1,r[i]),n2=max(n2,l[i]); 20 for (int i=1;i<=m;i++) scanf("%d%d",&x,&y),vec[x].push_back(y),vec[y].push_back(x); 21 if (n1+n2<t) n2=t-n1; 22 else if (n1+n2>T) n1=T-n2; 23 if (n1<0||n2<0) fail(); 24 for (int i=1;i<=n;i++) 25 if (in(i,n1)) 26 { 27 if (!in(i,n2)) dfs(i,1); 28 }else if (in(i,n2)) dfs(i,2); 29 else fail(); 30 for (int i=1;i<=n;i++) if (!c[i]) dfs(i,1); 31 printf("POSSIBLE\n%d %d\n",n1,n2); 32 for (int i=1;i<=n;i++) printf("%d",c[i]); 33 puts(""); 34 return 0; 35 }
题解:二分图染色
回忆一下分成两组有什么算法:匹配、染色、2-sat……
这里有不等式限制2-sat和匹配显然都不合适。
化简不等式:有n1或n2<=min(ri),max(li)<=n1或n2,可以证明n1,n2分别取两个限制不劣,设n1<=min(ri),max(li)<=n2。将这个限制和t<=n1+n2<=T的限制取交集。因而最后n1<=k1,n2>=k2,而如果有解k1,k2不变,故取n1=k1,n2=k2即可。
将老师的匹配区间根据n1和n2的限制二分图染色(厌恶连边),先确定只包含n1或n2的,再确定都包含的。
转载于:https://www.cnblogs.com/Scx117/p/9075154.html
CF538H Summer Dichotomy相关推荐
- [CF538H]Summer Dichotomy
[CF538H]Summer Dichotomy 题目大意: 将若干个学生分为两个班级\(S_1,S_2\),每个班的学生数分别为\(n_1,n_2\)(甚至可以没有学生,也可以没有老师).给出限 ...
- 训练3.21(C:Summer Dichotomy)
训练3.21(C:Summer Dichotomy) cf538H 题目:http://code**forces.com/problemset/problem/538/H 题意:T个学生来报考,至少录 ...
- Definition of Dichotomy
台大的线上课程,Machine Learning Foundations,对于Dichotomy的定义: 大家对此定义,是否感到困惑?式子左边有h,为何右边也有h? 这有点像是我们在念文言文,有许多字 ...
- 数据结构之Python实现二分法查找dichotomy
""" 定义一个数组780 从里面查89 """def dichotomy(list, item):low = 0high = len(li ...
- 二分法查找(dichotomy)--python实现
二分法原理及实现 二分法原理概述 python实现代码 二分法原理概述 简单粗暴一点理解二分法 将数据有序排列:先将一个数据集进行有序排列(可根据某种数值的大小降序或升序<当然排序的规则可根据业 ...
- Dichotomy二分法学习笔记
二分法 二分法的特点 依赖于递归算法,逐次将区间长度减半,直至无限逼近所求点的方法. 算法的复杂度与区间长度,精度,待求点的位置分布有关 LeetCode 69 实现 int sqrt(int x) ...
- 【Codeforces 538 H】Summer Dichotomy(二分图染色)
传送门 显然是不能在一起的连边后二分图染色 似乎可以直接用setsetset维护一下可行的点染色 不过更简单的是 如果有三个[li,ri][l_i,r_i][li,ri]互相不交显然无解 可以得到 ...
- Dichotomy(递+非递)
输入:先输入进行二分搜索元素的个数,然后按大小依次输入(或随机生成,然后排序)每个数字,最后输入要求搜索的元素. 输出:要求搜索元素的下标(下标从0开始!). 示例:输入:61 5 5 9 6 9 6 ...
- Dichotomy专栏:Leetcode:#33 搜索旋转排序数组
Question: 整数数组 nums 按升序排列,数组中的值 互不相同 . 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转 ...
最新文章
- 本、硕、博的最大区别是什么?
- java字节流6_JavaIO流之字节流
- 国产AI框架再进化!百度Paddle Lite发布:率先支持华为NPU在线编译,全新架构更多硬件支持...
- matlab中并行用不了,请教matlab在linux下的并行问题 - 程序语言 - 小木虫 - 学术 科研 互动社区...
- PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 8192 bytes)
- PowerShell与Unix Shell对比:八大实例
- phpmyadmin 导出mysql,在phpmyadmin中导入/导出非常大的mysql数据库
- kafka java获取topic_通过编程方式获取Kafka中Topic的Metadata信息
- 10双屏鼠标过不去_灵耀X2 Duo双屏笔记本是怎样“炼”成的?对话华硕笔记本设计团队...
- FreeTextBox使用详解
- IOS开发UI控件UIScrollView和Delegate的使用
- 床长人工智能教程 - 目录
- MKV(Matroska)常见问题浅析
- python-selenium 自动化弹幕
- 哈曼推出Savari MECWAVE:超低时延边缘计算平台提供交钥匙式互联服务
- photoshop 快捷键学习笔记
- nyoj-506-洗澡
- gvim常用命令行大全
- 快准狠的数据挖掘分析,用了这些方法!复旦 Zilliz 梦幻联动
- Elemrnt UI DatePicker日期选择器(格式、限定日期),周选择器