线段树求助!!!
查看原帖
线段树求助!!!
239169
荷叶下楼主2021/3/18 19:00
#include <bits/stdc++.h>
#define ll long long
#define MAXN 10010
using namespace std;
struct node
{
	int i, l, r;
	ll val, miao, add;
	bool HaveGrown;
}tree[MAXN * 4];
int l, n, ans1;
int ls(int i){return i<<1;}
int rs(int i){return i<<1|1;}

int read_()
{
    int s = 0, w = 1;
    char ch = getchar();
    while(ch < '0' || ch > '9')
    {
        if(ch == '-')
            w = -1;
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9')
    {
        s = s * 10 + ch - '0';
        ch = getchar();
    }
    return s * w;
}

void build(int i, int l, int r)
{
	tree[i].l = l; tree[i].r = r;
    if(l == r)
    {
    	tree[i].val = 1;
    	tree[i].miao = 0;
    	return ;
    }
    int mid= (l + r)/2;
    build(ls(i), l, mid);
    build(rs(i), mid + 1, r);
    tree[i].val = tree[ls(i)].val + tree[rs(i)].val;
};

void change(int i, int l, int r, int op)
{
	if(tree[i].l==tree[i].r)
	{
		if(!op)
		{
			if(tree[i].miao)
				++ans1; 
			tree[i].miao = 0;
			tree[i].val = 0; 
		}
		if(op)
		{
			if(!tree[i].val)
				tree[i].miao = 1; 
			tree[i].val = 1;
		}
		return ;
	}
	int mid= (l + r)>>1;
	if(l <= mid)
		change(ls(i), l, r, op);
	if(mid + 1 <= r)
		change(rs(i), l, r, op);
	tree[i].val = tree[ls(i)].val + tree[rs(i)].val;
	tree[i].miao = tree[ls(i)].miao + tree[rs(i)].miao;
		
	
}

int main()
{
    l = read_(); n = read_();
    build(1, 0, l);
    for(int i = 1; i <= n; i++)
    {
		int x, y, z; x = read_(); y = read_(); z = read_();
		change(1, y, z, x);
    }
    cout << tree[1].miao << endl << ans1 ;
    return 0;
}
2021/3/18 19:00
加载中...