栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

炸鸡块君与FIFA22(st表)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

炸鸡块君与FIFA22(st表)

https://ac.nowcoder.com/acm/contest/23106/B
#include

using namespace std;
typedef long long ll;
const int log1 = 21;
const int N = 2e5 + 1;

int logn[N];
int f[3][N][log1 + 1];
int n, q;

int mod (int x) {
	return (x % 3 + 3) % 3;
}

signed main () {
    cin >>n >> q;
    char s[N  +1];
    cin >> (s + 1);
    for (int j = 0; j <= 20; j++)
    for (int i = 1; i<= n; i ++) {
        int t;
        	if (j == 0) {
        		if (s[i] == 'W')  {
        			f[0][i][j] = f[1][i][j] = f[2][i][j] = 1; 
				}
				else if (s[i] == 'L') {
					f[0][i][j] = 0;
					f[1][i][j] = f[2][i][j] = -1;
				}
				else f[0][i][j] = f[1][i][j] = f[2][i][j] = 0;
			}
			else {
				int p1 = i, p2 = i + (1 << (j - 1)); 
				if (p2 > n) {
					f[0][p1][j] = f[0][p1][j - 1];
					f[1][p1][j] = f[1][p1][j - 1];
					f[2][p1][j] = f[2][p1][j - 1];
				}
				else {
					f[0][p1][j] = f[0][p1][j - 1] + f[mod(f[0][p1][j - 1])][p2][j - 1];
					f[1][p1][j] = f[1][p1][j - 1] + f[mod(1 + f[1][p1][j - 1])][p2][j - 1];
					f[2][p1][j] = f[2][p1][j - 1] + f[mod(2 + f[2][p1][j - 1])][p2][j - 1];
				}
			}
         
    }
   
    while (q --) {
        int l, r, c;
        cin >> l >> r >> c;

        int pos = l;
        int ans = c;
        while (pos <= r) {
        	int j = 0;
        	while (pos + (1 << j) - 1<= r) j ++;
        	j --;
        	ans += f[ans % 3][pos][j];
        	pos += (1 << j);
		}
		cout << ans << endl;
    }
}

[l, l + (1 << (j - 1)) - 1] [l + (1 << (j - 1)), r].需要遍历哪些部分就一个倍增的增加就行了。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/717595.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号