Problem G Ray in the tube(思维)

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

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;
}
<think>好的,用户想查询短语"The problem stems"的含义和用法。首先,我需要理解这个短语的结构。"stem"作为动词时,通常表示“起源于”或“由...产生”,所以"The problem stems"可能是指问题的根源或来源。接下来,应该分析其常见搭配,比如后面常接"from",形成"stem from"的结构,表示问题源于某个因素。 然后,要确认这个短语的具体用法。比如在句子中的位置,是作为谓语动词还是分词结构。例如,"The problem stems from inadequate funding"中,它作为谓语动词,说明问题的根源。另外,可能需要注意时态和语态的变化,如过去式"stemmed"或被动语态的使用情况。 还需要考虑近义词和反义词,帮助用户更好地区分。例如,"originate from"或"arise from"是近义词,而"lead to"或"result in"则是反义表达。这有助于用户理解在不同语境下的替换选择。 此外,提供例句会更有助于用户掌握实际应用。需要收集不同语境下的例子,展示该短语在学术写作、日常交流或商务报告中的使用方式。比如,在商业分析中可能会说"The issue stems from market fluctuations",而在日常生活中可能用于指出个人问题的根源。 最后,要确保回答结构清晰,按照用户的要求分点说明,避免使用步骤词汇,并且每个部分换行分隔。同时,检查是否遗漏了任何格式要求,比如数学公式或代码部分,但在这个问题中可能不需要。最后生成的相关问题要基于用户的原问题,可能涉及同义词替换、错误用法或教学资源推荐等。</think>短语“the problem stems”表示问题根源或起因,通常用于描述问题产生的来源。动词“stem”在此处意为“起源于”,需与介词“from”搭配使用构成完整表达。常见用法结构为: **Subject + stem(s) + from + [根源]** The problem stems from insufficient testing 该短语多用于正式场景,如学术写作、商业报告和技术文档。时态变化通过动词形态体现:过去式(stemmed)、进行时(is stemming)、完成时(has stemmed) 典型错误用法包括: - 遗漏介词(× The problem stems poor design → √ stems from poor design) - 错误介词搭配(× stems with → √ stems from) - 主谓不一致(× The problems stems → √ problems stem) 同义表达包含originate from、arise from、result from,反义表达为lead to、result in。语义强度对比: $E_{语义强度} = \begin{cases} \text{stem from} > \text{come from} \\ \text{originate from} \approx \text{stem from} \end{cases}$ ```text 示例分析: 原始句:Server crashes stemmed from memory leaks 改写句:The root cause of server crashes originated in faulty memory allocation ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值