【洛谷】P2345 [USACO04OPEN] MooFest G

news/2024/11/22 19:33:56/

1:暴力AC( ans += (long long)(max(arr[i].v, arr[j].v) * abs(arr[i].x - arr[j].x));)

#include<iostream>
#include<cmath>
using namespace std;
int n;
struct s
{int v, x;
}arr[20005];
long long ans;
int main()
{cin >> n;for (int i = 1; i <= n; i++)cin >> arr[i].v >> arr[i].x;for(int i=1;i<n;i++)for (int j = i + 1; j <= n; j++){ans += (long long)(max(arr[i].v, arr[j].v) * abs(arr[i].x - arr[j].x));}cout << ans << endl;return 0;
}

2:分治算法

这题其实可以什么数据结构都不用,分治

将数组先按v值排序

然后找到中点mid,左右递归处理

因为v值排过序,所以右边的v值一定大于左边v值

就剩x不好算了

看到绝对值,最简单的方法就是去绝对值符号

所以我们应该枚举右边mid+1到r的区间,找到有哪些x值比当前小,哪些比它大

右边的v值一定大于左边v值,求和乘a[i].v就行了

但是,这又该怎么做呢?

也许左右x值为升序就好做了,这就像求逆序对一样

因此我们再对序列进行归并排序

尽管这会对v值的升序进行破环,但由于中间的划分,所以左右不会混合,前面那个 性质还能保证

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <stdlib.h>
#include <queue>
#include <algorithm>
using namespace std;
int n,i;
long long ans;
struct str{int x,v;
}a[100005],tmp[100005];
bool cmp(str x,str y)
{return x.v<y.v;
}
void cdqdfs(int l,int r)
{if(l>=r)return;int mid=(l+r)/2,ll=l,i;long long s1=0,s2=0;cdqdfs(l,mid);cdqdfs(mid+1,r);for(i=l;i<=mid;i++)s1+=a[i].x;for(i=mid+1;i<=r;i++){while(ll<=mid&&a[ll].x<a[i].x)//ll为划分的中点,其左边都小于a[i].x,右边都大于或等于a[i].x{s2+=a[ll].x;s1-=a[ll].x;ll++;}ans+=(1ll*a[i].x*(ll-l)-s2-1ll*a[i].x*(mid-ll+1)+s1)*a[i].v;}int l1=l,l2=mid+1,k=l-1;while(l1<=mid||l2<=r)//归并排序{if((a[l1].x>a[l2].x||l1>mid)&&l2<=r){tmp[++k]=a[l2];l2++;}else{tmp[++k]=a[l1];l1++;}}for(i=l;i<=r;i++)a[i]=tmp[i];
}
int main(){scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d %d",&a[i].v,&a[i].x);sort(a+1,a+1+n,cmp);cdqdfs(1,n);cout<<ans;
}

over


http://www.ppmy.cn/news/11241.html

相关文章

自定义类型:结构体,枚举,联合(1)

tips 1. 2. 结构基础知识复习 1. 结构是一些值的集合&#xff0c;这些值被称为成员变量&#xff0c;结构的每个成员可以是不同类型的变量。 2. 结构体类型&#xff0c;结构体成员&#xff0c;结构体变量&#xff0c;结构体指针的创建方式 3. 初始化结构体变量的时候&…

Java文件IO操作

目录 一、了解什么是文件 狭义的文件&#xff1a; 广义的文件&#xff1a; 二、文件的路径 ①文件的绝对路径 ②文件的相对路径 三、Java对于文件的操作 File类的构造方法 File类的普通方法 四、对于文件的内容操作 ①FileInputStream&#xff08;文件输入流&#xf…

【计算机视觉】Pooling层的作用以及如何进行反向传播

问题 CNN网络在反向传播中需要逐层向前求梯度,然而pooling层没有可学习的参数,那它是如何进行反向传播的呢? 此外,CNN中为什么要加pooling层,它的作用是什么? Pooling层 CNN一般采用average pooling或max pooling来进行池化操作,而池化操作会改变feature map的大小,…

Esp8266+TFT太空人天气时钟

开源项目&#xff0c;只对动手能力有要求&#xff0c;有现成程序 b站演示视频: https://www.bilibili.com/video/BV1ND4y1W7oS/?spm_id_from333.999.0.0 效果图 模块和接线方法 使用ESP8266-12F模块&#xff0c;4M空间。OLED使用1.3寸IPS 240*240点阵彩屏&#xff0c;ST7789…

接口协议之抓包分析 TCP 协议

TCP 协议是在传输层中&#xff0c;一种面向连接的、可靠的、基于字节流的传输层通信协议。环境准备对接口测试工具进行分类&#xff0c;可以如下几类&#xff1a;网络嗅探工具&#xff1a;tcpdump&#xff0c;wireshark代理工具&#xff1a;fiddler&#xff0c;charles&#xf…

盘点| 能够实现小程序开发提效的框架/工具有这些

近年来&#xff0c;为了研发效率的提升&#xff0c;技术高频革新&#xff0c;开发者们纷纷表示&#xff1a;“好是好&#xff0c;就是快学不动了&#xff01;”。开发者们在不断学习新语言、框架、工具等内容的同时&#xff0c;也在担心所学是否真正有用。而小程序其实能够帮助…

Elasticsearch:运用 Go 语言实现 Elasticsearch 搜索 - 8.x

在我之前的文章 “Elasticsearch&#xff1a;Go 客户端简介 - 8.x”&#xff0c;我对 Elasticsearch golang 客户端做了一个简单的介绍。在今天的这篇文章中&#xff0c;我将详细介绍如何使用这个客户端来一步一步地连接到 Elasticsearch&#xff0c;进而创建索引&#xff0c;搜…

杰卡德相似度(Jaccard)详解及在UserCF中的应用

1、杰卡德相似度(Jaccard) 这个是衡量两个集合的相似度一种指标。 两个集合A和B的交集元素在A&#xff0c;B的并集中所占的比例&#xff0c;称为两个集合的杰卡德相似系数&#xff0c;用符号J(A,B)表示 另一种表示的方法&#xff1a; jaccard系数衡量维度相似性 jaccard系数很…