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