首页 > 其他分享 >CF 1762 F

CF 1762 F

时间:2024-09-23 15:46:44浏览次数:1  
标签:return int 可以 CF 不降 lst 1762 单调

考虑怎么不重不漏的计算每一个区间。可以发现,每一个可行的区间一定是可以找到 \(i_1\sim i_k\) 使 \(a_{i_1}\sim a_{i_k}\) 是单调不增或者不降的。

这是因为,考虑有一个地方比两边都要小,那么我们可以直接忽略它,两边的差一定在 \(k\) 以内。比两边都大同理。因此我们现在就要算单调不增个数加单调不降减去 \(a_l=a_r\) 的 \([l,r]\) 个数。现在只讨论一种单调不降的。

考虑把序列转化成平面上的点,也即 \((i,a_i)\)。

设 \(f_r\) 为右端点为 \(r\) 的方案数,先算出 \(lst_r\) 为在左边第一个 \(a_{i}\in [a_i-k,a_i]\) 的位置 \(i\)。则 \(f_r\) 可以从 \(f_{lst_r}\) 转移过来。上图这种情况下,如果我们想要算 \(r=5\) 的答案,\(lst_5=4\),所以 \(f_5\) 有一部分是 \(f_4\) 贡献的。但是容易发现 \((3,5)\) 这个点没有被算进去,因此还要加上前面 \(a_i\in [a_{lst_r}+1,a_i]\) 的 \(i\) 的个数。可以直接加,因为这个区间一定是可以一步到达的。

找 \(lst_r\) 可以用线段树,后面的部分可以用树状数组。

时间复杂度 \(\mathcal{O}(n\log n)\)。

#include <bits/stdc++.h>

using namespace std;

using ll = long long;

const int N = 5e5+5;
const int A = 1e5+5;

int n,k,a[N],lu[N],ld[N],bit[A],f[N],m=A-5;

void M(int p,int v){
	while (p<A){
		bit[p]+=v,p+=p&-p;
	}
}

int Q(int p){
	int res=0;
	while (p){
		res+=bit[p],p-=p&-p; 
	}
	return res;
}

int S(int l,int r){
	return Q(r)-Q(l-1);
}

int t[N<<2];

void pu(int k){
	t[k]=max(t[k<<1],t[k<<1|1]);
}

void upd(int k,int l,int r,int p,int v){
	if (l==r){
		t[k]=v;
		return;
	}
	int mid=l+r>>1;
	if (p<=mid) upd(k<<1,l,mid,p,v);
	else upd(k<<1|1,mid+1,r,p,v);
	pu(k);
}

int qy(int k,int l,int r,int ql,int qr){
	if (ql<=l && r<=qr){
		return t[k];
	}
	if (r<ql || l>qr){
		return 0;
	}
	int mid=l+r>>1;
	return max(qy(k<<1,l,mid,ql,qr),qy(k<<1|1,mid+1,r,ql,qr));
}

void solve(){
	cin>>n>>k;
	map<int,ll> mp;
	for (int i=1; i<=n; i++){
		cin>>a[i];
		mp[a[i]]++;
	}
	for (int i=1; i<=n; i++){
		int l=max(1,a[i]-k),r=a[i];
		lu[i]=qy(1,1,m,l,r);
		l=a[i],r=min(m,a[i]+k);
		ld[i]=qy(1,1,m,l,r);
		upd(1,1,m,a[i],i);
	}
	for (int i=1; i<=n; i++){
		upd(1,1,m,a[i],0);
	}
	ll ans=0;
	for (int i=1; i<=n; i++){
		if (lu[i]==0){
			f[i]=1,ans++;
			M(a[i],1);
			continue;
		}
		f[i]=f[lu[i]]+S(a[lu[i]]+1,a[i])+1;
		ans+=f[i];
		M(a[i],1);
	}
	for (int i=1; i<=n; i++) M(a[i],-1);
	for (int i=1; i<=n; i++){
		if (ld[i]==0){
			f[i]=1,ans++;
			M(a[i],1);
			continue;
		}
		f[i]=f[ld[i]]+S(a[i],a[ld[i]]-1)+1;
		ans+=f[i];
		M(a[i],1);
	}
	for (int i=1; i<=n; i++) M(a[i],-1);
	for (auto u : mp){
		ll c=u.second;
		ans-=c*(c+1)/2;
	}
	cout<<ans<<"\n";
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);

	int t;
	cin>>t;
	while (t--){
		solve();
	}
	return 0;
}

