首页 > 其他分享 >P7868 VUDU 题解

P7868 VUDU 题解

时间:2022-10-17 21:36:01浏览次数:64  
标签:le frac 题解 sum ge P7868 VUDU include 式子

P7868 VUDU 题解

提供一种不需要使用离散化,从\(0/1\)分数规划的角度推导的思路。然而考试的时候没想到求逆序对挂掉了

分析

题意很清楚了,就是求给出的序列中,对于一段任意长度的连续区间,其元素和的平均数大于等于\(p\)的种数,可以用如下式子来表达:

\[\frac{\sum_{i=l}^{r}a[i]}{r-l+1}\ge p \]

推导方法1

当时写出来这个式子,我一眼\(0/1\)分数规划,\(WhichIsKnownAs\)

\[\frac{\sum_{i=l}^{r}a[i]*x[i]}{\sum_{i=l}^{r}b[i]*x[i]}\ge mid \]

但是这道题只能选连续的一段,所以\(x[i]\)就不存在了

当然如果你不知道\(0/1\)分数规划,也完全没有关系,往下看就是了。

我们把第一个式子里面的\(r-l+1\)想办法变成第二个式子里面的\(b[i]\),通过对比很容易发现,我们假设所有的\(b[i]=1\),那么就有:

\[\frac{\sum_{i=l}^{r}a[i]}{r-l+1}\ge p \iff \frac{\sum_{i=l}^{r}a[i]}{\sum_{i=l}^{r}b[i]}\ge p\iff {\sum_{i=l}^{r}a[i]}-p\times {\sum_{i=l}^{r}b[i]}\ge 0\iff \sum_{i=l}^{r}{(a[i]-p\times b[i])}\ge 0 \]

不要忘了其中\(b[i]=1\),于是上面的式子就最终变成了\(\sum_{i=l}^{r}{(a[i]-p)}\ge 0\)

其中\(a[i],p\)都是定值,于是我们记\(v[i]=a[i]-p\),最终我们就把题意变成了从\(v[i]\)中,选出子段和大于等于\(0\)的方案数

推导方法2

如果您认为上面太麻烦了,那么下面的应该更容易理解了,先回到原来的式子:

\[\frac{\sum_{i=l}^{r}a[i]}{r-l+1}\ge p \]

同样的化化简,移移项:

\[\frac{\sum_{i=l}^{r}a[i]}{r-l+1}\ge p \iff\sum_{i=l}^{r}a[i]-(r-l+1)\times p\ge 0 \]

如何感性理解上式?

注意到有\(r-l+1\)个\(a[i]\)在求和,还要减去\(r-l+1\)个\(p\),即判断\(k\)个数减去\(k\)个\(p\)之后的值,是否非负。

那么我们把每个\(p\)均摊到每一个\(a[i]\)上面,就有了我们用第一种方法推导出的:\(\sum_{i=l}^{r}{(a[i]-p)}\ge 0\)了

引入前缀和

问题来到了如何快速求一段区间和?我们自然地想到了前缀和,用\(sum[r]-sum[l-1]\)快速地求出区间和

我们发现对于每一个\(1\le l\le r\le n\),只要满足\(sum[r]-sum[l-1]\ge 0\),即\([l,r]\)中元素和大于等于\(0\),就一定能对答案产生\(1\)的贡献。

这里随便口胡一个\(sum\)序列:\(0,-1,-3,-6,2,3,1,5\),比如其中\(-1,3\)就可以构成一个答案,表示\([2,5]\)的区间和为\(3-(-1)=4\)

顺序对、逆序对

手玩几组样例就会发现,我们求的其实就是其中顺序对的数量,特别地对于\(l=1\)的情况,\(sum[l-1]=sum[0]=0\),我们也是需要考虑的,它的实际意义就是\([1,r]\)的区间和。

然后我们再倒过来思考一下,就把顺序对转化成了逆序对。

假设我们把前缀和数组倒过来之后,更具体地说:\(l\le r,sum[l]\ge sum[r]\)就是本题中一个符合条件的情况

小细节

注意要开\(long long\)

