http://codeforces.com/contest/1333/problem/C
Significado áspero:
Si un subintervalo, la suma de cualquiera de sus subintervalos no es 0, entonces es bueno, encuentre el número de tales subintervalos
1 #include <bits / stdc ++. H> 2 typedef largo largo LL; 3 const int INF = 0x3f3f3f3f ; 4 const doble eps = 1e- 8 ; 5 const int mod = 1e8; 6 const int maxn = 2e5 + 10 ; 7 usando el espacio de nombres estándar; 8 9 mapa <LL, LL> mp; 10 11 int main () 12 { 13 #ifdef DEBUG 14 freopen ( " sample.txt " , " r " , stdin); 15 #endif 16 17 int n; 18 scanf ( " % d " , & n); 19 LL pos = 1 ; // Registre el último intervalo y Cuando la posición es 0, la posición inicial es 1 (el número 0 se inserta en la posición 1) 20 LL sum = 0 ; // prefijo y 21 LL ans = 0 ; 22 mp [ 0 ] = 1 ; // el número 0 se inserta en la posición 1 23 para ( inti = 2 ; i <= n + 1 ; i ++) // equivalente a sumar un número 0 en el frente, por lo que el número es todo +1 24 { 25 int x; 26 scanf ( " % d " , & x); 27 sum + = X; 28 IF (mp.count (SUM)) 29 { 30 POS = max (POS, MP [SUM]); 31 es ANS = + I- (POS + . 1 ) + . 1 - . 1 ; // -1 debido a que el intervalo [ La suma de pos + 1, i] es 0, para restar este intervalo 32 } 33 más ans + = i- (pos +1 ) + 1 ; // Agregar intervalo [pos + 1, i], [pos + 2, i], [pos + 3, i] ... [i, i] 34 mp [sum] = i; 35 } 36 printf ( " % lld \ n " , ans); 37 38 devuelve 0 ; 39 }
-