2 条题解

  • 2
    @ 2025-4-12 20:53:22
    using namespace std;
    const int inff = 1e5 + 10;
    long long n,m,vis[inff],c;
    struct myst {
    	long long left,right,lazy,sum;
    } tree[inff * 4 + 1];
    void renewup(long long node) {
    	tree[node].sum = tree[node * 2].sum + tree[node * 2 + 1].sum;
    	return;
    }
    void renewdown(long long node) {
    	if (tree[node].lazy) {
    		tree[node * 2].sum = (tree[node * 2].right - tree[node * 2].left + 1)-tree[node * 2].sum;
    		tree[node * 2].lazy = !tree[node * 2].lazy;
    		tree[node * 2 + 1].sum = (tree[node * 2 + 1].right - tree[node * 2 + 1].left + 1)-tree[node * 2 + 1].sum;
    		tree[node * 2 + 1].lazy = !tree[node * 2 + 1].lazy;
    		tree[node].lazy = 0;
    	}
    
    	return;
    }
    void build(long long node,long long l,long long r) {
    	tree[node].left = l;
    	tree[node].right = r;
    	if (l == r) {
    		return;
    	}
    	
    	long long mid = l + r >> 1;
    
    	build(node * 2,l,mid);
    	build(node * 2 + 1,mid + 1,r);
    	renewup(node);
    
    	return;
    }
    void update(long long node,long long l,long long r,long long k)
    {
    	if (tree[node].left >= l && tree[node].right <= r)
    	{
    		tree[node].sum = tree[node].right - tree[node].left + 1 - tree[node].sum;
    		tree[node].lazy = !tree[node].lazy;
    		return;
    	}
    	renewdown(node);
    	long long mid = tree[node].left + tree[node].right >> 1;
    	if (mid >= l)
    	{
    		update(node * 2,l,r,k);
    	}
    	if (mid < r)
    	{
    		update(node * 2 + 1,l,r,k);
    	}
    	renewup(node);
    	return;
    }
    long long get(long long node,long long l,long long r)
    {
    	if (tree[node].left >= l && tree[node].right <= r)
    	{
    		return tree[node].sum ;
    	}
    	renewdown(node);
    	long long mid = tree[node].left + tree[node].right >> 1,sum = 0;
    	if (mid >= l)
    	{
    		sum += get(node * 2,l,r);
    	}
    	if (mid < r)
    	{
    		sum += get(node * 2 + 1,l,r);
    	}
    	return sum;
    }
    int main() {
    	cin >> n >> m;
    	build(1,1,n);
    	while(m--) 
    	{
    		cin >> c;
    		long long a,b;
    		if (c == 0)
    		{
    			cin >> a >> b;
    			update(1,a,b,39);
    		}
    		else
    		{
    			cin >> a >> b;
    			cout << get(1,a,b) << endl;
    		}				
    	}
    	return 0;
    }

    信息

    ID
    5054
    时间
    1000ms
    内存
    256MiB
    难度
    (无)
    标签
    (无)
    递交数
    0
    已通过
    0
    上传者