关于此程序
查看原帖
关于此程序
895690
gghack_Nythix楼主2024/11/10 19:18

在第八个点(i=0Si=0\sum\limits_{i=0}^{\infty} S_i=0)这一个点我的程序会 WA 是为什么?

# include <bits/stdc++.h>
# define int long long
//# define calc (x) 
using namespace std;
const int N = 4e5 + 5 , mod = 1e9 + 7;
int n , m , q , sum[N] , nxt[N][65] , nxtpos[N][65];
int pos = -1,rpos = -1;
char s[N];
static inline void print (int x) {
    if (x < 0) x = -x,putchar('-');
    if (x >= 10) print(x / 10);
    putchar(x % 10 + '0');
}
class Merge_Set {
	public:
		int s[N];
		void init (int sz) { iota(s + 1 , s + sz + 1 , 1); }
		int find (int x) { return s[x] == x?s[x]:s[x] = find(s[x]); }
		void merge (int x , int y) { s[find(x)] = find(y); }
	private:
} mq ;
static inline int calc (int x) { return x % n + ( x % n == 0 ) * n; }
void solve () {
	int st , k, stt;
	cin >> st >> k;
	stt = st;
	if (sum[n] == 0) return cout << (stt % mod + k % mod) % mod << "\n",void();//没有这一句是95分
	st = calc(st);
	int ans = 0;
	for (int i = 63ll;i >= 0ll;--i) {
		if ((k >> i) & 1ll) ans = (ans + nxt[st][i]) % mod , st = calc (nxtpos[st][i]);
	}
	cout << (stt % mod + ans % mod) % mod << "\n";
	return void ();
}
signed main () {
	// freopen("kingdom4.in","r",stdin);
	// freopen("kingdom.out","w",stdout);
	ios::sync_with_stdio(false);
	cin >> n >> m >> q;
	for (int i = 1;i <= n;++i) cin >> s[i];
	for (int i = 1;i <= n;++i) sum[i] = sum[i - 1] + (s[i] == '1');
	mq.init (n);
	for (int i = n;i >= 1;--i) if (s[i] == '1') {pos = i ; break;}
	rpos = pos;
	for (int i = 1;i <= n;++i) {
		if (s[i] == '0' && mq.find(i) == i) mq . merge (i , rpos);
		else if (s[i] == '1') rpos = i;
	}
	for (int i = 1;i <= n;++i) {
		int nex = calc(i + m) ;
		if ((i + m < n && sum[nex] - sum[i] == 0) || (i + m > n && m < n && sum[i] - sum[nex] == sum[n] ) || (i + m > n && m >= n && sum[n] == 0)) {
			nxt[i][0] = 1;
			nxtpos[i][0] = calc (i + 1);
			continue;
		}
		int step = (nex - mq.find(nex) < 0 ? nex + n - mq.find(nex) : nex - mq.find(nex));
		nex = mq . find (nex) ;
		nxt[i][0] = m - step;
		nxt[i][0] %= mod; 
		nxtpos[i][0] = calc ( nex );
	}
	for (int bit = 1;bit <= 63;++bit) {
		for (int i = 1;i <= n;++i) {
			nxtpos[i][bit] = nxtpos[nxtpos[i][bit - 1]][bit - 1];
			nxt[i][bit] = nxt[i][bit - 1] % mod + nxt[nxtpos[i][bit - 1]][bit - 1] % mod ;
			nxt[i][bit] %= mod;
		}
	} 
	while (q -- > 0) solve ();
}
2024/11/10 19:18
加载中...