首页 > 其他分享 >CF1051G Distinctification题解

CF1051G Distinctification题解

时间:2023-07-25 09:23:50浏览次数:46  
标签:Distinctification val rs int 题解 sum CF1051G ls 区间

link

首先可以发现,题目给定的两种操作为我们提供了“反悔机制”,所以有:

结论 \(1\):即任何一个可以到达的局面都能到达最优解。

利用这个结论,首先我们先去重。

继续提炼性质,与相差不到 \(1\) 的数为基准 \(+1\) 与 \(-1\) 操作,将这个数的变化范围限制在了一个区间,并且这个区间的数能够互换位置。所以我们按区间来考虑,利用上面的结论,可以将一个区间的数先全部放到最左边,在当前局面下,显然让 \(B_i\) 小的往右移动更优,那么得到:

结论 \(2\):对于一个区间,使 \(b\) 递减最优。

同时容易得到:

结论 \(3\):最终答案为 $ {\textstyle \sum_{}^{}(A_i'-A_i)\cdot B_i} ={\textstyle \sum_{}^{}A_i'\cdot B_i-A_i\cdot B_i}$

后者直接算,于是我们只需要维护一个区间的前者,并且能区间合并就行了,可以用线段树合并与并查集维护。

再说一下线段树怎么维护答案。,以 \(b\) 作为线段树的下标,考虑一个区间的答案怎样得到:
因为左区间的 \(B\) 小于右区间,需要交换左右区间,交换了之后的右区间的答案就是它这个子区间的答案,而左区间由于向右移动了,除了原本子区间的答案,还需要加上右区间的数对个数乘上左区间的 \(B\) 之和。

code:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream>
#include<vector>
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define rpe(i,x) for(int i=_he[x];i;i=_ne[i])
#define mp(a,b) make_pair(a,b)
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
typedef long double LD;
const int N=4e5+10;
const double pi=acos(-1);

int n,a[N],b[N],c[N];
int _fa[N];
void _init(){rep(i,1,N-2)_fa[i]=i;}
int get(int x){return _fa[x]==x?x:_fa[x]=get(_fa[x]);}

int ls[25*N],rs[25*N],rt[N],node;

struct stree{
	LL sum,val;
	int sz;
}t[25*N];
void pushup(int p)
{
	t[p].sz=t[ls[p]].sz+t[rs[p]].sz;
	t[p].sum=t[ls[p]].sum+t[rs[p]].sum;
	t[p].val=t[ls[p]].val+t[rs[p]].val+t[ls[p]].sum*t[rs[p]].sz;
}
void change(int &p,int l,int r,int x)
{
	if(!p)p=++node;
	if(l==r)t[p].sum=t[p].val=x,t[p].sz=1;
	else
	{
		int mid=l+r>>1;
		x<=mid?change(ls[p],l,mid,x):change(rs[p],mid+1,r,x);
		pushup(p);
	}
}
int merge(int x,int y,int l,int r)
{
	if(!x||!y)return x|y;
	int mid=l+r>>1;
	ls[x]=merge(ls[x],ls[y],l,mid),rs[x]=merge(rs[x],rs[y],mid+1,r);
		
	if(!ls[x]&&!rs[x])t[x].sz+=t[y].sz,t[x].sum+=t[y].sum,t[x].val+=t[y].val;
	else pushup(x);
	return x;
}
LL calc(int x){return t[rt[x]].val+t[rt[x]].sum*(x-1);}
LL ans;
void mer(int x,int y)
{
	_fa[y=get(y)]=(x=get(x));
	ans-=calc(x)+calc(y);
	rt[x]=merge(rt[x],rt[y],1,n);
	ans+=calc(x);
}

bool fl[N];
int main()
{
	scanf("%d",&n);
	_init();
	rep(i,1,n)
	{
		scanf("%d%d",&a[i],&b[i]);
		c[i]=get(a[i]);
		_fa[c[i]]=c[i]+1;
		change(rt[c[i]],1,n,b[i]);
	}
	_init();
	rep(i,1,n)
	{
		ans+=calc(c[i]);
		if(fl[c[i]-1])mer(c[i]-1,c[i]);
		if(fl[c[i]+1])mer(c[i],c[i]+1);
		fl[c[i]]=1;
		ans-=1ll*a[i]*b[i];
		printf("%lld\n",ans);
	}	
	return 0;
}

标签:Distinctification,val,rs,int,题解,sum,CF1051G,ls,区间
From: https://www.cnblogs.com/onlycre/p/17578850.html

相关文章

  • 题解 Codeforces Round 887 (Div 1+Div 2) / CF1853AB,CF1852ABCD
    下大分!悲!Div1只过了1A!!!但还是补完整场Div2吧。A.Desortinghttps://codeforces.com/problemset/problem/1853/Aproblem用操作:\([1,i]++,[i+1,n]--\),使得数组不单调不降,求最小操作次数。\(n\leq10^5\)。solution操作等同于在差分数组上选出\(i\),做\(c_1:=c_1+1,c_i:......
  • UOJ #284. 快乐游戏鸡题解(长链剖分+单调栈合并)
    UOJ#284.快乐游戏鸡题解(长链剖分+单调栈合并)题面一番战斗之后,程序猿被计算鸡们赶走了。随着垫子计算鸡一声令下:“追!”,于是计算鸡村全村上下开始乘胜追击。计算鸡们希望在新的一年到来之际给程序猿以重创,出掉这一年的恶气。可是程序猿一追就走,一走就跑,一跑就无影无踪。计算鸡......
  • 洛谷CF1738C题解
    好一道博弈论水题题目传送门更好的食用体验题目大意:给定长度为$n$的数列$a_1,a_2,\dots,a_n$,两名玩家Alice、Bob依次以最优策略从数列中取走一个数,Alice先取,直至为空博弈结束。若Alice取走的所有数之和为偶,Alice胜利;若Alice取走的所有数之和为奇,Bob胜利......
  • 【题解】Imbalanced Arrays - Codeforces 1852B
    出处:CodeforcesRound887链接:https://codeforces.com/problemset/problem/1852/B题目大意:给定一个包含\(n\)个非负整数的频次序列\(f\)。构造任意一个等长的整数序列\(b\),要求①\(b\in[-n,n]\)but$b\neq0$②\(b\)中不存在相反数③对于每个坐标\(i\)......
  • 【P8302 题解】
    Solution设\(g(x)\)表示\(x\)的最小质因子。则\(f(x)=n+\dfrac{n}{g(x)}=\dfrac{g(x)+1}{g(x)}\timesn\)。分情况讨论:\(g(x)=2\),经过\(1\)次变换之后,\(f(x)\)增加了一个因子\(3\),减少了一个因子\(2\)。\(g(x)>2\),则满足\(g(x)\nmid2\),否则与最小质因子矛盾,......
  • 【题解】Ntarsis' Set - Codeforces 1852A
    出处:CodeforcesRound887链接:https://codeforces.com/problemset/problem/1852/A题目大意:给定一个包含\(n\)个正整数的表示删除位置的严格升序序列\(p\),以及另外一个连续正整数的被删除的无穷序列\(l\)。进行\(k\)次删除操作,每次操作从无穷序列\(l\)中同时删除位......
  • Codeforces Round 887 (Div. 1) 题解
    https://codeforces.com/contest/1852/problemsA.Ntarsis'Sethttps://codeforces.com/contest/1852/problem/A感觉不是很一眼。\(n\)和\(k\)都是\(2\times10^5\),不能暴力,设当前集合为\({1,2,\dots,10^{1000}}\),那么被操作过一次的最小值就应该是\(\text{MEX}(0,......
  • 国标GB28181视频平台LntonGBS(含源码)国标视频平台播放视频时偶尔出现播放失败的问题解
    LntonGBS是基于公安部推出的安防主流协议(国标GB28181协议)的视频接入、处理及分发平台,具有视频直播监控、云端录像、云存储、检索回放、智能告警、语音对讲等功能,能够涵盖所有监控领域的视频能力需求,已经在大量的项目中落地应用,如明厨亮灶、平安乡村、雪亮工程等。有用户反馈,在某项......
  • P7831 题解
    problem&blog。妙妙题。单杀了,来写篇题解。下文中\(ans_u\)表示从\(u\)点出发的答案。考虑直接做。发现更新任何一个点,都可能会对一堆点造成影响,\(O(n^2)\)无法接受。一些简单的性质:不能进入一个环的\(ans_u=-1\)。否则,对于\((u,v,r,p)\),\(r\)是最大的\(r\),那么只......
  • AT_abc218_d 题解
    洛谷链接&Atcoder本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读。题目简述给定一个平面内的\(N\)个点的坐标,求这\(N\)个点中选\(4\)个点可构成正方形的方案数。注:构成的正方形的边需平行于\(x\)轴或\(y\)轴。例如下图就不符合要求,则不考虑这种情况:......