Verwenden Sie mathematische Ideen, um die inverse Operation der Präfixsummen-Differenz-Differenzmatrix zu erklären

Verwenden Sie Mathematik, um die Beziehung zwischen Differenz und Präfixsumme zu erklären

Bevor Sie den Unterschied kennenlernen, müssen Sie das Konzept und die Definition der Präfixsumme überprüfen: Klicken Sie hier, um das Präfix und das Konzept anzuzeigen

Wir kennen die Implementierung des Präfixes und des Codes:s[ i ] = s[ i - 1] + a[ i ];(Gleichung 1)
Das heißt, das Array S speichert die Summe der ersten i Elemente des Arrays a; ich glaube, dies ist leicht zu verstehen, aber wenn es um die Definition von Unterschied geht, ist es leicht zu verwechseln,
warum ist der Unterschied umgekehrt Operation der Präfixsumme?
Schauen wir uns die Definition des Unterschieds an: Der Unterschied ist der Unterschied zwischen zwei benachbarten Zahlen .
Wir können direkt nach seiner Definition wörtlich schreiben:s[ i ] = a[i] - a[i-1];(Gleichung 2)
Das heißt, verwenden Sie das Array S, um die Differenz zwischen jeder benachbarten Nummer des Arrays a aufzuzeichnen.

Wir beobachten diese beiden Formeln und kehren das Array s und das Array a in der Präfixsumme um, um die Formel 2 zu erhalten.
Das heißt, in der Mathematik sei s = a, a = s, dann a [i] = a [i-1] + s [i], setze ein [i-1] auf die andere Seite, um
s [1] zu werden. = a [i] -a [i-1]. Es ist ersichtlich, dass die Präfixsumme und -differenz eine Art inverse Operation sind.

Wir konstruieren eine Menge bn, um zu erfüllen:
av = b1 + b2 + b3 +… + bv;
konstruiere bn so, dass das Array n als Präfixsumme des b-Arrays bezeichnet wird und das b-Array die Differenz des a-Arrays ist

Wir können die Differenz verwenden, um das Problem der Intervallsumme besser zu lösen:
Wenn wir bei einem Array a eine Zahl c in einem der Intervalle [l, r] hinzufügen möchten, können wir for(int i = l ;i <= r; i++) a[i] += c;diese Zeitkomplexität zum ersten Mal verwenden. Es ist O. (n) Wenn das Intervall [l, r] sehr groß ist, können Überstunden leicht verarbeitet werden. Daher verwenden wir Differentialoperationen, s[l] += c; s[r + 1] -= c;um sicherzustellen, dass nur c zwischen dem Intervall l und r hinzugefügt wird.

Schließlich müssen wir auch das Array a nach dem Hinzufügen von c wiederherstellen, direkt "umgekehrt", schauen wir uns das anGleichung 2Der Weg zu einem [i], nämlicha[i] = s[i] + a[i -1]


Beispiel: Differenz
Geben Sie eine Folge von ganzen Zahlen der Länge n ein.

Geben Sie als nächstes m Operationen ein. Jede Operation enthält drei ganze Zahlen l, r, c, was bedeutet, dass jeder Zahl zwischen [l, r] in der Sequenz c hinzugefügt wird.

Bitte geben Sie die Sequenz aus, nachdem alle Vorgänge ausgeführt wurden.

Eingabeformat Die
erste Zeile enthält zwei Ganzzahlen n und m.

Die zweite Zeile enthält n Ganzzahlen, die eine Folge von Ganzzahlen darstellen.

In den nächsten m Zeilen enthält jede Zeile drei ganze Zahlen l, r, c, die eine Operation darstellen.

Das Ausgabeformat besteht aus
einer Zeile mit n Ganzzahlen, die die endgültige Sequenz darstellen.

Datenbereich
1 ≤
n,
m
100000, 1 l r ≤ n, -1000 c ≤ 1000, -1000 ≤ Der Wert des Elements in der ganzzahligen Folge ≤ 1000
Eingabebeispiel:

6 3
1 2 2 1 2 1
1 3 1
3 5 1
1 6 1

Beispielausgabe:

3 4 5 3 4 2

C ++ Implementierung:

#include<iostream>

using namespace std;

const int N = 100010; 

int n,m;
int a[N],b[N];

void insert(int l, int r,int c)
{
    
    
	b[l] += c;
	b[r + 1] -=c;
}

