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;
    		}
    	}
    }
    
  • 相关阅读:
    3.2 Program Encodings 程序编码
    Describe your home
    Building vs solution in command line
    找到适合自己的人生轨迹 Angkor:
    每个月总有那么几天不想学习,不想写代码 Angkor:
    Linux下的Memcache安装
    敏捷开发之 12条敏捷原则
    为什么要用NIO
    memcached server LRU 深入分析
    Linux 脚本编写基础
  • 原文地址:https://www.cnblogs.com/leiyuanze/p/13504543.html
Copyright © 2011-2022 走看看