Code

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
template <typename T>inline void re(T &x) 
{
	x=0;int f=1;
	char c=getchar();
	for(;!isdigit(c);c=getchar()) if(c=='-') f=-f;
	for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+(c^48);
	x*=f;
}
const int maxn=1e6+100;
int n,a[maxn],sum[maxn],p,rec[maxn],ans[maxn];
long long answer;
void merge(int l,int r)
{
	if(l==r)return;
	int mid=(l+r)>>1;
	int i=l,j=mid+1,cnt=l-1;
	merge(l,mid);merge(mid+1,r);
	while(i<=mid&&j<=r)
	{
		if(rec[i]<rec[j])ans[++cnt]=rec[i++];//这个地方一定是<不能是<=
		else ans[++cnt]=rec[j++],answer+=mid-i+1;
	}
	while(i<=mid)
		ans[++cnt]=rec[i++];
	while(j<=r)
		ans[++cnt]=rec[j++];
	for(int i=l;i<=r;i++)rec[i]=ans[i];
}
signed main()
{
	re(n);
	for(register int i=1;i<=n;++i)re(a[i]);
	re(p);
	for(register int i=1;i<=n;++i)a[i]-=p,sum[i]=sum[i-1]+a[i],rec[n-i+1]=sum[i];
	rec[n+1]=sum[0];
	merge(1,n+1);
	printf("%lld",answer);
	return 0;
}
/*
8
3 2 1 7 4 5 6 3
4

22
*/

标签:le,frac,题解,sum,ge,P7868,VUDU,include,式子
From: https://www.cnblogs.com/Hanggoash/p/16800760.html

相关文章

  • CF309E 题解
    11:30,过题。12:50,忘记做法。吃饭时不该看未来日记的,Ynoj害人不浅(确信)。以上为个人吐槽。题目大意不知道题目翻译是个啥。。。但讨论区有大佬给出了精确的翻译。我改得......
  • AcCoders 10692:【2022NOIP联测10 10月17日】交换(swap) 题解
    考虑把一次交换产生的贡献记录在交换的两个数字中较小的那个数字上。则构造一个好的序列的过程可以看成是:按照从小到大的顺序枚举每个数,每次选择将这个数放在序列的左边或......
  • POJ 3760. 魔兽世界(修订版) 题解
    一句话,大模拟,照着题意敲就完了。写的期间甚至因为疫情导致程序被锁在了机房www//3760.魔兽世界(修订版)#include<iostream>#include<cstring>#include<string>u......
  • 【题解】CF11D A Simple Task(状压 DP)
    【题解】CF11DASimpleTask题目链接CF11DASimpleTask题意概述给定一张\(n\)个点\(m\)条边的无向图,无重边自环,点数不超过\(19\),求无向图中环的数量。思路分......
  • [题解] Atcoder Regular Contest ARC 151 A B C D E 题解
    点我看题昨天刚打的ARC,题目质量还是不错的。A-EqualHammingDistances对于一个位置i,如果\(S_i=T_i\),那么不管\(U\)的这个位置填什么,对到\(S\)和\(T\)的海明距离增量......
  • CF463C 题解
    题目传送门题目分析贪心练手好题。首先,国际象棋中象的走法是斜着走,也就是这样:通过上面的图我们不难看出,如果一个象在黑格,另外一个在白格,那么它们之间一定不会互相攻击......
  • P3755 题解
    前言题目传送门!更好的阅读体验?为啥要用分块呀,cdq分治真好写!前置知识:三维偏序模版。思路记\(s_{i,j}\)表示:对角坐标为\((-\infty,-\infty)\)到\((i,j)\)的......
  • CF525E 题解
    前言题目传送门!更好的阅读体验?比较套路的折半搜索。代码实现略微繁琐。思路每个数有三个状态:不选、选\(a_i\)、选\(a_i!\)。数据范围\(n\le26\),暗示着爆搜,但是......
  • CF960E Alternating Tree题解:
    CF960EAlternatingTree题解:也许是第一道自己做的*2300。可简化为树上黑白染色。首先想到树形DP,如果是棵有根树,状态转移方程如下:\[{f[x][0]=f[y][1]+siz[y]*a[x]}\]......
  • P3959 [NOIP2017 提高组] 宝藏 题解
    一道不错的状压dp题。注意到本质上打通的路径会构成一棵树,因此实际上总花费就是一个点的层高(根节点层高为0)乘上其到父亲节点的边的边权。据此可以考虑一种初步的状压......