luogu P3819 松江1843路

题目描述

涞坊路是一条长L米的道路,道路上的坐标范围从0到L,路上有N座房子,第i座房子建在坐标为x[i]的地方,其中住了r[i]人。

松江1843路公交车要在这条路上建一个公交站,市政府希望让最多的人得到方便,因此希望所有的每一个的居民,从家到车站的距离的总和最短。

公交站应该建在哪里呢?

输入输出格式

输入格式:

第一行输入L、N。

接下来N行,每行两个整数x[i]和r[i]。

输出格式:

一个整数,最小的每个人从家到车站的距离的总和。

输入输出样例

输入样例#1:

100 3
20 3
50 2
70 1

输出样例#1:

110

输入样例#2:

100 2
0 1
100 10

输出样例#2:

100

输入样例#3:

10000000000 5
3282894320 391
4394338332 929
6932893249 181
7823822843 440
9322388365 623

输出样例#3:

5473201404068

说明

样例解释1

当建在坐标40的时候,所有人距离车站的距离总和为 |20−40|×3+|50−40|×2+|70−40|×1=110。

数据范围和约定

对于10%的数据,1≤N≤50,R[i]=1。

对于30%的数据,1≤N≤100,R[i]≤10,1≤L≤1000。

对于70%的数据,1≤N≤1000,R[i]≤100,1≤L≤10^6。

对于全部数据,1≤L≤10^10,1≤N≤10^5,0≤x[i]≤L,1≤r[i]≤1000

这题不难

易证最有节点一定在房子处(自己yy)

将其按照坐标排序

最优home坐标处于总人数的中位数处

#include<cstdio>
#include<algorithm>
using namespace std;

#define LL long long

struct miku{
    LL w,l;
    bool operator < (const miku & a)const{
        return l < a.l;
    }
} a[100008];
LL tot;
LL n,len;

int main()
{
    scanf("%lld%lld",&len,&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld%lld",&a[i].l,&a[i].w);tot+=a[i].w;
    }
    sort(a+1,a+n+1);

    tot=(tot+1)>>1;
    LL tmp=0,mid=0,ans=0;

    for(int i=1;i<=n;i++)
    {
        tmp+=a[i].w;
        if(tmp>=tot){mid=i;break;}
    }
    for(int i=1;i<=n;i++)
    {
        ans+=abs(a[i].l-a[mid].l)*a[i].w;
    }
    printf("%lld\n",ans);
    return 0;
}
时间: 2024-10-05 03:26:08

luogu P3819 松江1843路的相关文章

P3819 松江1843路(洛谷月赛)

P3819 松江1843路 题目描述 涞坊路是一条长L米的道路,道路上的坐标范围从0到L,路上有N座房子,第i座房子建在坐标为x[i]的地方,其中住了r[i]人. 松江1843路公交车要在这条路上建一个公交站,市政府希望让最多的人得到方便,因此希望所有的每一个的居民,从家到车站的距离的总和最短. 公交站应该建在哪里呢? 输入输出格式 输入格式: 第一行输入L.N. 接下来N行,每行两个整数x[i]和r[i]. 输出格式: 一个整数,最小的每个人从家到车站的距离的总和. 输入输出样例 输入样例#1

P3819 松江1843路

题目描述 涞坊路是一条长L米的道路,道路上的坐标范围从0到L,路上有N座房子,第i座房子建在坐标为x[i]的地方,其中住了r[i]人. 松江1843路公交车要在这条路上建一个公交站,市政府希望让最多的人得到方便,因此希望所有的每一个的居民,从家到车站的距离的总和最短. 公交站应该建在哪里呢? 输入输出格式 输入格式: 第一行输入L.N. 接下来N行,每行两个整数x[i]和r[i]. 输出格式: 一个整数,最小的每个人从家到车站的距离的总和. 输入输出样例 输入样例#1: 100 3 20 3 5

AC日记——松江1843路 洛谷七月月赛

松江1843路 思路: 三分: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 #define ll long long struct DataType { ll pi,val,sumval,sumpi; bool operator<(const DataType pos)const { return pi<pos.pi; } }; struct DataType ai[maxn]; ll

【Luogu】P1613 跑路

[Luogu]P1613 跑路 一.题目 题目描述 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资,小A买了一个十分牛B的空间跑路器,每秒钟可以跑2^k千米(k是任意自然数).当然,这个机器是用longint存的,所以总跑路长度不能超过maxlongint千米.小A的家到公司的路可以看做一个有向图,小A家为点1,公司为点n,每条边长度均为一千米.小A想每天能醒地尽量晚,所以让你帮他算算,他最少需

【luogu P1613】跑路

https://www.luogu.org/problem/show?pid=1613 看到2k就能想到倍增.用一个数组avai[i][j][k]表示点i与点j是否存在长2k的路径,则可以递推出avai[i][j][k]=any{avai[i][v][k-1]&avai[v][j][k-1]},初始值avai[i][i][0]=true.如果avai[i][j][k]==true,则在i点与j点加一条长1的路径.最后BFS或者直接Floyd跑一遍最短路径就可以了. #include <ios

【luogu P2939 [USACO09FEB]改造路Revamping Trails】 题解

题目链接:https://www.luogu.org/problemnew/show/P2939 本来说是双倍经验题,跟飞行路线一样的,结果我飞行路线拿deque优化SPFA过了这里过不了了. 所以多学一种优先队列优化. #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define ll long lon

【Luogu】P1613跑路(倍增+Floyd)

题目链接在此 其实我看到这道题一点想法都没有 设f[i][j][k]表示用2i秒能不能从j走到k.如果可以,那j到k就可以一秒走到,它们的路径长度就是1.方程为f[i][j][k]=f[i-1][j][l]&&f[i-1][l][k]. 最后在图上跑一遍Floyd.复杂度O(n3). 代码如下 #include<cstdio> #include<cstdlib> #include<cctype> #include<cstring> inlin

Luogu [USACO08OPEN]寻宝之路Clear And Present Danger

题目描述 Farmer John is on a boat seeking fabled treasure on one of the N (1 <= N <= 100) islands conveniently labeled 1..N in the Cowribbean Sea. The treasure map tells him that he must travel through a certain sequence A_1, A_2, ..., A_M of M (2 <=

detail

<!DOCTYPE html> <html> <head> <title>details</title> <style type="text/css"> a { text-decoration: none; color: #000; cursor: pointer; } .node_infor{ font-size: 13px !important; } .hdetail_main { padding:5px; p