尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

牛客 周赛109 20250924

牛客 周赛109 20250924
📅 发布时间:2026/6/18 18:55:20

牛客 周赛109 20250924

https://ac.nowcoder.com/acm/contest/116945

A:
题目大意:

给定两个坐标,判断和原点一起能否构成一个直角三角形

void solve(){double x, y, u, v;cin >> x >> y >> u >> v;double L[] = {sqrt(x * x + y * y), sqrt(u * u + v * v), sqrt((x - u) * (x - u) + (y - v) * (y - v))};sort(L, L + 3);if (L[0] + L[1] <= L[2]) cout << "No";else cout << "Yes";
}

签到

B:
题目大意:

image-20250923150820760

void solve(){int n;cin >> n;vector<double> x(n), y(n);for (int i = 0; i < n; i ++)cin >> x[i] >> y[i];auto check = [&](int i, int j){double dx = x[i] - x[j], dy = y[i] - y[j];return abs(sqrt(dx * dx + dy * dy) - 1) < 0.000001;};int cnt = 0;for (int i = 0; i < n; i ++){for (int j = i + 1; j < n; j ++){if (check(i, j)) cnt ++; }}cout << cnt ;
}

\(O(n^2)\) 的暴力

C:
题目大意:

image-20250923150907951

void solve(){pair<int, int> p1, p2, p3;cin >> p1.first >> p1.second >> p2.first >> p2.second;if (p1.first == p2.first || p1.second == p2.second){if (p1.first == p2.first){p3.second = min(p1.second, p2.second);p3.first = p1.first - 2;}else{p3.first = min(p1.first, p2.first);p3.second = p1.second - 2;}cout << p3.first << ' ' << p3.second; return ;}if (p1.second < p2.second) swap(p1, p2);p3.first = p1.first;p3.second = p2.second;int dx = p2.first - p3.first;int dy = p1.second - p2.second;if (dx & 1 && dy & 1) p3.first -= dx;cout << p3.first << ' ' << p3.second; }

先构造出以 \(AB\) 为斜边的一个直角三角形,然后判断两条直角边是否都为奇数

如果全为奇数,那么面积存在小数,所以令任意一条直角边变为原来的两倍,构造满足题意

D:
题目大意:

image-20250923151146279

int dx[] = {1, 2, -1, -2};
int dy[] = {2, -2 , 1, -1};void solve(){int n;cin >> n;vector<pair<int, int>> p(n);for (int i = 0; i < n; i ++)cin >> p[i].first >> p[i].second;sort(p.begin(), p.end());map<pair<int, int>, int> mp;for (int i = 0; i < n; i ++){int x = p[i].first, y = p[i].second;for (int u = 0; u < 4 ; u ++){for (int v = 0; v < 4; v ++){if (abs(dx[u]) == abs(dy[v])) continue;int tx = x + dx[u], ty = y + dy[v];if (tx <= 0 || ty <= 0) continue;mp[{tx, ty}] ++;}}}pair<int, int> ans = {0, 0};int mx = 0;for (auto [k ,v] : mp){if (mx < v && lower_bound(p.begin(), p.end(), k) != p.end()){mx = v;ans = k;}}cout << ans.first << ' ' << ans.second;
}

考虑用 map 记录所有可以威胁到兵的位置,至多存在 \(8n = 1.6e6\) 个,存入空间复杂度可以接受

最后枚举所有记录的位置,得到最大值答案

E:
题目大意:

image-20250923151817949

void solve(){int n;cin >> n;vector<pair<int, int>> p(n);for (int i = 0; i < n; i ++)cin >> p[i].first >> p[i].second;sort(p.begin(), p.end());map<int, set<int>> mp;for (int i = 0; i < n; i ++)mp[p[i].first].insert(p[i].second);int ans = 0;for (auto it = mp.begin(); next(it, 1) != mp.end(); it ++){auto st1 = (*it).second, st2 = (*next(it, 1)).second;if ((*it).first != (*next(it, 1)).first - 1) continue;int cnt = 0;for (auto i : st1){if (st2.count(i)) cnt ++;}ans += cnt * (cnt - 1) / 2;}mp.clear();for (int i = 0; i < n; i ++)mp[p[i].second].insert(p[i].first);for (auto it = mp.begin(); next(it, 1) != mp.end(); it ++){auto st1 = (*it).second, st2 = (*next(it, 1)).second;if ((*it).first != (*next(it, 1)).first - 1) continue;int cnt = 0;for (auto i : st1){if (st2.count(i)){cnt ++;if (st1.count(i - 1) && st2.count(i - 1)) ans --;}}ans += cnt * (cnt - 1) / 2;}cout << ans ;
}

