[CF538H]Summer Dichotomy

题目大意:

​ 将若干个学生分为两个班级\(S_1,S_2\),每个班的学生数分别为\(n_1,n_2\)(甚至可以没有学生,也可以没有老师)。给出限制\(t_{\min},t_{\max}\),要求\(t_{\min}\le n_1+n_2\le t_{\max}\)。有\(n(n\le10^5)\)个老师,每个老师希望他所任教的班级人数在\([l_i,r_i]\)范围内。有\(m(m\le10^5)\)对老师之间有一些私人恩怨,不能分在一个班级。问是否存在合法的分班方案。如果有,求出其中的任意一种,输出每个班的总人数以及各个老师所任教的班级。

思路:

​ 对于所有\([l_i,r_i]\)的限制,我们不妨假设\(n_1=\min\{r_i\},n_2=\max\{l_i\}\),显然这是比较松的约束。再考虑\(t_{\min},t_{\max}\)的限制,确定可行的一组\(n_1,n_2\)。考虑二分图染色构造老师分配的方案。对于只能分到\(S_1\)或只能分到\(S_2\)的老师DFS遍历染色,若更新到的结点与已染色结点矛盾,说明根本不是二分图,不存在合法的方案。对于两个都不可以分进去的,说明也不存在合法方案。最后再对于\(S_1\)和\(S_2\)都可以的进行染色。

源代码:

#include<cstdio>
#include<cctype>
#include<vector>
#include<climits>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
constexpr int N=1e5;
int l[N],r[N],ans[N];
std::vector<int> e[N];
inline void add_edge(const int &u,const int &v) {
e[u].push_back(v);
e[v].push_back(u);
}
void dfs(const int &x,const int &c) {
if(ans[x]) {
if(ans[x]!=c) throw(0);
return;
}
ans[x]=c;
for(auto &y:e[x]) {
dfs(y,3-c);
}
}
int main() {
const int t_min=getint(),t_max=getint();
const int n=getint(),m=getint();
int n1=INT_MAX,n2=INT_MIN;
for(register int i=0;i<n;i++) {
n2=std::max(n2,l[i]=getint());
n1=std::min(n1,r[i]=getint());
}
if(n1+n2<t_min) n2=t_min-n1;
else if(n1+n2>t_max) n1=t_max-n2;
if(n1<0||n2<0) {
puts("IMPOSSIBLE");
return 0;
}
for(register int i=0;i<m;i++) {
add_edge(getint()-1,getint()-1);
}
for(register int i=0;i<n;i++) {
try {
if(!(l[i]<=n1&&n1<=r[i])&&!(l[i]<=n2&&n2<=r[i])) throw(0);
if((l[i]<=n1&&n1<=r[i])&&!(l[i]<=n2&&n2<=r[i])) dfs(i,1);
if((l[i]<=n2&&n2<=r[i])&&!(l[i]<=n1&&n1<=r[i])) dfs(i,2);
} catch(...) {
puts("IMPOSSIBLE");
return 0;
}
}
for(register int i=0;i<n;i++) {
try {
if(!ans[i]) dfs(i,1);
} catch(...) {
puts("IMPOSSIBLE");
return 0;
}
}
puts("POSSIBLE");
printf("%d %d\n",n1,n2);
for(register int i=0;i<n;i++) {
printf("%d",ans[i]);
}
return 0;
}

