LINK:Phoenix and Memory

这场比赛标题好评 都是以凤凰这个单词开头的 有凤来仪吧.

其实和Hall定理关系不大。

不过这个定理有的时候会由于 先简述一下。

对于一张二分图 左边集合为S 右边集合为T 那么有完备匹配时 最大匹配数为 min(|S|,|T|).

这里不妨假设|S|<=|T|.

若存在完备匹配那么对于任意集合\(s\in S\)都有s连出的边>=|s|.

这个定理是一张二分图具有完备匹配的充分必要条件。

先证明必要性:如果不存在 那么一定有点无法匹配到。

再证明充分性:反证法,如果满足这个条件但是形不成完备匹配 考虑S中那个没有被匹配的点w w一定有向外发出的未匹配边 考虑如果这条边的另一端的点如果被匹配了 那么另外一端的点的对应匹配点 还应该有至少一条出边 一直往复

可以发现一定有增广路的存在。

这道题 可以看成一张二分图 保证有解那么必然满足Hall定理。(不过没什么用。

考虑先求出一个合法解 点匹配线段问题 考虑贪心。

将线段按照左端点进行排序后 逐步分配位置 当前位置必然要分配给右端点最近的那个 这样给后面的局面不会带来更差的结果。

考虑是否存在两组解或多组解。进一步分析有两组解的性质。

对比这两组解可以发现我们刚才求出的解 和 另外一组解 一些位置进行了互换 可以发现这是形成大小至少为2的置换.

考虑如果存在>2的置换那么必然最后一个点要连上它之前的点 可以发现 连上之前较近的点也是合法的。

所以不断进行规约 必然存在大小为2的置换 也就是说如果有多组解必然存在有两个位置上的数字交换位置就可以得到。

至此 需要求出 是否位置上的i,j可以进行换位 不妨假设 i<j 那么必然存在 aj<=i<j<=bi

考虑枚举j求出这样的一个i 在j~n处查询之前的所有bi 看他们的最大的i值即可 因为此时i必然<j 且最大更容易满足条件。

可以利用线段树解决这个问题。

const int MAXN=200010;
int n;
struct wy{int x,y,id;}t[MAXN];
int p[MAXN],a[MAXN],b[MAXN],w[MAXN];
multiset<pii>s;
multiset<pii>::iterator it;
int sum[MAXN<<2];
inline int cmp(wy a,wy b){return a.x<b.x;}
inline int ask(int p,int l,int r,int L)
{
if(L<=l)return sum[p];
int mid=(l+r)>>1;
if(L>mid)return ask(yy,mid+1,r,L);
return max(ask(zz,l,mid,L),ask(yy,mid+1,r,L));
}
inline void change(int p,int l,int r,int x,int w)
{
if(l==r){sum(p)=max(sum(p),w);return;}
int mid=(l+r)>>1;
if(x<=mid)change(zz,l,mid,x,w);
else change(yy,mid+1,r,x,w);
sum(p)=max(sum(zz),sum(yy));
return;
}
signed main()
{
freopen("1.in","r",stdin);
get(n);
rep(1,n,i)get(a[i]),get(b[i]),t[i]=(wy){a[i],b[i],i};
sort(t+1,t+1+n,cmp);
int flag=0;
rep(1,n,i)
{
while(flag+1<=n&&t[flag+1].x==i)
{
s.insert(mk(t[flag+1].y,t[flag+1].id));
++flag;
}
it=s.begin();
p[(*it).S]=i;
w[i]=(*it).S;
s.erase(it);
}
rep(1,n,i)
{
int ww=ask(1,1,n,i);
if(ww>=a[w[i]])
{
puts("NO");
rep(1,n,j)put_(p[j]);
puts("");
swap(p[w[ww]],p[w[i]]);
rep(1,n,j)put_(p[j]);
return 0;
}
change(1,1,n,b[w[i]],i);
}
puts("YES");
rep(1,n,j)put_(p[j]);
return 0;
}

CF R638 div2 F Phoenix and Memory 贪心 线段树 构造 Hall定理的更多相关文章

  1. cf 442 div2 F. Ann and Books(莫队算法)

    cf 442 div2 F. Ann and Books(莫队算法) 题意: \(给出n和k,和a_i,sum_i表示前i个数的和,有q个查询[l,r]\) 每次查询区间\([l,r]内有多少对(i, ...

  2. BZOJ4391 High Card Low Card [Usaco2015 dec](贪心+线段树/set库

    正解:贪心+线段树/set库 解题报告: 算辣直接甩链接qwq 恩这题就贪心?从前往后从后往前各推一次然后找一遍哪个地方最大就欧克了,正确性很容易证明 (这里有个,很妙的想法,就是,从后往前推从前往后 ...

  3. 【题解】P1712 [NOI2016]区间(贪心+线段树)

    [题解]P1712 [NOI2016]区间(贪心+线段树) 一个observe是,对于一个合法的方案,将其线段长度按照从大到小排序后,他极差的来源是第一个和最后一个.或者说,读入的线段按照长度分类后, ...

  4. Codeforces 626G Raffles(贪心+线段树)

    G. Raffles time limit per test:5 seconds memory limit per test:256 megabytes input:standard input ou ...

  5. poj 2010 Moo University - Financial Aid (贪心+线段树)

    转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 骗一下访问量.... 题意大概是:从c个中选出n个 ...

  6. BZOJ 5249: [2018多省省队联测]IIIDX(贪心 + 线段树)

    题意 这一天,\(\mathrm{Konano}\) 接到了一个任务,他需要给正在制作中的游戏 \(\mathrm{<IIIDX>}\) 安排曲目 的解锁顺序.游戏内共有\(n\) 首曲目 ...

  7. [BZOJ4653][NOI2016]区间 贪心+线段树

    4653: [Noi2016]区间 Time Limit: 60 Sec  Memory Limit: 256 MB Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],. ...

  8. [九省联考2018]IIIDX 贪心 线段树

    ~~~题面~~~ 题解: 一开始翻网上题解看了好久都没看懂,感觉很多人都讲得不太详细,所以导致一些细节的地方看不懂,所以这里就写详细一点吧,如果有不对的or不懂的可以发评论在下面. 首先有一个比较明显 ...

  9. [bzoj4391] [Usaco2015 dec]High Card Low Card 贪心 线段树

    ---题面--- 题解: 观察到以决策点为分界线,以点数大的赢为比较方式的游戏都是它的前缀,反之以点数小的赢为比较方式的都是它的后缀,也就是答案是由两段答案拼凑起来的. 如果不考虑判断胜负的条件的变化 ...

随机推荐

  1. 20 个 CSS高级样式技巧汇总

    使用技巧会让人变的越来越懒,没错,我就是想让你变懒.下面是我收集的CSS高级技巧,希望你懒出境界. 1. 黑白图像 这段代码会让你的彩色照片显示为黑白照片,是不是很酷? img.desaturate ...

  2. 3dTiles 数据规范详解[3] 内嵌在瓦片文件中的两大数据表

    转载请声明出处:全网@秋意正寒 零.本篇前言 说实话,我很纠结是先介绍瓦片的二进制数据文件结构,还是先介绍这两个重要的表.思前想后,我决定还是先介绍这两个数据表. 因为这两个表不先给读者灌输,那么介绍 ...

  3. plus.runtime.quit()是个好函数

    对于H5+APP开发,应用的生命周期监听函数里是对应用行为的监控,但是并不对应用执行退出或重启操作.相关操作还是要使用mui

  4. jmeter察看结果树-响应数据乱码

    打开jmeter下的目录:\bin\jmeter.properties文件,搜索“encoding”关键字,找到如下配置: # The encoding to be used if none is p ...

  5. day17 生成器, 面向过程, 三元表达式, 生成式

    1. 生成器 生成器:就是一种自定义的迭代器,是用来返回多次值自定义迭代器的好处:节省内存 return只能返回一次值,函数就立即结束了yield 1.可以挂起函数,保存函数的运行状态 2.可以用来返 ...

  6. 安装nodejs,npm,yarn

    先安装nodejs和npm sudo apt update sudo apt install nodejs npm #验证一下 nodejs --version npm --version 如果nod ...

  7. TP5中的缓存使用

    Thinkphp 5.0采用了 think\Cache 类来提供缓存支持 缓存支持采用驱动方式,所以缓存在使用之前,需要进行连接操作,也就是缓存初始化操作. 支持的缓存类型包括file.memcach ...

  8. equals方法与==关系的总结

    /** * ==&&equals区别 * * ==比较的是栈内存中的值 * 对于基本类型数据,比较的是栈内存中的值 * 对于引用数据类型,比较的是栈内存中的值(值的真是含义是一个地址) ...

  9. Mesos+Zookeeper+Marathon+Docker环境搭建

    相关理论请参考:https://www.cnblogs.com/Bourbon-tian/p/7155054.html,本文基于https://www.cnblogs.com/Bourbon-tian ...

  10. P1776 宝物筛选

    题目: 正文: 啊,多重背包真恶心... 一开始我是把多重背包改成了01背包,然鹅我当时是直接1个1个的往后摞的... 参见以下代码: for(int i=1;i<=n;++i){//平平无奇的 ...