7.29集训

上午

(睡觉ing)

主要也就是讲了数据结构

讲了树状数组,线段树的相关操作(貌似没有提到分块)

单点修改,区间查询

秒切

区间修改,单点查询

搞个差分数组,还是切

区间修改,区间查询

推式子....埋地雷

逆序对

way1.我们可以用归并排序来求

tot += (LL)mid - i + 1;

way2.用树状数组
当然是建立权值树状数组

我们考虑逆序对的定义,首先是\(i>j\),其次是\(a[i] < a[j]\)

在树状数组里面...... 埋地雷

火柴排队

考虑,我们需要保证的是,a序列的第k大数对应着b序列中第k大的数

所以在离散化完成后的数组内,我们假设\(a = \left\{ 4,3,1,2 \right\}\),\(b = \left\{ 1,3,2,4 \right\}\)

\(q[a[i]] = b[i]\),相当于以\(a[i]\)为关键字对\(b[i]\)进行排序

若序列a与序列b相等,也就是说\(q[i] = i\)

我们想让\(a,b\)序列相等,就要保证q数组单调递增

所以原来问题转化为:讲原来凌乱的q数组转化为一个升序数组需要的最小次数,切每一次只能交换相邻的两个数

这不是逆序对这是啥?

项链

\(nlogn\)离线树状数组才能做,莫队会被卡

我们考虑当前这个颜色是否出现过,如果发现没有出现过,那么就令他为1,如果出现过,就令前面出现的那次\(+(-1)\)

一个区间的答案呼之欲出\(\sum (last[i] < l)\) 其中\(l \leq i \leq r\)

异或和

观察数据范围,\(\sum a[i] \leq 1e6\)

考虑前缀和

考虑二进制下每一位对答案的影响,所以分四种情况

设第一个数\(A\),第二个数为\(B\),所以分为\(A=1\)\(B=1\)\(A=1\)\(B=0\)的情况

\(1 - 1 = 1\)

说明第一个数的第\(k\)位为\(1\)的时候,前\(k-1\)位要比\(B\)的前\(k-1\)位小

\(1 - 0 = 1\)

说明第一个数的第\(k\)位为\(1\)的时候,前\(k-1\)位要比\(B\)的前\(k-1\)位大

\(0 - 1 = 0\)

说明第一个数的第\(k\)位为\(0\)的时候,前\(k-1\)位要比\(B\)的前\(k-1\)位小

\(0 - 1 = 1\)

说明第一个数的第\(k\)位为\(0\)的时候,前\(k-1\)位要比\(B\)的前\(k-1\)位大

然后埋坑.....

附近公园

先把这个序列大于等于水面的取为1,否则为0

考虑每一位置对他左边的取一个min和max,考虑min与max序列中,“1”的那些位置有几个不一样

就相当于存在了几对区间,所以

ans = differt >> 1;

然后我们考虑.....又埋坑了.....

关于可持久化线段树

考虑对每一个状态都开一个线段树,为了使其优化,我们尝试当前树连之前树的边

单点修改的话,可以简单一些

对于区间修改的东西,我们得边读入边建树

猜你喜欢

转载自www.cnblogs.com/yszhyhm/p/13395418.html