zoukankan      html  css  js  c++  java
  • JZOJ 4417. 【HNOI2016模拟4.1】神奇的字符串

    不能算解析的解析

    很神仙的题
    知道做法后很容易实现
    这里不写题解
    推荐一个:4417. 【HNOI2016模拟4.1】神奇的字符串
    感谢写此博文的神犇!

    (Code)

    #include<cstdio>
    using namespace std;
    
    const int N = 1e5 + 5;
    int n , m , q , A , B , P , l[N] , r[N] , s[N] , size = 1 , seg[64 * N][3];
    char str[N];
    
    int New(int k , int x){if (!seg[k][x]) seg[k][x] = ++size;}
    
    void update(int x , int y , int v , int l , int r , int k)
    {
    	if (x <= l && r <= y)
    	{
    		seg[k][2] += v;
    		return;
    	}
    	int mid = (l + r) >> 1;
    	if (x <= mid) New(k , 0) , update(x , y , v , l , mid , seg[k][0]);
    	if (y > mid) New(k , 1) , update(x , y , v , mid + 1 , r , seg[k][1]);
    }
    
    int query(int x , int l , int r , int k)
    {
    	if (l == r) return seg[k][2];
    	int mid = (l + r) >> 1;
    	if (x <= mid) return seg[k][2] + query(x , l , mid , seg[k][0]);
    	else return seg[k][2] + query(x , mid + 1 , r , seg[k][1]);
    }
    
    int main()
    {
    	scanf("%d%d%d%d%d" , &n , &A , &B , &P , &m);
    	scanf("%s" , str);
    	for(register int i = 0; i <= m - 1; i++)
    	{
    		s[i] = str[i] - '0';
    		if (s[i] == 0) l[i] = P , r[i] = n - 1;
    		else l[i] = 0 , r[i] = P - 1;
    		l[i] = ((l[i] - A * i) % n + n) % n , r[i] = ((r[i] - A * i) % n + n) % n;
    		if (l[i] <= r[i]) update(l[i] , r[i] , 1 , 0 , n - 1 , 1);
    		else update(l[i] , n - 1 , 1 , 0 , n - 1 , 1) , update(0 , r[i] , 1 , 0 , n - 1 , 1);
    	}
    	scanf("%d" , &q);
    	char op[10];
    	int p;
    	for(; q; q--)
    	{
    		scanf("%s%d" , op , &p);
    		if (op[0] == 'Q') printf("%d
    " , query((A * p + B) % n , 0 , n - 1 , 1));
    		else{
    			if (l[p] <= r[p]) update(l[p] , r[p] , -1 , 0 , n - 1 , 1);
    			else update(l[p] , n - 1 , -1 , 0 , n - 1 , 1) , update(0 , r[p] , -1 , 0 , n - 1 , 1);
    			if (s[p] == 0) l[p] = 0 , r[p] = P - 1;
    			else l[p] = P , r[p] = n - 1;
    			l[p] = ((l[p] - A * p) % n + n) % n , r[p] = ((r[p] - A * p) % n + n) % n;
    			if (l[p] <= r[p]) update(l[p] , r[p] , 1 , 0 , n - 1 , 1);
    			else update(l[p] , n - 1 , 1 , 0 , n - 1 , 1) , update(0 , r[p] , 1 , 0 , n - 1 , 1);
    			s[p] ^= 1;
    		}
    	}
    }
    
  • 相关阅读:
    PHP中的error
    回调函数与PHP实例
    PHP的基本入门知识
    Java script OOP——浅谈
    实现单行或多行文本溢出显示省略号
    ECharts
    session management会话管理的原理
    easyui 入门指南
    H5视频/音频
    CSS清除浮动各种方法
  • 原文地址:https://www.cnblogs.com/leiyuanze/p/13504543.html
Copyright © 2011-2022 走看看