day4

第一题:

有n个元素,开始都是0,现在有两种操作指令:
0 l r:将标号为 l 到 r 的元素做取反操作(0 变为 1,1 变为 0)。
1 l r:询问标号为 l 到 r 的元素中共有多少个为 1。

(注:标号为 l 到 r 的元素包括标号为 l 和标号为 r 的元素)

[ 输入格式]
输入包含 m + 1 行。
第一行包含量个正整数 n 和 m,分别代表序列元素个数和操作个数。
第二行到 m + 1 行每行三个数字,代表一个操作,格式如“? l r”,?
为 0 或 1,意义如上所述。
[ 输出格式]
输出包含若干行。
每行一个整数,依次代表对每个询问的回答。
[ 样例输入]
4 5
0 1 2
0 2 4
1 2 3
0 2 4
1 1 4

[ 样例输出]
1
2
[ 样例说明]
0 0 0 0 -> 1 1 0 0 -> 1 0 1 1 -> 1 1 0 0
[ 数据规模与约定]
对于 30%的数据:n,m<=1000;
对于 50%的数据:n<=5000;
对于 100%的数据:n,m<=100000。

(本题数据量较大,建议使用 scanf 做数据读入)

 

seq

是线段树。

存的特征信息为区间和。
修改操作为:若包含,取反整个区间(sum = 整个区间长 - 当前sum)。
lazytag使用异或(取反两次就等于没做)。
其余和区间和的线段树一样。

第二题:

s有很多任务要完成,每个任务有不同的 DDL(deadline,截止时间)

和获利值,第 i 个任务的 DDL 为 Di,获利值为 Pi。

每个任务要消耗1个时间,问s最多可以获得多少利润???

一看,就会想起智慧大冲浪,就是贪心+堆维护。

用堆维护已经选了的收益最小值,按起始时间排序,选一个时间+1,能选就直接放进堆,如果选不了就放弃收益最小的任务(如果)。

 

 

 

 

第三题:n个嫌疑犯,其中有些人是被误抓的

人,他们说的话都是实话,而剩下的则是罪犯,他们说的话都是谎话,

好人说的话是真的,坏人是假的,然而警察可能记错了一些话,现在请你编程帮助警察找出从第一句话开始
往下,最多有连续多少句话是不矛盾的。

 

 

两类人,一类说真话,一类说假话。
X说Y说的是假话,则不管X说的是真话还是假话,X和Y都不可能是同一类人。
X说Y说的是真话,则不管X说的是真话还是假话,X和Y都一定是同一类人。
集合关系确定,两个人之间的关系:要么同在一个集合,要么在不同集合。
用类似关押罪犯的处理方法处理“是同类人”和“不是同类人”的关系,合并前检查是否冲突。

 

第四题:

学完数据结构,要拍毕业照。照相那天,n 名同学分别有自己的编号,所
有同学的编号不一定连续。照相前,他们排成了一排,已知标号为 c[i]的同

学正站在第 i 个位置上。后来,他们要按从低到高排队,只有左右俩个人才能和自己交换;

问要交换几次??

需要调换的次数->总逆序对个数。
用归并解决,ok。
用上午讲的树状数组方法解决,需要开很大的数组,不合适。会发现其实编号本身是没用的,只要知道编号大小关系即可。所以重新使用1...N分别为编号最小到编号最大的学生编号。(离散)
处理完成后,再用树状数组解决。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值