[CF538H]Summer Dichotomy的更多相关文章

  1. The bytes/str dichotomy in Python 3

    The bytes/str dichotomy in Python 3 - Eli Bendersky's website https://eli.thegreenplace.net/2012/01/ ...

  2. 【BZOJ1014】【JSOI2008】火星人prefix Splay处理区间,hash+dichotomy(二分)check出解

    题意不赘述了,太清晰了. 说题解:首先依据原字符串建立SPT.首尾建议多加一个空白字符. 给一个树构图,依照平衡树的前后大小顺序性质能够使它们始终维持为一个序列,而且能够通过rank找到序列的第k个. ...

  3. The bytes/str dichotomy in Python 3 [transport]

    reference and transporting from: http://eli.thegreenplace.net/2012/01/30/the-bytesstr-dichotomy-in-p ...

  4. 6 VC维

    1 VC维的定义 VC维其实就是第一个break point的之前的样本容量.标准定义是:对一个假设空间,如果存在N个样本能够被假设空间中的h按所有可能的2的N次方种形式分开,则称该假设空间能够把N个 ...

  5. I finally made sense of front end build tools. You can, too.

    来源于:https://medium.freecodecamp.com/making-sense-of-front-end-build-tools-3a1b3a87043b#.nvnd2vsd8   ...

  6. Coursera台大机器学习课程笔记5 -- Theory of Generalization

    本章思路: 根据之前的总结,如果M很大,那么无论假设泛化能力差的概率多小,都无法忽略,所以问题转化为证明M不大,然后上章将其转化为证明成长函数:mh(N)为多项式级别.直接证明似乎很困难,本章继续利用 ...

  7. Coursera台大机器学习课程笔记4 -- Training versus Testing

     这节的主题感觉和training,testing关系不是很大,其根本线索在于铺垫并求解一个问题:    为什么算法PLA可以正确的work?因为前面的知识告诉我们,只有当假设的个数有限的时候,我们才 ...

  8. 关于学习YYKit的记录

    <1>遇到的问题 <1>使用@[].mutableCopy创建可变数组 代码出处:YYKitDemo-> YYRootViewController 源代码:self.ti ...

  9. 【转载】VC维的来龙去脉

    本文转载自 火光摇曳 原文链接:VC维的来龙去脉 目录: 说说历史 Hoeffding不等式 Connection to Learning 学习可行的两个核心条件 Effective Number o ...

随机推荐

  1. idea 的http client的使用

    1.打开idea的http client的工具步骤如下图所示: 然后在http client 的工具里写:请求头,请求参数,请求体即可.

  2. (转)详解HTML网页源码的charset格式

    关于HTML网页源码的字符编码(charset)格式(GB2312,GBK,UTF-8,ISO8859-1等)的解释 crifan http://www.crifan.com/summary_expl ...

  3. javascript简易下拉菜单效果

    JS代码: window.onload=function(){ var oDiv=document.getElementById('navMenu'); var aUl=oDiv.getElement ...

  4. js闭包,原型,作用域等再一次理解

    要理解闭包,原型等,首先要理解作用域 作用域:就是函数在定义的时候创建的,用于寻找使用到的变量的值的一个索引,而他内部的规则是,把函数自身的本地变量放在最前面,把自身的父级函数中的变量放在其次,把再高 ...

  5. 打砖块(codevs 1257)

    题目描述 Description 在一个凹槽中放置了n层砖块,最上面的一层有n块砖,第二层有n-1块,……最下面一层仅有一块砖.第i层的砖块从左至右编号为1,2,……i,第i层的第j块砖有一个价值a[ ...

  6. 【mysql优化】语句优化

    1.int型子查询陷阱 如下两个表: mysql> desc user; +----------+-------------+------+-----+---------+-------+ | ...

  7. Linux服务器中毒事件(libudev.so)

    今天机房管理人员反馈公司的某台服务器在防火墙上的连接数超限,登陆服务器时发现非常卡顿,远程登录后查看,CPU持续100%,且有一长度为10的随机字符串进程,kill掉,会重新生成另外长度为10的字符串 ...

  8. Golang在视频直播平台的高性能实践(含PPT下载)

    熊猫 TV 是一家视频直播平台,先介绍下我们系统运行的环境,下面这 6 大服务只是我们几十个服务中的一部分,由于并发量与重要性比较高,所以成为 golang 小试牛刀的首批高性能高并发服务. 把大服务 ...

  9. 网络知识===TCP/UDP的区别

    TCP(传输控制协议,Transmission Control Protocol): 1)提供IP环境下的数据可靠传输(一台计算机发出的字节流会无差错的发往网络上的其他计算机,而且计算机A接收数据包的 ...

  10. cookie和session的区别与会话跟踪技术

    会话跟踪技术: HTTP是一种无状态协议,每当用户发出请求时,服务器就会做出响应,客户端与服务器之间的联系是离散的.非连续的.当用户在同一网站的多个页面之间转换时,根本无法确定是否是同一个客户,会话跟 ...