int main()
{
    
    
	
	scanf("%d%d",&n,&m);
	for(int i = 1; i <= n;i ++ ) scanf("%d",&a[i]);
	
	for(int i = 1; i <= n;i ++ ) insert(i, i ,a[i]);  
//相当于	for(int i = 1; i <= n; i ++) b[i] = a[i] - a[i-1];
	
	while(m -- )
	{
    
    
		int l, r, c;
		scanf("%d%d%d",&l,&r,&c);
		insert(l,r,c);
	}	
	//求原数组差分后的情况: 
	for(int i = 1; i <= n; i ++) b[i] += b[i - 1];  //通过b[i] = b[i] + b[i-1]分解出原数组的a[]的情况 
	for(int i = 1; i <= n;i ++ ) printf("%d ", b[i]);
	
//或者  for(int i = 1; i <= n ; i ++) a[i] = b[i]+ a[i-1];
//   	for(int i = 1; i <= n ; i++) printf("%d ",a[i] );
	return 0;
 } 

Die Differentialmatrix gibt
eine Ganzzahlmatrix mit n Zeilen und m Spalten ein und gibt dann q Operationen ein. Jede Operation enthält fünf Ganzzahlen x1, y1, x2, y2, c, wobei (x1, y1) und (x2, y2) ein Sub darstellen Koordinaten der oberen linken Ecke und der unteren rechten Ecke der Matrix.

Jede Operation muss c zum Wert jedes Elements in der ausgewählten Untermatrix hinzufügen.

Bitte geben Sie die Matrix aus, nachdem alle Vorgänge abgeschlossen sind.

Eingabeformat Die
erste Zeile enthält Ganzzahlen n, m, q.

In den nächsten n Zeilen enthält jede Zeile m Ganzzahlen, die eine Matrix von Ganzzahlen darstellen.

In der nächsten Zeile q enthält jede Zeile 5 Ganzzahlen x1, y1, x2, y2, c, die eine Operation darstellen.

Das Ausgabeformat
enthält n Zeilen und m Ganzzahlen in jeder Zeile, die die endgültige Matrix darstellen, nachdem alle Operationen abgeschlossen wurden.

Datenbereich 1
≤ n,
m

1000,
1
q ≤ 100000, 1 x 1 ≤ x 2 n, 1 y 1 ≤ y 2 m, –1000 c 1000, –1000 ≤ Der Wert des Elements in der Matrix ≤1000
Eingabe Beispiel:

3 4 3
1 2 2 1
3 2 2 1
1 1 1 1
1 1 2 2 1
1 3 2 3 2
3 1 3 4 1

Beispielausgabe:

2 3 4 1
4 3 4 1
2 2 2 2
#include<iostream>

using namespace std;

const int N = 1010;

int n, m, q;
int a[N][N], b[N][N]; 

void insert(int x1, int y1, int x2, int y2, int c)
{
    
    
	b[x1][y1] += c;
	b[x2 + 1][y1] -= c;
	b[x1][y2 + 1] -= c;
	b[x2 + 1][y2 + 1] += c;
}

int main()
{
    
    
	scanf("%d%d%d",&n, &m, &q);
	
	for(int i = 1; i <= n; i ++ )
	{
    
    
		for(int j = 1; j <= m; j ++)
			scanf("%d",&a[i][j]);
	}
	for(int i= 1; i <= n ;i ++)
	{
    
    
		for(int j = 1; j <= m ; j ++)
		{
    
    
			insert(i, j, i, j, a[i][j]);
		}
	}
	
	while(q--)
	{
    
    
		int x1, y1, x2, y2, c;
		cin >> x1 >> y1 >> x2 >> y2 >> c;
		insert(x1, y1, x2, y2, c);
	}
	
	for(int i =1; i <= n; i ++)
	{
    
    
		for(int j = 1; j <= m; j ++)
			b[i][j] += b[i - 1][j] + b[i][j -1] - b[i -1][j - 1];
	}
	
	for(int i = 1; i <= n; i ++)
	{
    
    
		for(int j = 1; j <= m; j ++)
			printf("%d ",b[i][j]);
		puts(" ");
	}
	
	return 0;
 }

Ich denke du magst

Origin blog.csdn.net/diviner_s/article/details/107350117
Empfohlen
Rangfolge