对点进行两次排序,第一次按照横坐标从小到大排序,把点按照横坐标存进不同的 set 中,然后枚举 map 中的 set

暴力计算相邻的横坐标相差一的 set 中相同的纵坐标数量,排列组合计算在横坐标相差一下可以构造的矩形数量

同样的对纵坐标排序后相似计算,注意还需要减去长宽都为 \(1\) 的矩形重复的贡献

for (auto i : st1){if (st2.count(i)){cnt ++;if (st1.count(i - 1) && st2.count(i - 1)) ans --;}
}

F:
题目大意:

image-20250923152235422

const int N = 2e5 + 10;struct Q{int k1, k2, idx;
};int s[N];int lowbit(int x){return x&-x;
}void change(int x, int k){while (x < N){s[x] += k;x += lowbit(x);}
}int query(int x){int res = 0;while (x){res += s[x];x -= lowbit(x);}return res;
}void solve(){int n, m;cin >> n >> m;vector<pair<int, int>> p(n);for (int i = 0; i < n; i ++)cin >> p[i].first >> p[i].second;	vector<Q> q(m);for (int i = 0; i < m; i ++){cin >> q[i].k1 >> q[i].k2;q[i].idx = i;}set<int> st;map<int, int> mp;int idx = 0;for (int i = 0; i < n; i ++){int x = p[i].first, y = p[i].second;p[i].first = x - y;p[i].second = x + y;st.insert(p[i].second);}for (int i = 0; i < m; i ++){q[i].k1 *= -1;st.insert(q[i].k2);}for (auto i : st) mp[i] = ++ idx;for (int i = 0; i < n; i ++){p[i].second = mp[p[i].second];change(p[i].second, 1);}for (int i = 0; i < m; i ++) q[i].k2 = mp[q[i].k2];auto cmp = [&](Q x, Q y){return x.k1 < y.k1;};sort(p.begin(), p.end());sort(q.begin(), q.end(), cmp);int i = 0, j = 0;vector<int> ans(m);while (i < m){while (j < n && p[j].first <= q[i].k1){change(p[j].second, -1);j ++;}ans[q[i].idx] = query(q[i].k2 - 1);i ++;}for (auto i : ans) cout << i << '\n';}

给定的点需要满足下面的约束:

\[y - x < k_1\\ y + x < k_2 \]

换算到切比雪夫坐标下,令 \(X = x -y,Y=x + y\) ,约束为 \(X > -k_1,Y<k_2\)

对询问和点集按照 \(X\) 从小到大排序后,离散化后树状数组查询对应 \(Y\) 满足的点的数量

while (i < m){//枚举询问while (j < n && p[j].first <= q[i].k1){//删去点集中不合法的点change(p[j].second, -1);j ++;}ans[q[i].idx] = query(q[i].k2 - 1);//处理询问i ++;
}

时间复杂度为 \(O(n\log n)\)

相关新闻

  • AirSim 安装过程记录 - zzh
  • 基于AXI模块的视频流传输(硬件连接篇)
  • 仿射密码

最新新闻

  • 【2026年6月】中型货架厂家与仓储货架企业推荐指南 - 多才菠萝
  • 2026大连黄金回收市场大整治!正规甄别标准出炉,避坑不踩雷 - 奢侈品回收评测
  • 西安专业定制私家团旅行社排行 合规服务商盘点 - 起跑123
  • 2026 北京黄金回收实力梯队公示,全城优质连锁门店实力深度盘点 - 奢侈品回收测评
  • 嵌入式调试实战:观察点与寄存器操作在CodeWarrior中的高效应用
  • 2026成都黄金回收价格对比:收的顶同城高价回收实测 - 奢侈品回收评测

日新闻

  • 2026年不锈钢卷板厂家推荐排行榜:冷轧热轧/304/201不锈钢卷板,高颜值耐腐蚀源头厂家实力精选 - 企业推荐官【官方】
  • FLUX.1-dev FP8模型实战指南:24GB以下显卡高效部署方案
  • 2026佛山长途搬家价目表:跨省跨市搬家费用完整计算指南 - 从来都是英雄出少年

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号