AcWing
  • 首页
  • 活动
  • 题库
  • 竞赛
  • 商店
  • 应用
  • 文章
    • 题解
    • 分享
    • 问答
  • 吐槽
  • 登录/注册

AcWing 3111. 回转寿司(CDQ分治)    原题链接    困难

作者: 作者的头像   Foraino0267 ,  2022-06-09 16:21:18 ,  所有人可见 ,  阅读 40


6


发现都是权值线段树+动态开点的题解,交个短得多的 CDQ 分治(那个::l和::r是不小心变量重名了引用的全局变量)。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+50;
int n;
ll l,r;
int a[N];
ll s[N],w[N];
ll ans;
void merge_sort(int l,int r) {
    if(l==r) return;
    int mid=l+r>>1;
    merge_sort(l,mid),merge_sort(mid+1,r);
    int head=l,tail=l-1;
    for(int i=mid+1;i<=r;++i) {
        while(s[i]-s[tail+1]>=::l&&tail+1<=mid) tail++;
        while(s[i]-s[head]>::r&&head<=mid) head++;
        ans+=tail-head+1;
    }
    int i=l,j=mid+1,cnt=0;
    while(i<=mid&&j<=r) {
        if(s[i]<s[j]) w[++cnt]=s[i++];
        else w[++cnt]=s[j++];
    }
    while(i<=mid) w[++cnt]=s[i++];
    while(j<=r) w[++cnt]=s[j++];
    for(int i=l;i<=r;++i) s[i]=w[i-l+1];
}
int main() {
    scanf("%d%lld%lld",&n,&l,&r);
    for(int i=1;i<=n;++i) scanf("%d",&a[i]),s[i]=s[i-1]+a[i];
    merge_sort(0,n);
    printf("%lld\n",ans);
    return 0;
}

0 评论

你确定删除吗?
1024
x

© 2018-2022 AcWing 版权所有  |  京ICP备17053197号-1
用户协议  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息