ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

蓝桥杯2022省赛H题 - 扫描游戏 math

2022-07-19 13:02:21  阅读:177  来源: 互联网

标签:node std return 2022 else 蓝桥 lp 省赛 circle


 

 -51 33 2


#include <bits/stdc++.h> #define dbg(x) std::cerr << #x << "=" << x << "\n" using i64 = long long; struct node { i64 x, y, w; int id, circle, rank; bool operator>(node b) { if (circle != b.circle) return circle > b.circle; if (b.x < 0) return (x * b.y - y * b.x > 0) && (x < 0); else if (b.x > 0) return (x * b.y - y * b.x > 0) || (x < 0); else if (b.y > 0) return (x != 0) || (y < 0); else return x < 0; } bool operator()(const node& a, const node& b) { if (a.circle != b.circle) return a.circle > b.circle; if (b.x < 0) return (a.x * b.y - a.y * b.x > 0) && (a.x < 0); else if (b.x > 0) return (a.x * b.y - a.y * b.x > 0) || (a.x < 0); else if (b.y > 0) return (a.x != 0) || (a.y < 0); else return a.x < 0; } bool operator==(node b) { if (x * b.x >= 0 && y * b.y >= 0)//同号的情况 return y * b.x == x * b.y && circle == b.circle; return false; } bool operator>=(node b) { return *this > b || *this == b; } }; std::priority_queue<node, std::vector<node>, node> q; int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int n; i64 L; std::cin >> n >> L; std::vector<node> v(n), vv(1); vv[0].x = -114514, vv[0].y = -114514; for (int i = 0; i < n; i++) { std::cin >> v[i].x >> v[i].y >> v[i].w; v[i].id = i; v[i].circle = 0; } std::sort(v.begin(), v.end(), [&](node i, node j) { return i.x * i.x + i.y * i.y < j.x * j.x + j.y * j.y; }); int lp = 0; node now_status = v[0]; while (lp < n && v[lp].x * v[lp].x + v[lp].y * v[lp].y <= L * L) {//初始化 q.push(v[lp]); lp++; } int rank = 1; while (!q.empty()) { auto p = q.top(); q.pop(); // dbg(p.circle); // dbg(p.x); // dbg(p.y); L += p.w; now_status = p; p.rank = p == vv.back() ? vv.back().rank : rank; vv.push_back(p); while (lp < n && v[lp].x * v[lp].x + v[lp].y * v[lp].y <= L * L) {//左指针后移 if (v[lp] >= now_status) q.push(v[lp]); else { v[lp].circle = now_status.circle;//加够圈数 if (now_status > v[lp]) v[lp].circle += 1; q.push(v[lp]); } lp++; } rank++; } while (lp < n) {//所有够不着的点 v[lp].rank = -1; vv.push_back(v[lp]); lp++; } std::sort(vv.begin() + 1, vv.end(), [&](node i, node j) { return i.id < j.id; }); for (int i = 1; i <= n; i++) { std::cout << vv[i].rank << " \n"[i == n]; } return 0; }

 

标签:node,std,return,2022,else,蓝桥,lp,省赛,circle
来源: https://www.cnblogs.com/zrzsblog/p/16493685.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有