CF765F Souvenirs
不得不说黑题实在太难搞了,两天做一个题
由于这道题不强制在线,所以可以离线处理
首先&#xff0c;我们只考虑iajia_ji<j,ai>aj 的情况&#xff0c;然后在考虑ii<j,ai<aj的情况&#xff0c;我们只需要数组取反即可&#xff0c;我们先把问题离线&#xff0c;将查询按右端点向左扫…
当我们右端点rrr的时候&#xff0c;先找到rrr左边第一个lll,满足al>ara_l>a_ral>ar&#xff0c;用al−ara_l-a_ral−ar更新lll左边的答案&#xff0c;然后不断找到j左边&#xff0c;比ala_lal小&#xff0c;比ara_rar大的l′l&#39;l′。
根据上述分析&#xff0c;我们不难发现al′−aral′−ar<al−al′才可以更新答案&#xff0c;移动不等式后发现2∗al′2∗al′<al&#43;ar&#xff0c;所以每次更新后我们的ansansans都会减半&#xff0c;那么我们的算法时间复杂度就变成了logloglog了&#xff0c;但是还是会超时,我们可以用树状数组进行优化&#xff0c;更新答案的时候我们不再需要直接更新&#xff0c;那时间复杂度就变成了nlogai&#43;mloglogainloga_i&#43;mlogloga_inlogai&#43;mloglogai
这道题的主要思路就是在线转离线&#xff0c;然后从右开始更新
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include
#define inf 0x7fffffff
#define re int
#define void inline void
#define eps 1e-8
#define ls(p) p<<1
#define rs(p) p<<1|1
#define pi acos(-1.0)
#define pb push_back
#define P pair < int , int >
#define mk make_pair
using namespace std;
const int mod&#61;998244353;
const int M&#61;5e6;
const int N&#61;3e6&#43;5;
struct node
{int l,r,sum;
}e[N*8];
int tot,rt[N];
int a[N],c[N],ans[N];
int n,m;
vector < P > q[N];
int p[N],cnt,ret[N],rk[N],s[N],st[N],top;
bool cmp(int x,int y){return a[x]<a[y];}