CF1326C Permutación particiones 题 解,

vínculo del título original

Brevemente significado de las preguntas:

Dado un \ (. 1 \) ~ \ (n- \) se sustituye, la matriz se divide en \ (K \) intervalos, de modo que el valor máximo de cada intervalo y el máximo. Encuentra este valor, y el número de particiones del programa.

La clave es \ (. 1 \) ~ \ (n \) reemplazado.

Obviamente, sólo hay que poner el \ (n - k + 1 \ ) a \ (n \) de este párrafo, cada sub-sección de un (el resto de los puntos aleatorios).

Obviamente, la primera respuesta se puede extraer:

\ [(N-k + 1) + (n-k + 1) + \ cdots + (n-1) + n \]

(Obviamente, se puede utilizar la aritmética de suma secuencia, pero no será necesario, cuando el segundo, mientras que la búsqueda de respuestas, se puede encontrar el camino ah )

Por ejemplo :( a una tercera muestra, por ejemplo)

7 3
2 7 3 1 5 4 6

A continuación, se pone \ (5 \) , \ (6 \) , \ (7 \) como el valor máximo de cada intervalo.

En este punto se encuentra, por ejemplo, \ (3 \ espacio de 1 \) en este párrafo.

Es bien todos van a \ (7 \) , todos bajo \ (5 \) , o dividido en dos secciones, la vuelta izquierda \ (7 \) , el derecho al retorno \ (5 \) .

Por lo tanto, usted piensa, esto es equivalente a cualquier posición que usted puede ponerlo en segmentos. (Incluyendo la extrema izquierda y la extrema derecha, pertenecen a este período de tiempo)

Entonces, el número de programa es \ (3 \) .

Está \ (5 \) posición se resta \ (7 \) posición, es decir, \ (5 - 2 = 3 \) .

Y un total de tres tramos, se calcularon. De acuerdo con el principio de multiplicación disponibles:

\ [1 \ times 3 \ times 2 = 6 \]

Por lo tanto, la segunda respuesta es:

Cada \ (\ geq n - k + 1 \) de un número de anterior \ (\ geq n - k + 1 \) el producto de la diferencia del número de posiciones.

El primer cero (\ geq n - k + 1 \) \ posición de los números, creemos que \ (0 \) .

Recuerde abrir \ (\ texttt Long Long} {\) .

OI década inútil, se abre mucho tiempo para ver los padres

#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const ll MOD=998244353;

inline int read(){char ch=getchar();int f=1;while(ch<'0' || ch>'9') {if(ch=='-') f=-f; ch=getchar();}
    int x=0;while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*f;}

int n,k,last;
ll s=0,cnt=1;

int main(){
    n=read(),k=read();
    for(int i=1,t;i<=n;i++) {
        t=read(); if(t>n-k) {
            s+=t; if(!last) last=i; //维护上一个 >= n - k + 1 的数的位置
            else cnt=cnt*(i-last)%MOD,last=i; //计数
        } 
    } printf("%lld %lld\n",s,cnt); 
    return 0;
}

Supongo que te gusta

Origin www.cnblogs.com/bifanwen/p/12545373.html
Recomendado
Clasificación