首页 > 其他分享 >扫描游戏(蓝桥杯)

扫描游戏(蓝桥杯)

时间:2022-10-27 11:13:07浏览次数:68  
标签:ch return 游戏 消失 扫描 物件 蓝桥 &&

题意:

有一根围绕原点O顺时针旋转的棒OA,初始时指向正上方(Y轴正向)。在平面中有若干物件,第i个物件的坐标为(xi,yi) ,价值为zi 。当棒扫到某个物件时,棒的长度会瞬间增

长zi,且物件瞬间消失(棒的顶端恰好碰到物件也视为扫到),如果此时增长完的棒又额外碰到了其他物件,也按上述方式消去(它和上述那个点视为同时消失)。

如果将物件按照消失的时间排序,则每个物件有一个排名,同时消失的物件排名相同,请输出每个物件的排名,如果物件永远不会消失则输出−1。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 1e9 + 7;
const int maxn = 2e5 + 10;
template <typename T>
inline T read(T& x) {
  x = 0;
  T w = 1;
  char ch = 0;
  while (ch < '0' || ch > '9') {
    if (ch == '-') w = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + (ch - '0');
    ch = getchar();
  }
  return x = x * w;
}
struct point
{
    ll x, y, z;
    int id;
}a[maxn];
ll n;
__int128 L;

int Quadrant(point a)
{
    if(a.x >= 0 && a.y > 0)return 1;///y的正半轴放到第一象限
    if(a.x > 0 && a.y <= 0)return 2;///x的正半轴放到第二象限
    if(a.x <= 0 && a.y < 0)return 3;
    return 4;
}
ll cross(point a, point b)
{
    return a.x * b.y - a.y * b.x;
}
bool cmp(point a, point b)
{
    if(Quadrant(a) == Quadrant(b))
    {
        if(cross(a, b) == 0)
            return a.x * a.x + a.y * a.y < b.x * b.x + b.y * b.y;
        else
           return cross(a, b) < 0;
    }
    else
        return Quadrant(a) < Quadrant(b);
}

__int128 mi[maxn << 2];
void push_up(int o)
{
    mi[o] = min(mi[o << 1], mi[o << 1 | 1]);
}
void build(int o, int l, int r)
{
    if(l == r)
    {
        mi[o] = a[l].x * a[l].x + a[l].y * a[l].y;
        return ;
    }
    int mid = (l + r) >> 1;
    build(o << 1, l, mid);
    build(o << 1 | 1, mid + 1, r);
    push_up(o);
}

void update(int o, int l, int r, int x, __int128 val)
{
    if(l == r)
    {
        mi[o] = val;
        return;
    }
    int mid = (l + r) >> 1;
    if(x <= mid)update(o << 1, l, mid, x, val);
    else update(o << 1 | 1, mid + 1, r, x, val);
    push_up(o);
}

///找右边第一个小于等于z^2的数字
ll idx;
bool query(int o, int l, int r, int L, int R, __int128 z)
{
    if(L > R)return false;
    if(l == r)
    {
        idx = l;
        return mi[o] <= z;
    }
    int mid = (l + r) >> 1;
    if(L <= mid)
    {
        if((mi[o << 1] <= z) && query(o << 1, l, mid, L, R, z))
            return true;
    }
    if(R > mid)
    {
        if((mi[o << 1 | 1] <= z) && query(o << 1 | 1, mid + 1, r, L, R, z))
            return true;
    }
    return false;
}
int ans[maxn];

