2017.12.09【NOIP提高组】模拟赛B组总结

前言

又是一次考得不好的比赛,主要问题并不是说没有想到,而是打错了许多小细节,实在太坑爹,犹记之前一道水题,本来考试就能对的,但是程序打得太丑,以至时超,所以说打代码也是有很多技巧的,还是得继续磨炼。

T1

直接从前往后扫,遇到一个c的就加入小根堆中,若遇到一个e就判断当前的元素个数是否大于限制,是则删除,依次类推,注意无视最后一个end,然后把当前堆中的元素求和即为答案。

T2

将垂直的线段按y值递增排序。枚举一条垂直的线段L1,同时用线段树维护与L1在区间[l,r]内相交的水平线段个数。同时按y递增的顺序枚举另一条垂直线段L2,要求L2的y值大于L1。在枚举的过程中,依次在线段树中删除不再与L2所在直线相交的水平线段,然后就可以用线段树在O(logn)的时间内求出与L1,L2相交的水平线段个数k,并统计答案。这个算法的时间复杂度为
O(n^2logn)。
当然其实不一定要用线段树,加点优化也能过。

T3(重点)

题意:给你n个点,在给你由这些点所构成的m条边,去掉一条,然后将每条点染成蓝色,或红色,使得每一条边的两个端点都是异色的。问有哪些边可以满足条件。

说明

简单起见,在这篇文章中,如果一个环,它有奇数条边,那么我们叫它奇数环,反之,则叫偶数环。

奇数环与偶数环(较易想到)

一个显然的结论是如果一条边被奇数环所包含,那么这条边应该被删掉,如果一条边被偶数环包含,那么这条边不应被删去,一个例外是这个图中只有偶数环没有任何的奇数环,那么这个时候每一条边都满足条件。此致,我们就得到这样一个东西如果一条边被所有的奇数环包含,且不被任意一个偶数环包含,那么这条边可以被删除(特殊情况除外)

重点

我们设
f1i 表示第i条边被多少个奇数环包含
f2i 表示第i条边被多少个偶数环包含
然后我们把这个图遍历,(类似树)求出深度,设为 li ,那么假如我们现在有一点i,它连向j并且j的深度比它小,那么这就构成了一个环,我们只需减一下便可知道这是一个奇数环还是偶数环,同时我们用一个sum记录一下,有多少个奇数环,那么这个时候我们引进两个新的数组, g1,g2 这两个东西是用来搞差分的,怎么用呢?假设现在i和j满足上面所说的条件,那么假设这是一个奇数环,那么 g1j1,g1i+1 ,为什么这样呢,且不管。
好,假设我们现在已经搞好了上面所说的,我们开始统计答案,
自底向上算,把g1/2类加一下就好了(注意对应)。
那么我们线性扫一遍就好了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值