Magolor的数据结构作业
\(CodeForces 706E ~Working routine\)
给出一个矩阵,每次操作交换两个子矩阵,求最后状态。
使用链表存储,每次交换后,影响到的之后矩阵边缘的指针,暴力修改。
\(~~~~\)
\(CodeForces 985E ~Pencils and Boxes\)
每个铅笔盒至少放\(k\)个铅笔,每个盒子中的铅笔价值的绝对值之差不能超过\(d\)。求是否有方案。
放在一个盒子里的铅笔价值是连续的一段,这样一定不劣。使用线段树维护合法的权值起始位置。
\(~~~~\)
\(CodeForces 316E3 ~Summer Homework\)
维护一个序列,询问\(Fibonacci\)数列作为系数乘区间每个元素的和。
常见的区间和维护。可以考虑维护矩阵,实际上没必要,因为有\(f[i]=a*f[0]+b*f[1]\),其中\(a\)和\(b\)也是\(Fibonacci\)数列相邻的数,可以推得规律。
\(~~~~\)
\(CodeForces 1191F ~Tokitsukaze and Strange Rectangle\)
平面上给一个点集,你可以用一种上边界为 \(y=INF\) 的矩形来包含一个子点集,求一共可以包含多少种子点集。
将点排序,主关键字\(y\)从大到小,副关键字\(x\)从小到大。树状数组维护横坐标为\(x\)的有多少点。就可以统计了。
\(~~~~\)
\(Gym 215177H\)天天爱射击
小C现在知道了游戏中\(n\)块木板位置,每个木板有个耐久值,以及知道了\(m\)个子弹射击位置。现在问你每个子弹射出去以后,有多少木板会碎掉?
以射击位置为时间轴,射击时间(顺序)为权值建立权值线段树并可持久化。枚举木板,在\(rt[R]\)和\(rt[L-1]\)相减的树中寻找答案。
\(~~~~\)
\(CodeForces 689D ~Friends and Subsequences\)
给定\(a\)数组和\(b\)数组,求有多少区间[L,R]使得\(min(a[L],a[L+1] \cdots a[R])\)等于\(max(b[L],b[L+1] \cdots b[R])\)
枚举左端点,倍增求右端点。
\(~~~~\)
\(HDU 5726 ~GCD\)
给出数列\(a\),询问求\(gcd(a[L],a[L+1] \cdots a[R])\),以及整个数列的子区间\(gcd\)与这个\(gcd\)相等的有多少个。
倍增预处理\(gcd\)。枚举子区间起点,由于\(gcd\)随右端点单调递减,而且递减很快\(log\)。因此可以二分gcd相等的区间统计个数。
询问时直接回答。