polarday. 2022-02-28 22:56 采纳率: 0%
浏览 90
已结题

CCF序列查询新解,样例都能过,但提交只有五分

代码思路:

img

跟第一题一样,对每个f[i]相同的区间进行处理,将整个区间的g[i]分成三部分
以上图f[i]=1的区间[2,4]为例,将区间分成g1=A[2]/r,g2=A[4]/r,以及g在g1和g2之间这三部分
第一部分:因为每个g会出现r次,求A[2]%r可以求出当前这个值对应的g是第几次出现,在当前这个区间中还会出现r-A[2]%r次
第二部分:同理A[4]%r求出这个g是第几次出现,当前这个区间中这个g出现了A[4]%r+1次,这里要判断一次A[4]/r和A[2]/r是否相等,若相等则是同一个数,只加一次即可
第三部分:在这两个g之间的值都出现了r次
至此就可以求出这个区间所有g的值,然后就可以求出error的值,然后遍历整个区间即可

这个代码给的样例都过了,但是提交的时候只有五分,大家能看一下哪里出错了吗,感谢!


#include <bits/stdc++.h>

using namespace std;

#define ll long long

int main()
{
    ll ans = 0;
    ll n, N;
    cin >> n >> N;
    ll r = N / (n + 1);
    vector<ll> vec(n + 1);
    vec[0] = 0;
    for (ll i = 1; i <= n; i++)
    {
        cin >> vec[i];
    }
    for (ll i = 1; i <= n; i++)
    {
        ll f = i - 1; //[vec[i-1],vec[i])之间的f
        ll a1 = vec[i - 1] / r;
        ll a2 = vec[i - 1] % r;
        ll b1 = (vec[i] - 1) / r;
        ll b2 = (vec[i] - 1) % r;

        ans += abs((r - a2) * (a1 - f));
        if (b1 != a1)
            ans += abs((b2 + 1) * (b1 - f));
        for (ll j = a1 + 1; j < b1; j++)
            ans += abs(r * (j - f));
    }

    ll f = n; //[vec[n],N-1]之间的f
    ll a1 = vec[n] / r;
    ll a2 = vec[n] % r;
    N = N - 1;
    ll b1 = N / r;
    ll b2 = N % r;
    ans += abs((r - a2) * (a1 - f));
    if (b1 != a1)
        ans += abs((b2 + 1) * (b1 - f));
    for (ll j = a1 + 1; j < b1; j++)
        ans += abs(r * (j - f));

    cout << ans;
    return 0;
}
  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 3月8日
    • 创建了问题 2月28日

    悬赏问题

    • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
    • ¥15 安装quartus II18.1时弹出此error,怎么解决?
    • ¥15 keil官网下载psn序列号在哪
    • ¥15 想用adb命令做一个通话软件,播放录音
    • ¥30 Pytorch深度学习服务器跑不通问题解决?
    • ¥15 部分客户订单定位有误的问题
    • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法
    • ¥15 Bug traq 数据包 大概什么价
    • ¥15 在anaconda上pytorch和paddle paddle下载报错
    • ¥25 自动填写QQ腾讯文档收集表