/* Potyczki Algorytmiczne 2021 Runda 3 C Sumy (SUM)
tsz
*/
#include <assert.h>
#include <ctype.h>
#include <limits.h>
#include <math.h>
#include <memory.h>
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <algorithm>
#ifndef TSDEBUG
#define NDEBUG 1
#endif
#ifdef __MINGW32__
#define FMTU64 "I64u"
#define FMTI64 "I64d"
#else
#define FMTU64 "llu"
#define FMTI64 "lld"
#endif
typedef int16_t i16;
typedef int32_t i32;
typedef int64_t i64;
typedef uint64_t u64;
inline i32 Min(i32 a, i32 b)
{
return a <= b ? a : b;
}
inline i32 Max(i32 a, i32 b)
{
return a >= b ? a : b;
}
const i32 MinLiczbaSumow = 2;
const i32 MaxLiczbaSumow = 500000;
const i32 MaxWagaSuma = 1000000000;
i32 Sumy[MaxLiczbaSumow + 1] = { 0 };
i32 SumyPosortowane[MaxLiczbaSumow + 1] = { 0 };
i32 WagiSumow[MaxLiczbaSumow + 1] = { 0 };
i64 SumyWag[MaxLiczbaSumow + 1] = { 0 };
int main()
{
i32 LiczbaSumow = 0;
scanf("%d\n", &LiczbaSumow);
assert(MinLiczbaSumow <= LiczbaSumow);
assert(LiczbaSumow <= MaxLiczbaSumow);
for (i32 i = 0; i < LiczbaSumow; i++) {
i32 Sum;
scanf("%d", &Sum);
assert(1 <= Sum);
assert(Sum <= MaxWagaSuma);
Sumy[i] = Sum;
}
memmove(SumyPosortowane, Sumy, sizeof(Sumy[0]) * LiczbaSumow);
std::sort(&SumyPosortowane[0], &SumyPosortowane[LiczbaSumow]);
i32 OstatniSum = SumyPosortowane[0];
i64 Suma = OstatniSum;
i32 LiczbaWag = 0;
//fprintf(stderr, "DEBUG: Liczba wag %d, suma %" FMTI64 ", ostatni %d\n", LiczbaWag, Suma, OstatniSum);
for (i32 i = 1; i < LiczbaSumow; i++) {
i32 Sum = SumyPosortowane[i];
if (Sum != OstatniSum) {
WagiSumow[LiczbaWag] = OstatniSum;
SumyWag[LiczbaWag] = Suma;
LiczbaWag++;
OstatniSum = Sum;
}
Suma += Sum;
//fprintf(stderr, "DEBUG: Liczba wag %d, suma %" FMTI64 ", ostatni %d\n", LiczbaWag, Suma, OstatniSum);
}
WagiSumow[LiczbaWag] = OstatniSum;
SumyWag[LiczbaWag] = Suma;
LiczbaWag++;
//fprintf(stderr, "DEBUG: Liczba wag %d, suma %" FMTI64 ", ostatni %d\n", LiczbaWag, Suma, OstatniSum);
if (LiczbaWag == 1) {
for (i32 i = 0; i < LiczbaSumow; i++) {
putchar('N');
}
putchar('\n');
return 0;
}
i32 NajnizszyKandydat = WagiSumow[LiczbaWag-1];
for (i32 i = LiczbaWag - 2; i >= 1; i--) {
if (SumyWag[i] <= NajnizszyKandydat) {
break;
}
NajnizszyKandydat = WagiSumow[i];
}
for (i32 i = 0; i < LiczbaSumow; i++) {
putchar(Sumy[i] >= NajnizszyKandydat ? 'T' : 'N');
}
putchar('\n');
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | /* Potyczki Algorytmiczne 2021 Runda 3 C Sumy (SUM) tsz */ #include <assert.h> #include <ctype.h> #include <limits.h> #include <math.h> #include <memory.h> #include <stdint.h> #include <stdlib.h> #include <stdio.h> #include <algorithm> #ifndef TSDEBUG #define NDEBUG 1 #endif #ifdef __MINGW32__ #define FMTU64 "I64u" #define FMTI64 "I64d" #else #define FMTU64 "llu" #define FMTI64 "lld" #endif typedef int16_t i16; typedef int32_t i32; typedef int64_t i64; typedef uint64_t u64; inline i32 Min(i32 a, i32 b) { return a <= b ? a : b; } inline i32 Max(i32 a, i32 b) { return a >= b ? a : b; } const i32 MinLiczbaSumow = 2; const i32 MaxLiczbaSumow = 500000; const i32 MaxWagaSuma = 1000000000; i32 Sumy[MaxLiczbaSumow + 1] = { 0 }; i32 SumyPosortowane[MaxLiczbaSumow + 1] = { 0 }; i32 WagiSumow[MaxLiczbaSumow + 1] = { 0 }; i64 SumyWag[MaxLiczbaSumow + 1] = { 0 }; int main() { i32 LiczbaSumow = 0; scanf("%d\n", &LiczbaSumow); assert(MinLiczbaSumow <= LiczbaSumow); assert(LiczbaSumow <= MaxLiczbaSumow); for (i32 i = 0; i < LiczbaSumow; i++) { i32 Sum; scanf("%d", &Sum); assert(1 <= Sum); assert(Sum <= MaxWagaSuma); Sumy[i] = Sum; } memmove(SumyPosortowane, Sumy, sizeof(Sumy[0]) * LiczbaSumow); std::sort(&SumyPosortowane[0], &SumyPosortowane[LiczbaSumow]); i32 OstatniSum = SumyPosortowane[0]; i64 Suma = OstatniSum; i32 LiczbaWag = 0; //fprintf(stderr, "DEBUG: Liczba wag %d, suma %" FMTI64 ", ostatni %d\n", LiczbaWag, Suma, OstatniSum); for (i32 i = 1; i < LiczbaSumow; i++) { i32 Sum = SumyPosortowane[i]; if (Sum != OstatniSum) { WagiSumow[LiczbaWag] = OstatniSum; SumyWag[LiczbaWag] = Suma; LiczbaWag++; OstatniSum = Sum; } Suma += Sum; //fprintf(stderr, "DEBUG: Liczba wag %d, suma %" FMTI64 ", ostatni %d\n", LiczbaWag, Suma, OstatniSum); } WagiSumow[LiczbaWag] = OstatniSum; SumyWag[LiczbaWag] = Suma; LiczbaWag++; //fprintf(stderr, "DEBUG: Liczba wag %d, suma %" FMTI64 ", ostatni %d\n", LiczbaWag, Suma, OstatniSum); if (LiczbaWag == 1) { for (i32 i = 0; i < LiczbaSumow; i++) { putchar('N'); } putchar('\n'); return 0; } i32 NajnizszyKandydat = WagiSumow[LiczbaWag-1]; for (i32 i = LiczbaWag - 2; i >= 1; i--) { if (SumyWag[i] <= NajnizszyKandydat) { break; } NajnizszyKandydat = WagiSumow[i]; } for (i32 i = 0; i < LiczbaSumow; i++) { putchar(Sumy[i] >= NajnizszyKandydat ? 'T' : 'N'); } putchar('\n'); return 0; } |
English