CF Round#169

AB 水题

C 简单的贪心

大意是给出一个数组,然后和一些区间和查询,现可以在进行查询前对数组进行重排。求通过重排能得到的最大的查询总和。

求出每个位置被查询的次数,具体做法是用一个辅助数组A,当查询l,r时。做++A[l],--A[r+1],则前缀和S[i]就代表着第i个位置被查询的次数。

然后对给出数组进行排序,将最大的放到被查询最多的位置,第二大的放到查询第二多的位置……

D 给定区间[L,R]求出区间内两数,使得其异或最大

随便搞几组数据就可以发现答案都是2^n-1这种类型的,所以我们大概猜想对于二进制的每一位都能异或出1来。

因为对于a,b两数(a>b)当某一位a与b的值相同时,若为0则可将b那一位变为1,若为1则可将a那一位变为0。在这个操作中a不断变小,b不断变大。所以我们一开始将a,b取值为R,L。

不过还得避免越界,即要有a>=L, b<=R。所以我们从最高位开始找第一个L与R值不相同的位i,必有L[i]为0,R[i]为1,则之后的位在进行上述操作的时候仍然能保持a>b的性质,自然也不会越界了。

也就是说答案从第i位开始皆为1。

E 大意: 给一个星型的树,也就是说除了根结点1外其余的结点的度数最大为2。所有结点初始都有一个值0。然后有两种操作,一种是给距离结点x不到d的所有结点(包括x)加上t。另一种操作是给查询结点x的值。

由根结点向外延伸出去了很多的链,对于每一条链都可以维护一个前缀和数组,然后单独为根结点维护一个前缀和数组,就可以了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值