可爱萌新刚学 OI,50pts 求调
查看原帖
可爱萌新刚学 OI,50pts 求调
339442
SXqwq楼主2024/11/11 11:57
#include <bits/stdc++.h>
#define int long long
using namespace std;
constexpr int mod = 1e9 + 7;
constexpr int N = 4e5 + 10;
namespace FastIO {
	char buf[1 << 21], *p1 = buf, *p2 = buf;
#define getchar() (p1 == p2 && (p1 = buf, p2 = (p1 + fread(buf, 1, 1 << 21, stdin))) == p1 ? EOF : *p1++)
	template <typename T> inline T read() { T x = 0, w = 0; char ch = getchar(); while (ch < '0' || ch > '9') w |= (ch == '-'), ch = getchar(); while ('0' <= ch && ch <= '9') x = x * 10 + (ch ^ '0'), ch = getchar(); return w ? -x : x; }
	template <typename T> inline void write(T x) { if (!x) return; write<T>(x / 10), putchar((x % 10) ^ '0'); }
	template <typename T> inline void print(T x) { if (x > 0) write<T>(x); else if (x < 0) putchar('-'), write<T>(-x); else putchar('0'); }
	template <typename T> inline void print(T x, char en) { print<T>(x), putchar(en); }
}; using namespace FastIO;
namespace solution
{
    int n,m,q;
    char s[N];
    queue <int> que;
    __int128_t f[N][64];
    int g[N][64];
    int lst[N];
    void solve()
    {
        cin>>n>>m>>q;
        for(int i=0;i<n;i++) cin>>s[i];
        for(int i=n;i<n*2-2;i++) s[i] = s[i%n];
        for(int i=n*2-2;i>=0;i--) //拿队列做的,其实就是双指针,这里断环为链处理
        {
            while(que.size() && que.front() - i > m) que.pop();
            if(!que.empty()) lst[i] = que.front();
            else lst[i] = i + 1; // 每个点向右跳 1 步能到的位置 
            if(s[i] == '1') que.push(i);
        } 
        for(int i=0;i<n;i++) 
        {
            g[i][0] = lst[i]%n;
            f[i][0] = (lst[i] - i);
        }
        for(int j=1;j<=63;j++)
            for(int i=0;i<n;i++) {f[i][j] = (f[g[i][j-1]][j-1] + f[i][j-1]);g[i][j] = g[g[i][j-1]][j-1];}
        while(q--)
        {
            int s,x;
            cin>>s>>x;
            s --;
            __int128_t ans = 1LL * (s+1);
            s %= n;
            for(int i=63;i>=0;i--) {if(x & (1LL<<i)){ans = (ans + f[s][i]);s = (g[s][i]);}}
            print(ans%mod,'\n');
        }
        return;
    }
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    solution::solve();
    return 0;
}

record

大样例通过情况:通过了 kingdom1.in,kingdom2.in,kingdom4.in

/kel

2024/11/11 11:57
加载中...