【Luogu】P9809 [SHOI2006] 作业 Homework (根号算法)

题目:

思路:

我们不难发现本题和 mod 有关,想这种难以维护所有情况的时候,我们可以往根号算法上想

本题中值域为 V = 3e5,不难发现一个特点我们可以以 B = sqrt(V) 为边界分两种方法讨论

①.如果 Y <= B

此时我们可以暴力枚举所有情况的答案,处理时间复杂度最多为 O(N*B),查询只需要 O(1)

②.如果 Y > B

此时如何处理呢?注意到我们只需要余数最小,那么我们可以往商的方向上想,如果直到商,那么余数也就出来了,所以我们可以考虑枚举商然后去二分第一个大于等于商的数,此时这个数的余数一定是所有相同商中的最小余数,时间复杂度为 O(N*B*logN),注意枚举商是 sqrt(V) 的复杂度

具体实现看代码

代码:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define yes cout << "YES\n"
#define no cout << "NO\n"
mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());

const int B = 550;
// mod i 的最小结果
int ans[B];

void solve()
{
    int n;
    cin >> n;
    set<int> has;
    for (int i = 0; i < n; i++)
    {
        char c;
        cin >> c;
        if (c == 'A')
        {
            int x;
            cin >> x;
            for (int i = 1; i <= B; i++)
                ans[i] = min(ans[i], x % i);
            has.insert(x);
        }
        else
        {
            int y;
            cin >> y;
            if (y >= B)
            {
                int now = y;
                //枚举商的结果,即枚举 ky,那么最接近的肯定是余数最小的,二分寻找即可
                for (int i = 0; i <= 300000; i+=y)
                {
                    auto it = has.lower_bound(i);
                    if(it == has.end()) break;
                    now = min(now,*it - i);
                }
                cout << now << endl;
            }
            else
                cout << ans[y] << endl;
        }
    }
}

signed main()
{
    memset(ans, 0x3f, sizeof ans);
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t = 1;
    while (t--)
    {
        solve();
    }
    return 0;
}
相关推荐
CodeRecycle8 分钟前
Python 自动配置 pip 支持库(通过 Windows Bat 脚本)
算法
liliangcsdn26 分钟前
特质偏度因子的计算示例和分析
算法
荆棘鸟智能1 小时前
无人机遥感图像实时拼接算法工程实践:从特征提取到全景融合的完整技术链路
算法·无人机
6Hzlia1 小时前
【Classic 150 刷题计划】 LeetCode 58. 最后一个单词的长度 | C++ 极简反向遍历与单变量状态机
算法
AgentMaster2 小时前
企业如何应用智能客服?5 个典型场景的技术架构与实施路径
大数据·算法
程曦曦2 小时前
MySQL 生产库误删 98 张表后的时间点恢复实战:从 binlog 解析到资金对账
linux·数据结构·其他·算法·ubuntu·运维开发
weixin_307779133 小时前
C++代码实现MATLAB中的ode45函数功能
开发语言·c++·算法·matlab
不穿鞋的懒羊羊3 小时前
dfs深度优先搜索
算法
OYYHXPJR3 小时前
【算法】区间重叠模板和矩形重叠模板
算法
shehuiyuelaiyuehao3 小时前
算法46,分治快排,排序数组
java·算法·排序算法·排序