Vacaciones de invierno 2020 [gmoj2410] [Swapity Swap] [Similar a fast power]

Descripción del título

Las N vacas del granjero John (1≤N≤10 ^ 5) se paran en una fila. Para cada 1≤i≤N, el número de la i-ésima vaca de izquierda a derecha es i. El granjero John pensó en un nuevo programa de ejercicio matutino de lácteos. Le dio a las vacas M pares de enteros (L1, R1) ... (LM, RM), donde 1≤M≤100. Les pidió que repitieran los siguientes K pasos (1≤K≤10 ^ 9) veces con M pasos:
para cada paso i de 1 a M: la secuencia actual de la vaca en la posición Li ... Ri se cuenta de izquierda a derecha Su orden
Después de que las vacas repitan este proceso K veces, envíe el número de la i-ésima vaca de izquierda a derecha por cada 1≤i≤N.

De entrada

La primera línea de entrada contiene N, M y K. Para cada 1≤i≤M, la línea i + 1 contiene Li y Ri, ambos enteros en el rango 1 ... N, donde Li <Ri.

Salida

El número del elemento i-ésimo de izquierda a derecha en la secuencia de vaca después de que la secuencia de instrucciones de salida K-ésima se ejecute K veces.

Entrada de muestra

7 2 2
2 5
3 7

Salida de muestra

1
2
4
3
5
7
6

Limitación del rango de datos

Los puntos de prueba 1-2 satisfacen N = K = 100.
Los puntos de prueba 3-5 satisfacen K≤10 ^ 3.
Los puntos de prueba 6-10 no tienen restricciones adicionales.

Pronto

Inicialmente, el orden de las vacas de izquierda a derecha es [1,2,3,4,5,6,7]. Después del primer paso de este proceso, el pedido se convierte en [1,5,4,3,2,6,7]. Después del segundo paso de este proceso, el orden se convierte en [1,5,7,6,2,3,4]. Repita estos dos pasos una vez más para obtener la salida de muestra.

Análisis

Ideas de resolución de problemas
Para la secuencia inicial 1 − N, podemos pensar en ella como el índice de posición de la matriz, entonces cada operación no es para cambiar la posición, independientemente del número en esta posición en este momento, es decir, solo necesitamos obtener M Después de la operación, la posición del bit i-ésimo cambiará y se marcará. Después de cada ronda, solo se necesita ajustar la posición y no es necesario simular M nuevamente.
La idea central de esta pregunta: Convertir el número de serie de esta vez en el siguiente número
Ejemplo: Porque a [1] = 2, entonces b [1] = a [2]. Los subíndices de a y b son iguales, y el 2 de la matriz se convierte en a [2].

Código en

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,k;
int a[35][100001];
/*本题的核心思想:把本次的序号转化为下一次的数
例:因为a[1]=2,所以b[1]=a[2]。a和b的下标相同,a数组的2变成a[2]*/ 
void change(int x,int y)
{
	for(register int i=1;i<=n;i++)
	{
		a[x][i]=a[y][a[x][i]];
	}
	return;
}
int main()
{
	freopen("swap.in","r",stdin);
	freopen("swap.out","w",stdout);
    scanf("%d%d%d",&n,&m,&k);
    for(register int i=1;i<=n;i++) 
    {
    	a[0][i]=a[1][i]=i;
	}
	for(int i=1;i<=m;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		for(register int i=x;i<=(x+y)/2;i++)
		{
			swap(a[1][i],a[1][x+y-i]);
		}
	}
	for(register int i=2;i<=31;i++)
	{
		for(register int j=1;j<=n;j++)
		{
			a[i][j]=a[i-1][j];
		}
		change(i,i-1);
	}
	for(register int i=1;i<=n;i++)
	{
		a[32][i]=a[0][i];
	}
	int count=1;
	while(k!=0)
	{
		if(k%2!=0)
		{
			change(32,count);
		}
		count++;
		k=k/2;
	}
	for(int i=1;i<=n;i++)
	{
		printf("%d\n",a[32][i]);
	}
	fclose(stdin);
	fclose(stdout);
    return 0;
}

110 artículos originales publicados · 100 alabanzas · 8002 visitas

Supongo que te gusta

Origin blog.csdn.net/dglyr/article/details/105676642
Recomendado
Clasificación