【CF896C】Willem, Chtholly and Seniorious】的更多相关文章

ODT模板题,ODT适合随机数据下具有维护区间推平操作的序列维护题目,时间复杂度较为玄学.. 代码如下 #include <bits/stdc++.h> #define pb push_back #define mp make_pair #define all(x) x.begin(),x.end() using namespace std; const int maxn=1e5+10; const int mod=1e9+7; typedef long long LL; LL fpow(LL…
Prelude ODT这个东西真是太好用了,以后写暴力骗分可以用,写在这里mark一下. 题目链接:ヽ(✿゚▽゚)ノ Solution 先把原题解贴在这里:(ノ*・ω・)ノ 简单地说,因为数据是全部随机的,所以一定会有特别多的区间set,就会有很多数字相同,那么我们暴力把相同的数字合并成一个点,合并完之后数组就变得很短,然后对于询问暴力做就可以了. 具体复杂度是什么我也不会证明qwq,所以就把由乃的题解贴上来了qwq,感觉很靠谱的样子. 题解中给的是用STL的set维护缩点后的数组,我感觉不是很…
[题意]将n*m矩阵分成两个区域,要求满足一定条件,求两区域内部极差较大值最小.n,m<=2000 [算法]二分 [题解]极差的数值满足单调性,所以考虑二分极差. 对于给定的极差,将所有数值排序后,1~a[n*m]-num-1必须选择A,a[1]+num+1~n*m必须选择B,其它不要求.(开始的时候想二分图染色,后来发现排序一下规律就十分明显了) 现在问题转化为矩阵中已知一些格子选A,一些格子选B,求能否组成合法方案. 观察要求满足的条件,很容易得出结论:分界线必须单调,所以就有上A下B或上B…
这里介绍以个小$trick$,民间流传为$Old Driver Tree$,实质上就是$set$维护线段. 我们将所有连续一段权值相同的序列合并成一条线段,扔到$set$里去,于是$set$里的所有线段的并就是原序列,并且都不相交. 我们在操作的时候很暴力,每次把$[l, r]$的线段抠出来,暴力枚举一遍算答案.对于每一个非区间赋值的操作,最多断两条线段,新加两条线段. 实现起来很方便,思路也非常简单,但是局限性也很明显,因为其复杂度是基于随机的,并且必须存在区间赋值的操作. 但$set$维护线…
Willem, Chtholly and Seniorious https://codeforces.com/contest/897/problem/E time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output — Willem... — What's the matter? — It seems that there's someth…
http://codeforces.com/problemset/problem/896/C 题意: 对于一个随机序列,执行以下操作: 区间赋值 区间加 区间求第k小 区间求k次幂的和 对于随机序列,可以使用Old Driver Tree 就是将序列中,连续的相同值域合并为一段 然后暴力操作 #include<set> #include<vector> #include<cstdio> #include<iostream> #include<algor…
仿佛没用过std::set Seniorious has n pieces of talisman. Willem puts them in a line, the i-th of which is an integer ai. In order to maintain it, Willem needs to perform m operations. There are four types of operations: 1 l r x: For each i such that l ≤ i …
貌似珂朵莉树是目前为止(我学过的)唯一一个可以维护区间x次方和查询的高效数据结构. 但是这玩意有个很大的毛病,就是它的高效建立在数据随机的前提下. 在数据随机的时候assign操作比较多,所以它的复杂度会趋近于mlogn(m为询问次数).假如出题人想要卡珂朵莉树的话,那肯定是会T得没边. 因此不要指望什么题目都套珂朵莉树(虽然它能水过很多数据结构题),特别是在数据非随机的情况下不要使用. 当然,如果题目让你求区间x次方和而在题目条件下你想不出巧算,那写一颗珂朵莉树还是很OK的. 不得不说珂朵莉树…
题意简述 维护一个数列,支持区间加,区间赋值,区间求第k小,区间求幂和 数据随机 题解思路 ODT是一种基于std::set的暴力数据结构. 每个节点对应一段区间,该区间内的数都相等. 核心操作split可以将节点拆开,修改需要的部分. 每个操作都split(r+1),split(l),再遍历其中所有区间,修改或求值. 至于时间复杂度,由assign保证 代码 #include <set> #include <vector> #include <utility> #in…
https://www.cnblogs.com/WAMonster/p/10181214.html 主要用于支持含有较难维护的区间操作与查询的问题,要求其中区间赋值操作(assign())是纯随机的. 注意要先split(r+1)再split(l),最好最后设一个点(n+1,n+1,0) #include<set> #include<cstdio> #include<algorithm> #include<iostream> #define rep(i,l,…