Luogu: alineación de partidos de P1966 (aumento + / elección provincial -, divide y vencerás)

tema:

Inserte la descripción de la imagen aquí

Análisis: Al principio, no tenía idea. Eche un vistazo a la solución del problema para fusionar y clasificar. Así que piénsalo por ti mismo.

Si se ordena uno, también se ordena el otro, de modo que se obtendrá el valor mínimo.

Luego, el problema se transforma en una serie de números, que se ordenan después del número mínimo de intercambios.

Después de pensarlo durante mucho tiempo, no lo esperaba, así que miré la solución detenidamente.

Se descubrió que los vecinos habían desaparecido antes de que pudieran mudarse. (Me di cuenta de que esta pregunta debería haberse hecho en el código de acceso y no vi que las adyacentes se movieran)

Está claro, ¿será superfluo si el movimiento de izquierda y derecha se vuelve ordenado?

El conocimiento perceptivo no lo hará.

Enfatice: solo debe considerar avanzar o solo debe considerar retroceder, ¡eso es todo! ! ! ! ! (Marcado como la esencia de la razón)

¡Vale la pena pensarlo!

Por lo tanto, considerando solo el movimiento hacia adelante, entonces debe haber solo el movimiento hacia adelante en la mitad trasera. Y cuando ningún puntero apunta al último elemento, es decir, hay elementos para colocar en ambas partes.

Código:? ? El estado no es bueno, déjalo ir por el momento.

Inserte la descripción de la imagen aquí

#include<bits/stdc++.h>
using namespace std;
#include<bits/stdc++.h>
using namespace std;
int m;
int B[100005];
int ans=0;
struct node{
    
    
 int x1;
 int x2;
} A[100005];
bool cmp(node n1,node n2)
{
    
    
 return n1.x2<n2.x2;
}
void f(int x,int y)
{
    
    //包括下标为x和下标为y的。   从小到大排序 
 if(x==y) return;
 if(x+1==y)
 {
    
    
  if(A[x].x1>A[y].x1) {
    
    
   ans++; swap(A[x].x1,A[y].x1);
   ans=ans%(100000000-3);
  }
  return;
 } 
 int c=(x+y)/2;
 f(x,c);
 f(c+1,y);
 //合并
 int b1=x,b2=c+1;//合并时的两个指针 
 int bb=x;
 while(1)
 {
    
    
  if(b1==c+1 && b2==y+1) break;
  if(b1==c+1)
  {
    
    
   B[bb]=A[b2].x1;bb++;b2++;
  }
  else if(b2==y+1)
  {
    
    
   B[bb]=A[b1].x1;bb++;b1++;
  }
  else{
    
    
   if(A[b1].x1>A[b2].x1) 
   {
    
    
    B[bb]=A[b2].x1;bb++;b2++;
    ans=ans+b2-bb;
    ans=ans%(100000000-3);
    }
   else{
    
    
    B[bb]=A[b1].x1;bb++;b1++;
   }
  }
 }
  for(int i=x;i<=y;i++)
  {
    
    
    A[i].x1=B[i];
 }
}
int main()
{
    
    
  cin>>m; 
  for(int i=0;i<m;i++) cin>>A[i].x1;
  for(int i=0;i<m;i++) cin>>A[i].x2;
  sort(A,A+m,cmp);
  /*for(int i=0;i<m;i++)
  {
   cout<<A[i].x1<<' '<<A[i].x2<<endl;
   } */
  f(0,m-1);
  cout<<ans;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_42721412/article/details/108553343
Recomendado
Clasificación