标签:return,int,可以,CF,不降,lst,1762,单调
From: https://www.cnblogs.com/SFlyer/p/18427161

相关文章

  • CF1270H Number of Components 题解
    Description给一个长度为\(n\)的数组\(a\),\(a\)中的元素两两不同。对于每个数对\((i,j)(i<j)\),若\(a_i<a_j\),则让\(i\)向\(j\)连一条边。求图中连通块个数。支持\(q\)次修改数组某个位置的值,每次修改后输出图中连通块个数。\(n,q\le5\times10^5,1\lea_i\le10^......
  • CF2006A Iris and Game on the Tree
    题目链接题解知识点:贪心,博弈论。一个\(01\)串中\(01,10\)的个数差只与首尾两个字符相关,若首尾字符相同,则个数差为\(0\),否则为\(1\)或\(-1\)。因此,树上除了根节点和叶子节点的\(?\)是不影响叶子节点权值的(但可能影响策略,导致答案不一样),我们只需要考虑叶子节点和根......
  • CF2013 F2
    CF2013F2首先你需要知道F1的做法。我将会给出一个\(O(n\sqrtn)\)的,求出整棵树任意节点答案的方法。对于路径上的点\(p_1\simp_m\),终点\(p_m\),起点\(p_1\),设\(p_i\)所经不在路径上的最远长度为\(d_i\)。那么根据F1的结论,我们是通过移动两个指针\(l,r\),不断判......
  • CF2005C Lazy Narek
    记录dp的设计。一开始设计的是f[i][j]表示最后一个选i,匹配到j的最大值,然而这样转移是\(n^2\)的,题目要求\(n*m\).设计成0,1背包,考虑第i个选择或者不选择即可。#include<bits/stdc++.h>usingnamespacestd;constintN=1e3+11;intf[N][6];intlef[N][6],val[N][6],to[N......
  • CF 1946 F
    一道好题。一定要好好读题,不要看漏。一个非常非常重要的条件是,\(a\)是一个排列。这就说明可能会有调和级数之类的做法了。考虑怎么处理询问\([l,r]\)之类的东西。有一个普遍的思路,就是\(ans=sol(r)-sol(l-1)\),但是我们发现并不适用。因此朴素的\(f_i\)表示\(1\sim......
  • CF2013E prefix gcd
    给n个数,随意排序,所有前缀的gcd的和的最小值。只想到gcd变化是log次的,所以枚举每个作为开头,然后找让gcd变小的接上。可是这样是\(O(n^2)\).注意,最小的数要放最前面。假设\(x,a_1,a_2....\)和\(a_1,a_2,x...\).(x是最小的)我们有\(x+gcd(a_1,x)\leqa_1\),因为gcd的求法是\(a_......
  • CF1239E Turtle 题解
    Description一只乌龟从\(2\timesn\)的棋盘的左上角走到右下角,只能往下或往右,需要给出一种方案来分配\(2n\)个数字使得乌龟走过的路径上的数之和的最大值最小。\(2\leqn\leq25,0\leqa_{1,i},a_{2,i}\leq5\times10^4\)。Solution设\(pre_{i}=\sum_{j=1}^{i}{a_{1,i}......
  • 第31次CCF-CSP认证考试 第一题 坐标变换(其一)满分题解
    第31次CCF-CSP认证考试第一题坐标变换(其一)写在前面的话这道题偏简单,我们废话不多说,直接上代码。老系统的链接:旧系统(不过只有第三十二次以及之前的,第三十三及以后的只能在新系统里提交查看分数)。代码#include<iostream>usingnamespacestd;intmain(){ intn,m; ......
  • CF 231 E Cactus 题解(仙人掌图上找环)
    codeforces提交记录题意有一个点仙人掌图(每个点都只属于至多一个简单环),给出kkk个询问,问点x......
  • 联诚发LCF新加坡ITC云仓启航,国际演艺市场的黑马强势突围!
    在全球范围内,演出市场正经历着前所未有的繁荣。从国际巨星的巡回演唱会到地方文化的艺术节,各类演出活动正吸引着成千上万的观众。特别是在新加坡,这个多元文化的交汇点,演出市场的热情更是高涨。随着经济的复苏和人们对于文化娱乐需求的增加,新加坡的演出市场呈现出供需两旺的局面,为消......