AcWing 模板题 - 802 区间和

假定有一个无限长的数轴,数轴上每个坐标上的数都是0。

现在,我们首先进行 n 次操作,每次操作将某一位置x上的数加c。

接下来,进行 m 次询问,每个询问包含两个整数l和r,你需要求出在区间[l, r]之间的所有数的和。

输入格式
第一行包含两个整数n和m。

接下来 n 行,每行包含两个整数x和c。

再接下里 m 行,每行包含两个整数l和r。

输出格式
共m行,每行输出一个询问中所求的区间内数字和。

数据范围
−109≤x≤109,
1≤n,m≤105,
−109≤l≤r≤109,
−10000≤c≤10000
输入样例:
3 3
1 2
3 6
7 5
1 3
4 6
7 8
输出样例:
8
0
5

#include <stdio.h>
void quicksort(int a[],int b[],int lo,int hi);
int findleftk(int a[],int lo,int hi,int k);     //二分查找 重复元素最左侧的一个
int findrightk(int a[],int lo,int hi,int k);
int main(){
    int n,m,i,j,k,p,q;
    scanf("%d %d",&n,&m);
    int a[n],b[n],sum[n];	//a[]存下标 b[]存数值
    for(i=0;i<n;i++) scanf("%d %d",&a[i],&b[i]);
    quicksort(a,b,0,n);
    sum[0]=b[0];
    for(i=1;i<n;i++) sum[i]=sum[i-1]+b[i];
    for(i=0;i<m;i++){
        scanf("%d %d",&p,&q);
        j=findleftk(a,0,n,p);   //先二分查找
        k=findrightk(a,0,n,q);
    
    if(j<=k) printf("%d\n",sum[k]-sum[j]+b[j]);
    else printf("0\n");
    
    //暴力求和会超时 用前缀和来求
    // sum=0;
    // for(j=0;j<n;j++){
    //     if(a[j]>=p && a[j]<=q) sum+=b[j];
    // }
    // printf("%d\n",sum);
    
}
return 0;
}
int findleftk(int a[],int lo,int hi,int k){
    if(hi-lo<=2){
        if(a[lo]>=k) return lo;
        else if(a[lo+1]>=k) return lo+1;
        else return lo+2;
    }
    else{
        int mid=(lo+hi)/2;
        if(a[mid]<k) return findleftk(a,mid+1,hi,k);
        else return findleftk(a,lo,mid+1,k);
    }
}
int findrightk(int a[],int lo,int hi,int k){
    if(hi-lo<=2){
        if(a[lo+1]<=k) return lo+1;
        else if(a[lo]<=k) return lo;
        else return lo-1;
    }
    else{
        int mid=(lo+hi)/2;
        if(a[mid]>k) return findrightk(a,lo,mid,k);
        else return findrightk(a,mid,hi,k);
    }
}
void quicksort(int a[],int b[],int lo,int hi){
    int n=hi-lo,i=lo,j=hi-1;
    if(n<=1) return;
    else{
        int t=a[lo],p=b[lo];
        while(i<j){
            while(i<j && a[j]>t) j--;
            if(i<j){
                a[i]=a[j];
                b[i++]=b[j];
            }
            while(i<j && a[i]<t) i++;
            if(i<j){
                a[j]=a[i];
                b[j--]=b[i];
            }
        }
        a[i]=t;
        b[i]=p;
        quicksort(a,b,lo,i);
        quicksort(a,b,i+1,hi);
    }
}
"sgmediation.zip" 是一个包含 UCLA(加利福尼亚大学洛杉矶分校)开发的 sgmediation 插件的压缩包。该插件专为统计分析软件 Stata 设计,用于进行中介效应分析。在社会科学、心理学、市场营销等领域,中介效应分析是一种关键的统计方法,它帮助研究人员探究变量之间的因果关系,尤其是中间变量如何影响因变量与自变量之间的关系。Stata 是一款广泛使用的统计分析软件,具备众多命令用户编写的程序来拓展其功能,sgmediation 插件便是其中之一。它能让用户在 Stata 中轻松开展中介效应分析,无需编写复杂代码。 下载并解压 "sgmediation.zip" 后,需将解压得到的 "sgmediation" 文件移至 Stata 的 ado 目录结构中。ado(ado 目录并非“adolescent data organization”缩写,而是 Stata 的自定义命令存放目录)目录是 Stata 存放自定义命令的地方,应将文件放置于 "ado\base\s" 子目录下。这样,Stata 启动时会自动加载该目录下的所有 ado 文件,使 "sgmediation" 命令在 Stata 命令行中可用。 使用 sgmediation 插件的步骤如下:1. 安装插件:将解压后的 "sgmediation" 文件放入 Stata 的 ado 目录。如果 Stata 安装路径是 C:\Program Files\Stata\ado\base,则需将文件复制到 C:\Program Files\Stata\ado\base\s。2. 启动 Stata:打开 Stata,确保软件已更新至最新版本,以便识别新添加的 ado 文件。3. 加载插件:启动 Stata 后,在命令行输入 ado update sgmediation,以确保插件已加载并更新至最新版本。4
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值