[Noveno ejercicio de la clase introductoria de la Competencia de algoritmos de Niuke 2020] Árbol de líneas de preguntas de inicio de sesión (pregunta de agua)

Enlace del tema: pregunta de inicio de sesión

Título

No tengo mucho significado en chino

responder

Si realmente usa la plantilla que proporciona, hay una alta posibilidad de T. De todos modos, yo mismo escribí un árbol de segmento de línea.
Obviamente, ni siquiera necesitamos construir un árbol esta vez. Lo que tenemos que hacer es actualizar continuamente los marcadores de intervalo, actualizar las respuestas de intervalo marcadas y luego actualizar las respuestas hacia arriba. Puede usar una matriz de árbol para almacenar las respuestas para cada intervalo, y finalmente Cada vez que consultamos 1 ~ L, la respuesta es árbol [1].

Código

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<bitset>
#include<cassert>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<deque>
#include<iomanip>
#include<list>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
using namespace std;
//extern "C"{void *__dso_handle=0;}
typedef long long ll;
typedef long double ld;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define lowbit(x) x&-x

const double PI=acos(-1.0);
const double eps=1e-6;
const ll mod=1e9+7;
const int inf=0x3f3f3f3f;
const int maxn=2e5+10;
const int maxm=100+10;
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

ll addv[maxn<<2],tree[maxn<<2];
set<pii> L;

void pushup(int p,int l,int r)
{
    
    
	if(addv[p]) tree[p]=r-l+1;
	else if(l!=r) tree[p]=tree[p*2]+tree[p*2+1];
	else tree[p]=0;
}

void add(int p,int l,int r,int addl,int addr,int v)
{
    
    
	if(addl<=l && addr>=r)
	{
    
    
		addv[p]+=v;
		int tmp=min(addv[p*2],addv[p*2+1]);
		addv[p*2]-=tmp,addv[p*2+1]-=tmp;
		addv[p]+=tmp;
		pushup(p,l,r);
		return ;
	}
	int mid=l+(r-l)/2;
	if(addl<=mid) add(p*2, l, mid, addl, addr, v);
	if(addr>mid) add(p*2+1,mid+1,r,addl,addr,v);
	pushup(p,l,r);
}

int main()
{
    
    
	ios;
	int m,n;
	cin >> m >> n;
	while(m--)
	{
    
    
		int op,l,r; cin >> op >> l >> r;
		if(op==1) 
		{
    
    
			if(L.find(mp(l,r)) != L.end()) continue;
			L.insert(mp(l,r));
			add(1, 1, n, l, r, 1);
		}
		else if(op==2) 
		{
    
    
			if(L.find(mp(l,r)) == L.end()) continue;
			L.erase(mp(l,r));
			add(1,1,n,l,r,-1);
		}
		else cout << tree[1] << endl;
	}
}

Supongo que te gusta

Origin blog.csdn.net/weixin_44235989/article/details/108024157
Recomendado
Clasificación