【水水水】【洛谷 U4566】赛车比赛

本文解析洛谷U4566赛车问题,通过预处理每辆车的位置和速度信息,利用线段树数据结构计算出所有可能发生的超车总数。适用于算法竞赛中的动态规划与数据结构题目。

题目背景

kkk在赛车~

题目描述

现在有N辆赛车行驶在一条直线跑道(你可以认为跑道无限长)上。它们各自以某种速度匀速前进,如果有两辆车A车和B车,A车在B车的后面,且A车的速度大于B车的速度,那么经过一定的时间后,A车必定会超过B车,这称为一次超车。求超车总数。道路起点的位置为0,没有两辆车的初始位置相同。

输入输出格式

输入格式:
第一行,一个数n,车辆的总数。

第二行~第n+1行,为n辆车的信息,每行有两个正整数x,y。X为起始位置,y为速度。0小于x,y<=1000000

输出格式:
超车总数

输入输出样例

输入样例#1:
2
5 6
2 8
输出样例#1:
1
说明

n最大30W

【题目链接】:https://www.luogu.org/problem/show?pid=U4566

【题解】

五中的一个小学弟问我的。。
预处理出每个位置的车的编号i,存在h数组中;
记录每辆车的信息在x[i],v[i]中;
枚举0->100W位置i;
直接在线段树中返回速度区间在0..v[h[i]]-1的车的数量;
累加进答案;
然后在线段树中递减v[h[i]]这个节点;
(线段树单节点更新);
这样可以保证我们询问的时候返回的速度都是在后面的车的速度;

【完整代码】

#include <cstdio>
#include <iostream>
#include <algorithm>
#define LL long long

using namespace std;

const int MAX = 1000009;
const int MAXN = 300009;

int pre[MAX];
int x[MAXN],y[MAXN],sum[MAX<<2]= {0};
int h[MAX];

void updata(int c,int pos,int l,int r,int rt)
{
    if (l==r)
    {
        sum[rt]+=c;
        return;
    }
    int m = (l+r)>>1;
    if (pos <=m)
        updata(c,pos,l,m,rt<<1);
    else
        updata(c,pos,m+1,r,rt<<1|1);
    sum[rt] = sum[rt<<1]+sum[rt<<1|1];
}

LL query(int L,int R,int l,int r,int rt)
{
    if (L <= l && r<= R)
        return sum[rt];
    int m = (l+r)>>1;
    LL temp1 = 0,temp2 = 0;
    if (L <= m)
        temp1+=query(L,R,l,m,rt<<1);
    if (m < R)
        temp2+=query(L,R,m+1,r,rt<<1|1);
    return temp1+temp2;
}

int main()
{
    //freopen("F:\\rush.txt","r",stdin);
    int n;
    scanf("%d",&n);
    for (int i =1;i <= n;i++)
    {
        scanf("%d%d",&x[i],&y[i]);
        h[x[i]] = i;
        updata(1,y[i],0,MAX-9,1);
    }
    LL ans = 0;
    for (int i = 0;i <= MAX-9;i++)
        if (h[i])
        {
            int v = y[h[i]];
            ans += query(0,v-1,0,MAX-9,1);
            updata(-1,v,0,MAX-9,1);
        }
    cout << ans<<endl;
    return 0;
}

转载于:https://www.cnblogs.com/AWCXV/p/7632066.html

详细功能列举: <br> 1.实时显示哪在用户在线,会员关闭网页自动退出功能,可显示用户采用什么浏览器和操作系统,彻底杜绝一帐号多用户使用 <br> 2.增加了网站投票功能 <br> 3.采用双网站联盟,用户可以选择介绍客户赚佣金或介绍客户赚看片资源。 <br> 4.扣点功能,每一部影片站长可以按照他的价值设定需要扣取的点数 <br> 5.后台增加网吧IP功能,在该网吧上网的用户可以免注册免付费看电影 <br> 6.使用充值卡的用户无需要注册激活充值卡后就可以使用 <br> 7.用户自助赚点功能,用户注册后可以获取一段代码,可以对电影网站进行宣传.每带来一个用户访问宣传用户就可以获得(1点[扣点用户]/0.2天[包月用户或游客]) <br> 8.来路分析,可以看到网民是从哪个网站来的,或看到该网民是由哪个用户宣传带来的. <br> 9.IP限制,被限制的ip将无法访问 <br> 10.黄金通道,只有黄金会员以上级别才可以进入。 <br> 11.后台管理员密码采用md5加密,极大地保护了后台的安全 <br> 12.会员密码采用md5加密,极大地保护了会员的安全 <br> 13.数据库采用在线管理 <br> 14.改变了局部一些使用不方便的功能 <br> 15.在线支付、手机支付、声讯支付功能,会员付费后自动开通到期自动封帐号,程序会自动跟据会员付多少钱而给会员定相应的级别和相应的观看时间,会员到期程序自动封锁帐号。 <br> 16.采用ACCESS2002数据库和ACCESS2000数据库两种任君选择,我们制作的数据库非常安全是无法被非法下载的请君放心。 <br> 17.修正了一些漏洞(彻底跟黄金眼说拜拜) <br> 18.多级管理员操作,演员搜索 <br> 19.下载地址和在线地址实现分离 <br> 20.观看电影记录,会员可以查看自己过去观看过多少部电影(电影名称、观看电影时间),会员报告影片错误功能。 <br> 21.管理员可以在后台查看各个会员的观看记录,可以根据会员看不同电影的时间、会员的ip地址,判断会员是否有盗链。 <br> 22.管理员在后台可随时改变会员等级,实行会员分类管理。 <br> 23.电影可以设置为免费电影、普通电影、黄金电影。 <br> 24.隐藏影片地址功能,彻底防盗链。 25.内置1st-pay在线支付功能,用户只需在后台设置好1st-pay的用户名及返回URL即可使用,无需修改程序。支付成功返回的URL是user/payok.asp 后台地址:admin/login.asp 管理账号:163dy/163dy
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值