[JZOJ4737] 【NOIP2016提高A组模拟8.25】金色丝线将瞬间一分为二

Description
Input
Output
Sample Input
5 10
1 1
2 2
3 3
4 4
5 5
Sample Output
4
Data Constraint
Hint

 


 

 

开long long 100分,不开10分也是醉了。

long long 卡90分的头一次见。

暴力: 直接O(N^2)不说了。

部分分:x, y坐标递增,设f[i]表示i号点对之前的贡献,那么f[i] = f[i-1] + (abs(x[i] - x[i-1])+ abs(y[i] - y[i-1])) * (i - 1),直接递推就行了。

x坐标相等的不会...

 

不是正解正确解法。考试的时候不知道怎么yy出来的。

我们把原序列称为p;

我们考虑,一个点i加进来的贡献, 一定是 $ \large \sum_{j=1}^{i-1} |x[i]-x[j]| + |y[i]-y[j]| $.

考虑去掉绝对值,我们先看x轴,y轴和x轴一样。

那么就是如果x[i] > x[j] 贡献 += x[i] - x[j], 否则 贡献 += x[j] - x[i];

受到这个启发(不知脑子里如何蹦出的想法),我们把原数组按照x排序,得到数组p。

然后数组p中的元素的x坐标一定是单调不降的。我们设原来的i在p中的位置为pos[i]。

那么对于j < pos[i] 的元素, 我们可以直接算 $ \large \sum_{ } x[i] - x[j] $。

化简一下得到 $ num * x[i] - \large \sum_{}x[j] $. num表示p数组中1~i中在i前面的数的个数。

所以我们可以用一个树状数组维护数是否出现, 即里面全是01序列。

用另一个树状数组维护$ \large \sum_{ }x[j] $,即扫描到j, 就把x[j]插入树状数组的pos[j]的位置。

对于j > pos[i]的同理。

对于y轴同理。

最后用四个树状数组搞定了这道题。

还有, 这份代码不吸氧气只有80分。

一定记得开long long否则只有10分(论一个人如何让自己的成绩缩小10倍).

复杂度O(NlogN*一个大常数)。

完了我感觉我讲不清了233.

 


 

 

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>
#include <ctime>
using namespace std;
#define reg register
#define INT long long
#define int long long

inline int read() {
    int res=0;char ch=getchar();bool flag=0;
    while(!isdigit(ch)){if(ch=='-')flag=1;ch=getchar();}
    while(isdigit(ch))res=(res<<3)+(res<<1)+(ch^48),ch=getchar();
    return flag?-res:res;
}
inline int abss(int x) {return x < 0 ? -x : x;}
int n, D;
struct date {
    int x, y, id;
}p[600005], px[600005], py[600005];

struct BIT {
    INT tr[600005];
    #define lowbit x & -x
    inline void add(int x, int y)
    {
        while(x <= n) tr[x] += y, x += lowbit;
    }
    inline INT ask(int x)
    {
        INT res = 0;
        while(x) res += tr[x], x -= lowbit;
        return res;
    }
}x1, x2, y1, y2;//1:是否出现, 2:坐标
INT now;

inline bool cmp1(date a, date b)
{
    return a.x < b.x;
}
inline bool cmp2(date a, date b)
{
    return a.y < b.y;
}

int posx[600005], posy[600005];

signed main()
{
    n = read(), D = read();

    for (reg int i = 1 ; i <= n ; i ++) px[i].x = py[i].x = read(), px[i].y = py[i].y = read(), px[i].id = py[i].id = i;
    for (reg int i = 1 ; i <= n ; i ++) p[i].x = px[i].x, p[i].y = px[i].y, p[i].id = i;
    sort(px + 1, px + 1 + n, cmp1), sort(py + 1, py + 1 + n, cmp2);
    for (reg int i = 1 ; i <= n ; i ++) posx[px[i].id] = i;
    for (reg int i = 1 ; i <= n ; i ++) posy[py[i].id] = i;
    for (reg int i = 1 ; i <= n ; i ++)
    {
        now += x1.ask(posx[i]) * p[i].x - x2.ask(posx[i]);
        now += y1.ask(posy[i]) * p[i].y - y2.ask(posy[i]);
        now += (x2.ask(n) - x2.ask(posx[i])) - (x1.ask(n) - x1.ask(posx[i])) * p[i].x;
        now += (y2.ask(n) - y2.ask(posy[i])) - (y1.ask(n) - y1.ask(posy[i])) * p[i].y;
        x1.add(posx[i], 1), x2.add(posx[i], p[i].x);
        y1.add(posy[i], 1), y2.add(posy[i], p[i].y);
        if (now >= D) {printf("%d\n", i);return 0;}
    //    printf("%lld\n", now);
    }
    puts("-1");
    return 0;
}

 

 

 

 

转载于:https://www.cnblogs.com/BriMon/p/9510748.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值