Problem G Ray in the tube(思维)

博客探讨了二维坐标系中,从传感器A到B发射的激光遇到直线反射的情况,求解最多能经过多少个传感器。通过分析射线与传感器的关系,提出了一种优化的解决方案,即在每个传感器处枚举特定数量的射线,达到O((n+m)log(1e9)log(n))的时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://codeforces.com/gym/101911/problem/L

题意

在二维坐标系中给出两个直线 y = a, y = b。在这两条直线上分别有n个和m个传感器,可以任意选两个传感器A,B,发射一束A->B的激光,这个激光遇到直线就会反射,问最多会经过多少个传感器。

1<=n,m<=3e5
在这里插入图片描述

题解

先解决一个问题,已知一条射线,如何快速求出经过的传感器个数?

对于上下直线分开讨论。

  1. 假设如图所示,从下往上的射线在下直线的跨度是 c = ( x b − x a ) ∗ 2 c = (x_b-x_a)*2 c=(xbxa)2,对于每个传感器令其坐标为 x u x_u xu,只需 满足 x u ≡ x a   m o d   c x_u \equiv x_a \ mod\ c xuxa mod c即在这个射线上。
  2. 对于上直线,同理,只需满足 x u + c / 2 ≡ x a   m o d   c x_u+c/2 \equiv x_a \ mod\ c xu+c/2xa mod c

这两条直线间隔的距离是无所谓的,这个只决定射线的斜率而已。
一个很直观的做法就是枚举上下所有的两个点,然后取最大值,但这个复杂度不允许 O ( n 2 m 2 ) O(n^2m^2) O(n2m2)

画画图可以发现,一些c比较大的射线能用比它小的射线代替,例如c = 6可以被 c = 2代替,但是c = 4 不能被 c = 2 代替。

多尝试一下发现只要 c = 2 l c = 2^l c=2l的射线都不可被替代, c = 2 l ∗ 奇 数 c = 2^l*奇数 c=2l都可以被 c = 2 l c = 2^l c=2l的所代替。

所以我们只需在每个传感器处枚举 l o g ( 1 e 9 ) log(1e9) log(1e9)根射线即可。时间复杂度为 O ( ( n + m ) l o g ( 1 e 9 ) l o g ( n ) ) O((n+m)log(1e9)log(n)) O((n+m)log(1e9)log(n))

代码

#include <bits/stdc++.h>
using namespace std;
#define FOR0(a,b) for(int i = a; i < b; ++i)
#define FORE(a,b) for(int i = a; i <= b; ++i)
typedef long long ll;
typedef pair<int,int> pii;

const int maxn = 1e5+5;

map<ll,ll> mp1,mp2;
ll n,m;
ll a[maxn], b[maxn];;

int main() {
    int y;
    scanf("%lld%lld", &n,&y);
    for(int i = 0; i < n; ++i)
        scanf("%lld", &a[i]);
    scanf("%lld%lld", &m, &y);
    for(int i = 0; i < m; ++i)
        scanf("%lld", &b[i]);

    ll c = 2;
    ll ans = 2;
    for(; c <= 1e9; c <<= 1) {
        mp1.clear();mp2.clear();
        for(int i = 0; i < n; ++i)
            mp1[a[i]%c]++;
        for(int i = 0; i < m; ++i)
            mp2[b[i]%c]++;

        for(int i = 0; i < n; ++i) 
            ans = max(ans, mp1[a[i]%c]+mp2[(a[i]+c/2)%c]);
        for(int i = 0; i < m; ++i)
            ans = max(ans, mp2[b[i]%c]+mp1[(b[i]+c/2)%c]);
    }
    printf("%lld\n", ans);
    return 0;
}
资源下载链接为: https://pan.quark.cn/s/790f7ffa6527 在一维运动场景中,小车从初始位置 x=-100 出发,目标是到达 x=0 的位置,位置坐标 x 作为受控对象,通过增量式 PID 控制算法调节小车的运动状态。 系统采用的位置迭代公式为 x (k)=x (k-1)+v (k-1) dt,其中 dt 为仿真过程中的恒定时间间隔,因此速度 v 成为主要的调节量。通过调节速度参数,实现对小车位置的精确控制,最终生成位置 - 时间曲线的仿真结果。 在参数调节实验中,比例调节系数 Kp 的影响十分显著。从仿真曲线可以清晰观察到,当增大 Kp 值时,系统的响应速度明显加快,小车能够更快地收敛到目标位置,缩短了稳定时间。这表明比例调节在加快系统响应方面发挥着关键作用,适当增大比例系数可有效提升系统的动态性能。 积分调节系数 Ki 的调节则呈现出不同的特性。实验数据显示,当增大 Ki 值时,系统运动过程中的波动幅度明显增大,位置曲线出现更剧烈的震荡。但与此同时,小车位置的变化速率也有所提高,在动态调整过程中能够更快地接近目标值。这说明积分调节虽然会增加系统的波动性,但对加快位置变化过程具有积极作用。 通过一系列参数调试实验,清晰展现了比例系数和积分系数在增量式 PID 控制系统中的不同影响规律,为优化控制效果提供了直观的参考依据。合理匹配 Kp 和 Ki 参数,能够在保证系统稳定性的同时,兼顾响应速度和调节精度,实现小车位置的高效控制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值