动态开点求调
查看原帖
动态开点求调
325243
DEMAC楼主2024/7/27 07:56

rt,wa, found '50000000'.

#include<bits/stdc++.h>
using namespace std;
#define int long long 

struct {
	struct Node {
		int sum,tag;
		int l=0,r=0;
	}tree[(int)15e5+10];

	int psz=1;
	int get(int& u) {
		return (u?u:u=++psz);
	}

	void pushup(int u) {
		tree[u].sum=tree[tree[u].l].sum+tree[tree[u].r].sum;
	}

	void pushdown(int u,int l,int r) {
		if(tree[u].tag) {
			int tag = tree[u].tag;
			tree[get(tree[u].l)].sum=(tag==1)*((l+r)/2-l+1);
			tree[get(tree[u].r)].sum=(tag==1)*(r-(l+r)/2);
			tree[get(tree[u].l)].tag=tag;
			tree[get(tree[u].r)].tag=tag;
			tree[u].tag=0;
		}
	}
	
	void modify(int u,int l,int r,int s,int t,int x) {
		int mid=(l+r)>>1;
		if(s<=l&&r<=t) {
			tree[u].sum=x?r-l+1:0;
			tree[u].tag=x?1:-1;
			return;
		}
		pushdown(u,l,r);
		if(s<=mid) modify(get(tree[u].l), l, mid, s, t, x);
		if(t>mid)  modify(get(tree[u].r), mid+1, r, s ,t ,x);
		pushup(u);
	}

	int query(int u,int l,int r,int s,int t) {
		if(s<=l&&r<=t) return tree[u].sum;
		int mid=(l+r)>>1;
		int ret = 0;
		pushdown(u,l,r);
		if(s<=mid) if(tree[u].l) ret+=query(get(tree[u].l), l, mid, s, t);
		if(t> mid) if(tree[u].r) ret+=query(get(tree[u].r), mid+1, r, s, t);
		return ret;
	}
} tree;
char *p1,*p2,buf[100000];
#define nc() (p1==p2 && (p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
int read()
{
    int x=0,f=1;
    char ch=nc();
    while(ch<48||ch>57)
    {
        if(ch=='-')
            f=-1;
        ch=nc();
    }
    while(ch>=48&&ch<=57)
        x=x*10+ch-48,ch=nc();
   	return x*f;
}

void write(int x)
{
    if(x<0)
        putchar('-'),x=-x;
    if(x>9)
        write(x/10);
    putchar(x%10+'0');
    return;
}
main() {
	int n,q;
	n=read(), q=read();
	while(q--) {
		int l,r,op;
		l=read(),r=read(),op=read();
		if(op==1) {
			tree.modify(1,1,n,l,r,1);
		}
		else if(op==2) {
			tree.modify(1,1,n,l,r,0);
		}else{
			write(tree.query(1,1,n,l,r));
			puts("");
		}
		write(n-tree.tree[1].sum);
		puts("");
	}
}



2024/7/27 07:56
加载中...