提供一种不需要使用离散化,从分数规划的角度推导的思路。然而考试的时候没想到求逆序对挂掉了
题意很清楚了,就是求给出的序列中,对于一段任意长度的连续区间,其元素和的平均数大于等于的种数,可以用如下式子来表达:
当时写出来这个式子,我一眼分数规划,
但是这道题只能选连续的一段,所以就不存在了
当然如果你不知道分数规划,也完全没有关系,往下看就是了。
我们把第一个式子里面的想办法变成第二个式子里面的,通过对比很容易发现,我们假设所有的,那么就有:
不要忘了其中,于是上面的式子就最终变成了
其中都是定值,于是我们记,最终我们就把题意变成了从中,选出子段和大于等于的方案数
如果您认为上面太麻烦了,那么下面的应该更容易理解了,先回到原来的式子:
同样的化化简,移移项:
如何感性理解上式?
注意到有个在求和,还要减去个,即判断个数减去个之后的值,是否非负。
那么我们把每个均摊到每一个上面,就有了我们用第一种方法推导出的:了
问题来到了如何快速求一段区间和?我们自然地想到了前缀和,用快速地求出区间和
我们发现对于每一个,只要满足,即中元素和大于等于,就一定能对答案产生的贡献。
这里随便口胡一个序列:,比如其中就可以构成一个答案,表示的区间和为
手玩几组样例就会发现,我们求的其实就是其中顺序对的数量,特别地对于的情况,,我们也是需要考虑的,它的实际意义就是的区间和。
然后我们再倒过来思考一下,就把顺序对转化成了逆序对。
假设我们把前缀和数组倒过来之后,更具体地说:就是本题中一个符合条件的情况
注意要开
| #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; |
| } |
| |
| |
| |
| |
| |
| |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效