【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;
}
相关推荐
沐籽李3 分钟前
HuDiff在抗体人源化项目中的工程化落地
人工智能·算法·aidd·抗体设计
依然范特东6 分钟前
强化学习笔记6--IS、PPO、TD、DQN、Actor-Critic
笔记·算法
一次旅行2 小时前
RLHF全链路深度解析:Reward Model数学推导+PPO完整实战,对比GRPO轻量化方案
人工智能·算法·机器学习
Wang's Blog2 小时前
AI Agent白手起家29: Few Shot 提示词工程实战
人工智能·算法
June`3 小时前
warp shuffle指令
c++·人工智能·算法·cuda
geovindu3 小时前
go:Bit Operation Algorithm
开发语言·后端·算法·golang·位运算法
坏柠3 小时前
C语言进阶:从零实现一个可靠的环形缓冲区,吃透回绕、边界与并发
java·c语言·算法
Wang's Blog4 小时前
AI Agent白手起家31: 根据语义相似度动态选择 Few Shot 示例
人工智能·算法
白白白小纯4 小时前
每日算法day3—回文链表,链表分割
c语言·数据结构·算法·leetcode
手写码匠4 小时前
华为云Flexus+DeepSeek征文|Dify 构建企业级联网搜索 Agent:查询改写、多源检索与引用溯源实战
人工智能·深度学习·算法·aigc