线段树(乘和加)

题目

#include <bits/stdc++.h>
#define int long long
using namespace std;
#define lson p << 1
#define rson p << 1 | 1
const int maxn = 2e5 + 5;
int m, n;
string s, x;
struct Node{
    int add, mul;
}t[maxn * 4];
int ans[maxn];
// int lazy_add[maxn * 4]; // lazy_add[p]==k表示以p为祖先的结点还没加上k*区间长度
// int lazy_mul[maxn * 4]; // 表示以p为祖先还没乘上k
void push_up(int p)
{
    t[p].mul = t[lson].mul * t[rson].mul;
    t[p].add = t[lson].add * t[rson].mul + t[rson].add;
}
void build(int p, int l, int r)
{
	if (l == r)
	{
        if(s[l] == 'A'){//A操作相当于x = -x - 1
            t[p].mul = -1;
            t[p].add = -1;
        }
        else{//B操作相当于x = x + 1
            t[p].mul = 1;
            t[p].add = 1;
        }
		return;
	}
	int mid = (l + r) >> 1;
	build(lson, l, mid);
	build(rson, mid + 1, r);
	push_up(p);
}
Node combine(Node a, Node b){
    Node res;
    res.mul = a.mul * b.mul;
    res.add = a.add * b.mul + b.add;
    return res;
}
 Node query(int p, int l, int r, int x, int y)
{
	if (x <= l && y >= r)
	{
		return t[p];
	}
	int mid = (l + r) >> 1;
    Node res = {0, 1};
	if (x <= mid)
		res = combine(res, query(lson, l, mid, x, y));
	if (y >= mid + 1)
		res = combine(res, query(rson, mid + 1, r, x, y));
	return res;
}
int to_num(string s){
    int res = 0;
    for(int i = 0; s[i]; i++){
        res = res * 2 + s[i] - '0';
    }
    return res;
}
string change(int x){
    string s;
    for(int i = m - 1; i >= 0; i--){
        if((x >> i) & 1) s += '1';
        else s += '0';
    }
    return s;
}
signed main()
{   
    ios::sync_with_stdio(0);
    cin.tie(0);
	int q, i, j;
	cin >> n >> q;
	cin >> s;
    s = ' ' + s;//右移!!!!
	build(1, 1, n);
	for(i = 1; i <= q; i++)
	{
        int l2, r2, l, r;
        cin >> l >> r >> x;
        m = x.size();
        int num = to_num(x);
        l2 = l, r2 = r;
        //l = min((ans[i - 1] ^ l2) % n + 1, (ans[i - 1] ^ r2) % n + 1);
        //r = max((ans[i - 1] ^ l2) % n + 1, (ans[i - 1] ^ r2) % n + 1);
        Node res = query(1, 1, n, l, r);
        num = num * res.mul + res.add;
        cout << l << ' ' << r << ' ' << res.mul << ' ' << res.add << '\n';
        string str = change(num);
        cout << str << '\n';
        ans[i] = to_num(str);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

__night_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值