財神娛樂首存即享優惠回饋唷~詳情請進👉

【數據slot 中文布局】【CF1073D】 Berland Fair

Description

給定 \(n\) 個商鋪,他們圍成一個圓圈,按照順時針從 \(1\) 到 \(n\) 編號。你有 \(T\) 元錢,從 \(1\) 號點最先按照順時針偏向走,每到一個商鋪,只需錢夠就必需買這個商鋪的物品。商鋪中物品是無窮的,即多次達到可能多次購買。求會買若干件物品

Input

第一行是一個整數 \(n\)

上面一行 \(n\) 個整數 \(a_i\),代表每個商鋪物品的價錢

Output

一行一個整數代表謎底

Hint

\(1~\leq~n~\leq~2~\times~10^5~,~1~\leq~T~\leq~10^{18}~,~1~\leq~a_i~\leq~10^9\)

Solution

解法一:

顯然在錢數足夠是咱們可以間接除一下失去咱們可以轉若干圈,\(O(1)\) 統計這部門謎底,然后把錢數取模即為這些圈轉完后咱們剩下的錢,這時候的錢數是不敷以轉完一圈的。

上面咱們思量用這些錢可以延續走多遙,即會到哪個商鋪停上去。注重到這個值是可以二分的,詳細的,咱們維護一個前綴以及,二分哪一個地位的前綴以及是最大的小于錢數的即可。然后剩下阿誰地位的商鋪顯然不再會被購買到了,因而可以將它間接刪往,然后統計這一段延續走的地位的謎底。刪除這個地位后的前綴以及可以用樹狀數組或者線段樹維護,一段區間中還剩若干個沒有被刪往的地位也能夠樹狀數組維護。關于這個地位前面能延續走到那里,咱們仍然可以二分這個值,以此類推直到一圈走完,然后從頭最先反復流程即可。

注重到每次二分咱們肯定會刪除一個地位,以是咱們會二分 \(O(n)\) 次,間接二分+樹狀數組/線段樹的話,單次二分龐大度 \(O(\log偏財運2020偏財運八字^2 n)\),總龐大度 \(O(n \log^2 n)\)。若是在線段樹上二分,單次龐大度可以做到 \(O(\log n)\),總龐大度 \(O(n \log n)\)。

然則天曉得為何我的兩個log算法跑的比一個log的還快

解法二:

算出當前的錢數可以走若干圈的要領同上,然后思量咱們暴力跑一圈,統計有哪些地位的是不克不及被購買到的,間接刪失。然后用剩下的錢再取模。

注重到 \(T\) 每次取模時的模數肯定小于 \(T\),而一個數被比本人小的數取模最少淘汰二分之一,證實上可以分模數大于或者小于即是 \(\frac{m}{2}\) 進行接頭。因而 \(T\) 被取模 \(O(\log T)\) 次,每次對應一次 \(O(n)\) 的統計謎底,因而總龐大度 \(O(n \log T)\)。

Code

根據解法一寫成。

\(O(n \log^2n)\)

#include <cstdio>
#ifdef ONLINE_JUDGE
#define freopen(a,b,c)
#endif
#define rg register
#define ci const int
#define cl const long long

typedef long long  ll;

namespace IPT {
    const int L = 1000000;
    char buf[L],*front=buf,*end=buf;
    char GetChar() {
        if (front == end) {
            end = buf + fread(front = buf,1,L,stdin);
            if (front == end) return -1;
        }
        return *(front++);
    }
}

template <typename T>
inline void qr(T &x) {
    rg char ch = IPT::GetChar(),lst = 真人線上麻將' ';
    while ((ch > '9') || (ch < '0')) lst = ch,ch=IPT::GetChar();
    while ((ch >= '0') && (ch <= '9')) x = (x << 1) + (x << 3) + (ch ^ 48),ch = IPT::GetChar();
    if (lst == '-') x = -x;
}

template <typename T>
inline void ReadDb(T &x) {
    rg char ch = IPT::GetChar(),ch = IPT::GetChar();
    while ((ch >= '0') && (ch <= '9')) x = x * 10 + (ch ^ 48),ch = IPT::GetChar();
    if (ch == '.') {
        ch = IPT::GetChar();
        double base = 1;
        while ((ch >= '0') && (ch <= '9')) x += (ch ^ 48) * ((base *= 0.1)),ch = IPT::GetChar();
    }
    if (lst == '-') x = -x;
}

namespace OPT {
    char buf[120];
}

template <typename T>
inline void qw(T x,const char aft,const bool pt) {
    if (x < 0) {x = -x,putchar('-');}
    rg int top=0;
    do {OPT::buf[++top] = x % 10 + '0';} while (x /= 10);
    while (top) putchar(OPT::buf[top--]);
    if (pt) putchar(aft);
}

const int maxn = 200010;

int n;
ll t,ans;
int MU[maxn];
ll tree[maxn],val[maxn];

inline int lowbit(ci x) {return x & (-x);}

ll ask(ll*,int);
int check(int,ll);
void update(ll*,int,ci);

signed main() {
    freopen("大眾1.in"大眾,"大眾r"大眾,stdin);
    qr(n); qr(t);
    for (rg int i = 1; i <= n; ++i) {qr(MU[i]); update(tree,i,MU[i]); update(val,1);}
    ll s = ask(tree,n); int cnt = n;
    while (cnt) {
        if (!t) break;
        ans += t / s * cnt; t %= s;
        int k = 0;
        do {
            int pre = k;
            k = check(k,t);
            if (k > n) {
                t -= ask(tree,n) - ask(tree,pre);
                ans += ask(val,n) - ask(val,pre);
                break;
            };
            update(tree,k,-MU[k]); upd線上麻將現金pttate(val,-1); --cnt;
            t -= ask(tree,k - 1) - ask(tree,pre);
            s -= MU[k];
            ans 麻將王換現金+= ask(val,k) - ask(val,pre);
        } while (cnt && t);
    }
    qw(ans,'\n',true);
}

void update(ll *ar,int x,ci v) {
    while (x <= n) {
        ar[x] += v;
        x += lowbit(x);
    }
}

ll ask(ll* ar,int x) {
    ll _ret = 0;
    w捕 魚 遊戲 電腦 版hile (x) {
        _ret += ar[x];
        x -= lowbit(x);
    }
    return _ret;
}

int check(int pre,ll x) {
    int l = pre,r = n + 1,mid = l,_ret = 0;
    while (l <= r) {
        mid = (l + r) >> 1;
        if ((ask(tree,mid) - ask(tree,pre)) <= x) _ret = mid,l = mid + 1;
        else r = mid - 1;
    }
    return _ret + 1;
}

【免責聲明】本站內容轉載自互聯網,其相關談吐僅代表作者小我私家概念盡非權勢巨子,不代表本站態度。如您發明內容存在版權成績,請提交相關鏈接至郵箱:,咱們將實時予以處置。