Codeforces Round # 631 (Div. 2) -Gracias, Denis aramis Shitov! Número de jugadores 10889
[codeforces 1330C] A Dreamoon le gusta colorear procesamiento extremo
Ver https://blog.csdn.net/mrcrack/article/details/103564004 para el catálogo general
Dirección de evaluación en línea https://codeforces.com/contest/1330/problem/C
Problema | Solo | Veredicto | Hora | Memoria |
---|---|---|---|---|
C - A Dreamoon le gusta colorear | GNU C ++ 11 | Aceptado | 61 ms | 900 KB |
Comprender el tema es la clave,
La celda tendrá el color de la última operación.
Todos los colores aparecerán al menos una vez y todas las celdas serán coloreadas.
Como puede ver en las dos oraciones anteriores, la restricción es que todas las cuadrículas están teñidas y se pueden ver todos los colores .
Ideas:
Simulación manual:
Organice los colores de la manera más compacta, es decir, una cuadrícula y un color, pero ejemplos inviables
用最紧凑方式安排颜色,即1个格子1种颜色,但不可行的样例
Input:
5 3
1 1 4
Output:
0
颜色i 1 2 3
l[i] 1 1 4
可摆放格子的区间 [1,5] [1,5] [1,2]
可以看到,颜色1摆放到格子1,可行;颜色2摆放到格子2,可行;
颜色3摆放到格子3,不可行,因颜色3可拜放的格子区间是[1,2].
Organice los colores de la manera más relajada, los colores se colocan en l [i] cuadrículas, pero ejemplos inviables
用最宽松方式安排颜色,i种颜色摆放在l[i]个格子中,但不可行的样例
Input:
5 2
2 2
Output:
0
颜色1摆放在的格子区间[1,2]
颜色2摆放在的格子区间[3,4]
很明显,格子区间[5],无染色,故不可行。
但上面2种颜色,已经尽了最大努力。
Es un ejemplo factible entre la disposición de color más compacta y la disposición de color más suelta. Procesamiento inverso
界于最紧凑颜色摆放,与最宽松颜色摆放之间,可行的样例。逆向处理
Input:
5 3
3 2 2
Output:
2 4 1
先按最紧凑颜色摆放
颜色1摆放在格子1,颜色2摆放在格子2,颜色3摆放在格子3
此时,还有[4,5]区间这2个格子未染色,
取出颜色3,此时[3,5]区间这3个格子未染色,
颜色3尽最大努力,能将[4,5]区间这2个格子染色,让颜色3的p[3]=4,此时还剩格子3未染色。
取出颜色2,此时[2,3]这2个格子未染色,
颜色2尽最大努力,能将[2,3]这2个格子染色,让颜色2的p[2]=2,此时所有格子均已染色。
Según la simulación manual anterior, el código AC escrito es el siguiente: por supuesto, la misma idea, el código escrito por diferentes personas seguirá siendo muy diferente.
#include <stdio.h>
#define maxn 100010
#define LL long long
int l[maxn],p[maxn];
LL sum;
int main(){
int i,n,m,flag=0;
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++){
p[i]=i;//用最紧凑的方法安排颜色,一个颜色放一格
scanf("%d",&l[i]),sum+=l[i];//用最宽松的方法安排颜色,颜色i放l[i]个格子
if(i>n-l[i]+1)flag=1;//用最紧凑的方法,发现p[i]不在 [1,n−li+1] 区间。
}
if(sum<n)flag=1;//用最紧凑的方法,发现填不满格子
if(flag){
printf("-1\n");
return 0;
}
p[m+1]=n+1;//边界设置
n-=m;//计算后的n表示还需染色的格子
for(i=m;i>=1;i--){//结尾宽松设置颜色,开头紧凑设置颜色。
if(l[i]>n)break;
else n-=l[i]-1,p[i]=p[i+1]-1-(l[i]-1);
}
for(i=1;i<m;i++)printf("%d ",p[i]);
printf("%d\n",p[m]);
return 0;
}