acdream1174 合并同类项

这题说的是

给出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); NM【1,50000】 快熟计算出ans 3 秒 当画出这个乘法表后救就会发现 将b[i] 合并,然后合并完同类项就可以做了 效率 mlogn 使用stl的二分还不行卡常数太不合理了

#include <iostream>
#include <cstdio>
#include <string.h>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
const int max_n =100005;
struct point{
    int v,num;
    point(ll a=0, ll b=0){
      v=a; num=b;
    }
    bool operator <(const point A)const {
      return v<A.v||(v==A.v&&num<A.num);
    }
}P[max_n];
int n,m;
int B[max_n],A[max_n],K[max_n];
ll perAsum[max_n],perAnum[max_n],perAper[max_n];
int binser(int n, int v){
      int L=0, R =n;
      while(L<R){
        int mid = (L+R)/2;
        if(K[mid]<=v) L=mid+1;
        else R=mid;
      }
      return L;
}
int main()
{
     ll two=2,one =1;
     int cas=0;
      /*freopen("data.in","r",stdin);
        freopen("data.out","w",stdout);
    */while(scanf("%d%d",&n,&m)==2){
          int V;
          ll num=one*(n-1)*n/two;
         for(int i=0; i<n; ++i){
              scanf("%d",&V);
              A[i]=V;
              P[i]=point(V,i);
         }
         for(int i=0; i<m; ++i)
            scanf("%d",&B[i]);
         ll colu=0,per=0;
         for(int i =0; i<n; i++){
             colu=colu+one*A[i]*i;
             per=per+A[i];
         }
         ll ans=0;
         for(int i=0; i<m; ++i){
             ans = ans+ colu;
             colu= colu - per;
             ans = ans - one*B[i]*num;
             num = num - n;
         }
         sort(P,P+n);
         perAnum[0]=P[0].num;
         perAsum[0]=one*P[0].v*P[0].num;
         perAper[0]=P[0].v;
         K[0]=P[0].v;
         for(int i=1; i<n; ++i){
             perAnum[i] = perAnum[i-1]+P[i].num;
             perAsum[i] = perAsum[i-1]+one*P[i].num*P[i].v;
             perAper[i] = perAper[i-1]+P[i].v;
             K[i]=P[i].v;
         }
         for(int i=0; i<m; ++i){
             int loc = binser(n,B[i]);
             if(loc<=0)continue;
             loc-=1;
             ll perA = perAsum[loc]-perAper[loc]*i;
             ll perB = B[i]*(perAnum[loc]-one*(loc+1)*i);
             ans = ans - ( perA-perB )*two;
         }
          printf("%I64d\n",ans);
    }
    return 0;
}

时间: 2024-10-18 08:44:02

acdream1174 合并同类项的相关文章

GridView如何合并同类项

/// <summary>     /// 合并GridView中某列相同信息的行(单元格)     /// </summary>     /// <param name="GridView1">GridView</param>     /// <param name="cellNum">第几列</param>     public static void GroupRows(GridView

excel合并同类项去重求和功能

参考:百度经验 主要利用函数为:sumif(range,criteria,[sum_range]) Range:条件区域,用于条件判断的单元格区域. Criteria:求和条件,由数字.逻辑表达式等组成的判定条件. Sum_range:实际求和区域,需要求和的单元格.区域或引用.当省略第三个参数时,则条件区域就是实际求和区域.

CSS的样式合并与模块化

by zhangxinxu from http://www.zhangxinxu.com 原文地址:http://www.zhangxinxu.com/wordpress/?p=931 一.引言 本文的核心观点为CSS的合并与模块化,似乎与前一篇文章“CSS样式的再分离”有矛盾,其实不然,分离可以精简CSS代码,合并也可以精简CSS代码,一切都是权衡!或是说是在恰当的情况下使用恰当的手段. 正如前文所提到的,分离可以精简CSS,但是同时会带来巨大的HTML代码的开销,显然,对所有的样式进行再分离

word2vec skip-gram系列2

CBOW和Skip-gram模型 word2vec有两个模型,分别是CBOW和Skip-gram模型.这两个模型又都可以有两种优化方法.分别是 Hierarchical Softmax与Negative Sampling .所以实现word2vec有四种方式: 2013年末,Google发布的word2vec引起了一帮人的热捧.在大量赞叹word2vec的微博或者短文中,几乎都认为它是深度学习在自然语言领域的一项了不起的应用,各种欢呼"深度学习在自然语言领域开始发力了".但实际上,简单

机器学习笔记:形象的解释神经网络激活函数的作用是什么?

此文转自知乎,哈工大NLPer 忆臻 原出处:https://zhuanlan.zhihu.com/p/25279356 查阅资料和学习,大家对神经网络中激活函数的作用主要集中下面这个观点: 激活函数是用来加入非线性因素的,解决线性模型所不能解决的问题. 下面我分别从这个方面通过例子给出自己的理解~ @lee philip@颜沁睿俩位的回答已经非常好了,我举的例子也是来源于他们,在这里加入了自己的思考,更加详细的说了一下~ 开讲~ 首先我们有这个需求,就是二分类问题,如我要将下面的三角形和圆形点

牛客网

百度2017春招笔试真题编程题集合 1.买帽子 思路:直接排序数出第三个即可 1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 #include <algorithm> 5 6 using namespace std; 7 8 int main() 9 { 10 int n; 11 int count = 1; 12 13 cin >> n; 14 vector<

初三知识点

一元一次方程 1.一元一次方程:只含有一个未知数,并且未知数的次数是1,并且含未知数项的系数不是零的整式方程是一元一次方程. 2.一元一次方程的标准形式:ax+b=0(x是未知数,a.b是已知数,且a≠0). 3.一元一次方程解法的一般步骤:整理方程 -- 去分母 -- 去括号 -- 移项 -- 合并同类项 -- 系数化为1 -- (检验方程的解). 4.列一元一次方程解应用题: (1)读题分析法:---- 多用于"和,差,倍,分问题" 仔细读题,找出表示相等关系的关键字,例如:&qu

[题解]洛谷比赛『期末考后的休闲比赛2』

[前言] 这场比赛已经结束了有几天,但我各种忙,虽然AK但还是没来得及写题解.(我才不会告诉你我跑去学数据结构了) T1 区间方差 (就不贴题好了) 首先可以推公式(我们可以知道,线段树然而并不能通过初中学过的方差公式在log(L)内求出方差): (s2表示方差,L表示区间长度,xi表示区间的每一项,最后一个x上画了一根线表示这些数据的平均数) 用二项式定理完全平方公式可得: 再次展开: 另外,再代入以下这个 得到了: 然后继续吧.. 然后duang地一声合并同类项,于是我们得到了: 然后可以高

主成分分析(PCA)原理总结

主成分分析(Principal components analysis,以下简称PCA)是最重要的降维方法之一.在数据压缩消除冗余和数据噪音消除等领域都有广泛的应用.一般我们提到降维最容易想到的算法就是PCA,下面我们就对PCA的原理做一个总结. 1. PCA的思想 PCA顾名思义,就是找出数据里最主要的方面,用数据里最主要的方面来代替原始数据.具体的,假如我们的数据集是n维的,共有m个数据$(x^{(1)},x^{(2)},...,x^{(m)})$.我们希望将这m个数据的维度从n维降到n'维