先上题目:

Sum

Time Limit: 6000/3000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others)
SubmitStatus

Problem Description

给出N,a[1]... a[N],还有M,b[1]... b[M]
long long ans = 0;
for(int i = 1; i <= N; i ++)
    for(int j = 1; j <= M; j ++)
        ans += abs(a[i] - b[j]) * (i - j);

Input

多组数据,每组数据

第一行N,M(1 <= N,M <= 50000)

第二行N个数字,a[1].. a[N]

第三行M个数字,b[1]..b[M]

(1 <= a[i],b[i] <= 10000)

Output

每组数据一行,ans

Sample Input

4 4
1 2 3 4
5 6 7 8

Sample Output

-40

Hint

you may be TLE if 10000 * 10000 per case
SubmitStatus
  
  这一题最简单的思路就是直接枚举,但是这样绝对会TLE,然后稍微优化一下将运算的公式分成两种情况(a[i]>=b[j] || a[i]<b[j]),然后将公式拆开,得到四项,我们可以先预处理出前n项的j,b[j]*j,b[j]的和,然后枚举a[i],求出(a[i]>=b[j] 和 a[i]<b[j])的分界线,然后求两端的和即可。至于求分界线的方法,一种是用lower_bound求,该操作加上枚举a[i]的时间复杂度是O(nlogn),这样经过试验会超时。另外一种方法是用树状数组求,经小伙伴的测试好像也会超时······。
  不会超时的方法是除了对b排序以外对a也排个序,然后预处理出每个a[i]的边界loc[i]。这样做的时间复杂度是O(n),总的时间复杂度是O(nlogn),不会超时。
 
上代码:
 
 /*
* this code is made by sineatos
* Problem: 1174
* Verdict: Accepted
* Submission Date: 2014-08-01 12:08:56
* Time: 2488MS
* Memory: 3240KB
*/
#include <cstdio>
#include <cstring>
#include <utility>
#include <algorithm>
#define MAX 50002
#define ll long long
using namespace std; typedef pair<int,int> pii; pii a[MAX],b[MAX];
int n,m;
ll sumb[MAX],sumbj[MAX],sumj[MAX];
int loc[MAX]; inline ll Sum(int i,int r,int l){
ll sum=;
sum=(ll)a[i].first*a[i].second*(r+-l) - (ll)a[i].first*(sumj[r]-sumj[l-]) -(ll)a[i].second*(sumb[r]-sumb[l-]) + (sumbj[r]-sumbj[l-]);
return sum;
} int main()
{
ll sum;
//freopen("data.txt","r",stdin);
while(scanf("%d %d",&n,&m)!=EOF){
for(int i=;i<=n;i++){
scanf("%d",&a[i].first);
a[i].second=i;
}
for(int i=;i<=m;i++){
scanf("%d",&b[i].first);
b[i].second=i;
}
sort(a+,a+n+);
sort(b+,b+m+);
sumb[]=sumbj[]=sumj[]=;
int k=;
for(int i=;i<=n;i++){
while(k<=m && a[i].first>=b[k].first) k++;
loc[i]=k;
}
for(int i=;i<=m;i++){
sumb[i]=sumb[i-]+b[i].first;
sumbj[i]=sumbj[i-]+(ll)b[i].first*b[i].second;
sumj[i]=sumj[i-]+b[i].second;
}
sum=;
for(int i=;i<=n;i++){
int mid=loc[i];
ll p1=Sum(i,m,mid);
ll p2=Sum(i,mid-,);
sum+=p2-p1;
}
printf("%lld\n",sum);
}
return ;
}

/*Sum*/

ACDream - Sum的更多相关文章

  1. acdream Divide Sum

    Divide Sum Time Limit: 2000/1000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) SubmitSta ...

  2. acdream 1148 GCD SUM 莫比乌斯反演 ansx,ansy

    GCD SUM Time Limit: 8000/4000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) SubmitStatis ...

  3. acdream 1154 Lowbit Sum

    先贴代码,以后再写题解... 首先,直接枚举肯定是会超时的,毕竟n就有10^9那么多... 对于每个数,我们先把它转化为二进制:例:21-->10101: 对于00001~10101,可以分为几 ...

  4. ACdream: Sum

    Sum Time Limit: 2000/1000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) SubmitStatisticN ...

  5. acdream 1431 Sum vs Product

    Sum vs Product Time Limit: 4000/2000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) Submi ...

  6. ACdream 1431——Sum vs Product——————【dfs+剪枝】

    Sum vs Product Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others) S ...

  7. ACDream - Power Sum

    先上题目: Power Sum Time Limit: 20000/10000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) S ...

  8. ACDream - Lowbit Sum

    先上题目: C - Lowbit Sum Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others ...

  9. ACdream 1154 Lowbit Sum (数位DP)

    Lowbit Sum Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) SubmitSt ...

随机推荐

  1. 详细解析Linux scp命令的应用(转载)

    转自:http://os.51cto.com/art/201003/187301.htm Linux scp命令用于Linux之间复制文件和目录,具体如何使用这里好好介绍一下,从本地复制到远程.从远程 ...

  2. codevs3370 选学霸(背包dp,并查集)

    3372 选学霸  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master     题目描述 Description 老师想从N名学生中选M人当学霸,但有K对人实力相 ...

  3. 接口管理功能全面增强!EOLINKER EPC 5.0.9版本更新:支持LDAP用户系统、加入更多项目统计图表、强化测试/自动化测试功能等

    EOLINKER EPC(Enterprise Private Cloud 企业私有云产品)已于近期发布5.0.9版本:界面全面改版.支持LDAP用户系统.加入更多项目统计图表.强化测试/自动化测试功 ...

  4. CDH5.7Hadoop集群搭建(离线版)

    用了一周多的时间终于把CDH版Hadoop部署在了测试环境(部分组件未安装成功),本文将就这个部署过程做个总结. 一.Hadoop版本选择. Hadoop大致可分为Apache Hadoop和第三方发 ...

  5. IIS Express配置多站点同时运行

    环境:Win10 Pro.Visual Studio 2015 Community.IIS Express 10 VS2015集成IIS Express,所以无需单独下载, 默认安装位置:C:\Pro ...

  6. lua_string_pattern

    两大特点: 1. string库中所有的字符索引从前往后是1,2,...;从后往前是-1,-2,... 2. string库中所有的function都不会直接操作字符串,而是返回一个新的字符串. 库函 ...

  7. C# 多线程系列(六)

    同步 当多个线程共享一些数据的时候,我们就需要使用同步技术,确保一次只有一个线程访问合改变共享状态.注意,同步问题与争用和死锁有关. 例: ; static void Add() { ; i < ...

  8. html5——应用缓存

    基本概念 1.HTML5中我们可以轻松的构建一个离线(无网络状态)应用,只需要创建一个cache manifest文件 2.可配置需要缓存的资源,网络无连接应用仍可用,本地读取缓存资源,提升访问速度, ...

  9. ddrmenu

    <%@ Register TagPrefix="dnn" TagName="MENU" Src="~/DesktopModules/DDRMen ...

  10. Memcached 之PHP实现服务器集群一致性hash算法

    /** * memcached 一致性hash,分布式算法 * Class MemcacheCluster */ class MemcacheCluster { protected $nodes = ...