int main()
{
    read(n);read(L);
    for(int i = 1; i <= n; i++)
    {
        read(a[i].x);read(a[i].y);read(a[i].z);
        a[i].id = i;
        ans[i] = -1;
    }
    sort(a + 1, a + 1 + n, cmp);
    build(1, 1, n);
    int cnt = 0;
    int lastcnt = 0;
    int last = 0;  ///上一个位置
    while(true)
    {
        bool ok = query(1, 1, n, last + 1, n, L * L);
        if(ok)L = L + a[idx].z;
        else
        {
            ok = query(1, 1, n, 1, last - 1, L * L);
            if(ok)L = L + a[idx].z;
            else break;
        }
        update(1, 1, n, idx, 1e32);
        if(last)
        {
            if(Quadrant(a[last]) == Quadrant(a[idx]) && cross(a[last], a[idx]) == 0)
                ans[a[idx].id] = lastcnt, ++cnt;
            else
                ans[a[idx].id] = ++cnt, lastcnt = cnt;
        }
        else
            ans[a[idx].id] = ++cnt, lastcnt = cnt;
        last = idx;
    }
    for(int i = 1; i <= n; i++)
    {
        cout<<ans[i];
        if(i != n)cout<<" ";
    }
    return 0;
}

标签:ch,return,游戏,消失,扫描,物件,蓝桥,&&
From: https://www.cnblogs.com/wzxbeliever/p/16831494.html

相关文章

  • 【THM】Nmap Basic Port Scans(nmap基础端口扫描)-学习
    本文相关的TryHackMe实验房间链接:https://tryhackme.com/room/nmap02介绍在之前的文章中,我们专注于使用Nmap发现在线主机,并且到目前为止,我们已经介绍了Nmap扫描的三个......
  • 愤怒的小鸟重制版 for Mac(休闲益智类游戏)v1.15中文版
    愤怒的小鸟Mac版如何下载?愤怒的小鸟重制版AngryBirdsReloaded是一款在Mac平台上的休闲益智类小游戏,该游戏戏以小鸟报复偷走鸟蛋的肥猪为游戏背景,讲述了小鸟与肥猪的一系......
  • #yyds干货盘点# 动态规划专题:龙与地下城游戏问题
    1.简述:描述给定一个二维数组map,含义是一张地图,例如,如下矩阵游戏的规则如下:1)骑士从左上角出发,每次只能向右或向下走,最后到达右下角见到公主。2)地图中每个位置的值代表骑士要......
  • MySQL基础篇--执行计划扫描方式详解
    type列全表扫描ALL在查询结果集在达到全表数据>15-30%,优化器有可能会选择全表。在查询条件中出现隐式转换统计信息过旧,不准确。条件列是函数或者计算。使用ISNULL......
  • 【Security】AWVS 15.0 CentOS安装后无法扫描解决方案
    目录问题描述排查过程安装GLIBC_2.18划重点问题描述  看见AWVS更新到15.0没忍住就安装了,但是安装完之后发现服务、端口、https页面、引擎看上去都正常,但是当新建目标无......
  • python写一个跳过7的游戏
    要求1、输入一个数字N,判断1-N之间,要跳过所有含有7或者能被7整除的数字,把这些数字打印出来#可以随意传入一个数字,做1-endNum之间所有数字的判断defskin_seven(endNum):......
  • Delphi 经典游戏程序设计40例 的学习 例35半自动制作迷宫的扩展,3种变化
    unitR35;interfaceusesWindows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,ExtCtrls,StdCtrls;typeTRei35=class(......
  • 安全扫描程序:静态分析工具
      静态代码分析是对源代码或生成的二进制文件中执行的检查,以检测可能危及应用程序的错误和漏洞,它们不执行应用程序。GeneXus客户端添加了安全扫描程序,旨在提高使用Gen......
  • 放球游戏(a^b博弈)
    Problem3放球游戏(ball.cpp/c/pas)【题目描述】    Stas和Masha发明了一个游戏。游戏道具是a个两两不同的箱子和b个两两不同的皮球,Stas和Masha轮流操作,且每次操作新......
  • 猜数字小游戏
    #define_CRT_SECURE_NO_WARNINGS1#include<time.h>#include<stdio.h>#include<stdlib.h>voidmenu(){printf("**************************\n");printf("******1.play......