CodeForces - 915E dynamique arbre segment de prescription

 

titre

N-éclairé lampe de nuit, numérotés de 1 à n.

Maintenant, il y a deux modes de fonctionnement, comme suit:

  • Opération 1, pour éteindre la référence [l, r] lampe intervalle
  • 2 le fonctionnement, l'étiquette ouverte [l, r] lampe intervalle

Q fois d'interrogation ci-dessous, chaque requête effectuée dans lequel un format de requête de fonctionnement, l, r, k, type de k pour effectuer des opérations. Pour chaque demande de répondre au nombre actuel de lampe ouvert.

Contribution

Un seul ensemble d'entrées, une première ligne contient un nombre entier n, une deuxième rangée un entier q (1≤n≤10 ^ 9,1≤q≤3 · 10 ^ 5)

La ligne suivante 3 de chaque rangée représente un nombre entier de requête q, l, r, k (1 ≤ l ≤ r ≤ n, 1 ≤ k ≤ 2).

Production

Pour chaque demande de répondre à un nombre entier par ligne représente la réponse.

Exemple

Contribution
4 
6
1 2 1
3 4 1
2 3 2
1 3 2
2 4 1
1 4 2
Production
2 
0
2
3
1
4

 

solution:

Parce que la ligne d'arbre à l'espace ouvert quatre fois. Mais le visage des données énormes que nous maxn << 2 espace ouvert est ouvert certainement le trop-plein.

À ce moment, nous devrions utiliser l'arbre de segment de prescription dynamique pour sauver l'espace. (Ou discret)

 

point ouvert dynamique qui est utilisé lorsque le nœud est seul espace alloué à elle, ou non alloué, sur des questions telles que la taille de n est 1e9, puis ouvrez la statique est certainement la place pour frites ,,, mais vous le trouver 3e5 a également demandé une gamme, visible utilisée dans une minorité, donc chaque fois que nous lui donnons à utiliser une gamme d'espace de distribution

 

code:

1  / * 
2  动态开点线段树
 3  * / 
4 #include <stdio.h>
 5 #include < string .h>
 6 #include <iostream>
 7 #include <algorithme>
 8 #include <file>
 9 #include < vecteur>
 10 en  utilisant l'  espace de noms std;
11  const  int maxn = 3e5 + 10 ;
12  const  int INF = 0x3f3f3f3f ;
13 typedef longue  longue ll;
14  struct Node
 15  {
16      int L, R & lt, SUM, paresseux;
 . 17      l'arbre ()
 18 est      {
 19.          L = 0 , R & lt = 0 , SUM = 0 , le lazy = 0 ;
 20 est      }
 21 est } Noeud [MAXN * 50 ];
 la figure 22 est  int CNT = 1. ;   // nombre de points pour ouvrir 
23 est  vide pushdown ( int l, int R & lt, int K) // K est le numéro de noeud parent dans le tableau 
24  {
 25      int MID = (l + R & lt) >> 1. ;
 26 est      SI(l =! r)
 27      {
 28          si (noeud [k] .l!) noeud [k] .l = ++ cnt;
29          si (! Noeud [k] .r) noeud [k] .r = ++ cnt;
30  
31          si (noeud [k] .lazy == 2 )
 32          {
 33              nœud [noeud [k] .l] .sum = noeud [noeud [k] .r] .sum = 0 ;
34          }
 35          autre 
36          {
 37              nœud [noeud [k] .l] .sum = mi-l + 1 ;
38              node [noeud [k] .r] .sum = r- milieu;
39          }
 40         Noeud [Node [K] .L] = .lazy noeud [K] .lazy;
 41 est          Noeud [Node [K] .r] = .lazy noeud [K] .lazy;
 42 est      }
 43 est      Noeud [K] .lazy = 0 ;
 44  }
 45  // à l' arbre de segment est inséré à l' intérieur d' un intervalle [l, R & lt] 
46 est  vide l'insert ( int l, int R & lt, int & K, int l, int R & lt, int P)
 47  {
 48      IF (! K) K = cnt ++;   // cela , il est équivalent à k nous voulons noeud [k] ce noeud fonctionne
 49      // le nœud [1] est le nœud racine, car cela est une dynamique nous point ouvert, donc il n'y a pas de nœuds points sont ouverts la valeur initiale de 0 
50      SI(L> = R & lt && L <= R & lt)   // s'il n'y a pas besoin de répondre à cette pushdown condition, parce que nous ne avons pas besoin les noeuds suivants peuvent être obtenus [l, r] dans la section de réponse 
51 est      {
 52 est          SI (P == 2 ) Node [K] .sum = 0 ;
 53 est          l'autre noeud [K] = R & lt .sum-l + 1. ;
 54 est          Noeud [K] .lazy = P;
 55          rendement ;
 56 est      }
 57 est      // Si non la détermination ci - dessus, nous entrerons au sujet de nœud enfant récursive k, cette fois vous devez vous assurer que les sous-points ont été modifiés et
 58      // par exemple, paresseux paresseux est étiquetée 0 
59      IF (le noeud [k] .lazy) pushdown (l, R & lt, K);
 60      int MID = (L + R & lt) >> . 1 ;
 61 est      SI (MID> =L) Insert (l, milieu, noeud [k] .l, L, R, p);
62      si (mi <R) Insert (mi + 1 , r, noeud [k] .r, L, R, p);
63      node [k] = .sum noeud [noeud [k] .l] .sum + noeud [noeud [k] .r] .sum;
64  }
 65  int main ()
 66  {
 67      // printf ( "% d% d \ n", au noeud [1] .l, au noeud [1] .r); 
68      int n, q;
69      scanf ( " % d% d " , et n, et q);
70      int k = 1 ;
71      pour ( int i = 1 ; i <= q; i ++ )
 72     {
 73          int l, r, p;
74          scanf ( " % d% d% d " , & l, & r, et p);
75          Insert ( 1 , n, k, l, r, p);
76          printf ( " % d \ n " , n-noeud [ 1 ] .sum);
77      }
 78      retour  0 ;
79 }

 

Je suppose que tu aimes

Origine www.cnblogs.com/kongbursi-2292702937/p/12621431.html
conseillé
Classement