• 【CF538H】Summer Dichotomy(思维)


    点此看题面

    • 你需要把(n)个老师分成两组,且已知有(m)对老师不想分在一起。
    • 每个老师有一个希望的学生数量区间([l_i,r_i])
    • 你需给出一种方案,满足能给两组老师分配学生使得学生总数在([t,T])范围内。
    • (tle Tle10^9,n,mle10^5)

    思维+二分图染色

    考虑如果存在三个老师,他们的区间两两不交,显然不可能有解。

    因此,令(L=max_{i=1}^nl_i,R=min_{i=1}^nr_i),并考虑让划分出的两组老师的学生人数分别为(L,R),但(L+R)并不一定在([t,T])范围内。

    (L+R<t),显然只增大(L)一定是更优的;若(L+R>T),那么只减小(R)一定是最优的。

    也就是说,我们可以直接求出这两组的学生人数。

    然后就是考虑每个老师可以放在哪一组中,如果哪组都不行显然无解,如果只能一组那么所有和他有关系的老师放哪组都确定了(二分图染色),如果两组都行那么先不管。

    最后再给两组都行的老师随便染色就好了。

    代码:(O(n+m))

    #include<bits/stdc++.h>
    #define Tp template<typename Ty>
    #define Ts template<typename Ty,typename... Ar>
    #define Reg register
    #define RI Reg int
    #define Con const
    #define CI Con int&
    #define I inline
    #define W while
    #define N 100000
    #define add(x,y) (e[++ee].nxt=lnk[x],e[lnk[x]=ee].to=y)
    using namespace std;
    int n,m,t,T,l[N+5],r[N+5],c[N+5],ee,lnk[N+5];struct edge {int to,nxt;}e[2*N+5];
    I void Col(CI x)//二分图染色
    {
    	for(RI i=lnk[x];i;i=e[i].nxt) c[e[i].to]==c[x]?
    		(puts("IMPOSSIBLE"),exit(0),0):!c[e[i].to]&&(c[e[i].to]=3-c[x],Col(e[i].to),0);//注意判奇环无解
    }
    int main()
    {
    	RI i,x,y,L=0,R=1e9;scanf("%d%d%d%d",&t,&T,&n,&m);
    	for(i=1;i<=n;++i) scanf("%d%d",l+i,r+i),L=max(L,l[i]),R=min(R,r[i]);//求出L,R
    	for(i=1;i<=m;++i) scanf("%d%d",&x,&y),add(x,y),add(y,x);//建图
    	if(L+R>T&&(R=T-L),L+R<t&&(L=t-R),L<0||R<0) return puts("IMPOSSIBLE"),0;//如果L<0或R<0则无解
    	#define In(x,l,r) ((l)<=(x)&&(x)<=(r))//判断一个点是否在区间内
    	for(i=1;i<=n;++i) if(!In(L,l[i],r[i])&&!In(R,l[i],r[i])) return puts("IMPOSSIBLE"),0;//如果两组都不行则无解
    		else if(!In(R,l[i],r[i])) {if(c[i]==2) return puts("IMPOSSIBLE"),0;c[i]=1,Col(i);}//只能放第一组
    		else if(!In(L,l[i],r[i])) {if(c[i]==1) return puts("IMPOSSIBLE"),0;c[i]=2,Col(i);}//只能放第二组
    	for(i=1;i<=n;++i) !c[i]&&(c[i]=2,Col(i),0);//两组都能放的随便放
    	for(puts("POSSIBLE"),printf("%d %d
    ",L,R),i=1;i<=n;++i) putchar(c[i]+48);return 0;//输出方案
    }
    
  • 相关阅读:
    nginx-syslog
    loki
    idea安装中文插件
    nginx虚拟目录alias
    个人 软件系统整理
    Python 遍历Sheet 每个Sheet都单独保存为一个Excel
    SQL Server 多表关联的update语句
    电商 生意参谋 抓取 访客数据 JS版/谷歌插件版
    EF 多表关联
    个人 圈外同学 对比分析
  • 原文地址:https://www.cnblogs.com/chenxiaoran666/p/CF538H.html
Copyright © 2020-2023  润新知