/*
* ska.c
*
* Created on: Nov 21, 2017
* Author: A.Mulawa
*/
#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>
typedef unsigned char byte;
// 1000000 / 2 + 1 = 500001 possible bit's increment for 201718 * 1000000 values
// 201718 / 8 = 25214.75
// 500001 / 8 = 62500
//max is 87714.875 = (201718+500001) / 8 = (25215 + 62500)
const int RANGE = 131072; //131072 bytes / 1 Mbit / 0.125 MB
const int BIT = 8;
static bool get(byte a, byte pos)
{
return (a >> pos) & 1;
}
static void set(byte *a, byte pos)
{
*a |= 1 << pos;
}
static void reset(byte *a, byte pos)
{
*a &= ~(1 << pos);
}
bool bitmapGet(byte *bitmap, int pos)
{
return get(bitmap[pos / BIT], pos % BIT);
}
void bitmapSet(byte *bitmap, int pos)
{
set(&bitmap[pos / BIT], pos % BIT);
}
void bitmapReset(byte *bitmap, int pos)
{
reset(&bitmap[pos / BIT], pos % BIT);
}
int main(int argc, char **argv)
{
byte* tabs = (byte*) malloc(RANGE);
for (int i = 0; i < RANGE * 8; i++)
{
bitmapReset(tabs, i);
}
int n;
int a;
int mk = 0;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &a);
bool w;
do
{
if (bitmapGet(tabs, a))
{
bitmapReset(tabs, a);
a++;
w = true;
}
else
{
bitmapSet(tabs, a);
w = false;
}
} while (w);
if (mk < a)
mk = a;
}
printf("%d", mk);
free(tabs);
}
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 | /* * ska.c * * Created on: Nov 21, 2017 * Author: A.Mulawa */ #include <stdbool.h> #include <stdlib.h> #include <stdio.h> typedef unsigned char byte; // 1000000 / 2 + 1 = 500001 possible bit's increment for 201718 * 1000000 values // 201718 / 8 = 25214.75 // 500001 / 8 = 62500 //max is 87714.875 = (201718+500001) / 8 = (25215 + 62500) const int RANGE = 131072; //131072 bytes / 1 Mbit / 0.125 MB const int BIT = 8; static bool get(byte a, byte pos) { return (a >> pos) & 1; } static void set(byte *a, byte pos) { *a |= 1 << pos; } static void reset(byte *a, byte pos) { *a &= ~(1 << pos); } bool bitmapGet(byte *bitmap, int pos) { return get(bitmap[pos / BIT], pos % BIT); } void bitmapSet(byte *bitmap, int pos) { set(&bitmap[pos / BIT], pos % BIT); } void bitmapReset(byte *bitmap, int pos) { reset(&bitmap[pos / BIT], pos % BIT); } int main(int argc, char **argv) { byte* tabs = (byte*) malloc(RANGE); for (int i = 0; i < RANGE * 8; i++) { bitmapReset(tabs, i); } int n; int a; int mk = 0; scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d", &a); bool w; do { if (bitmapGet(tabs, a)) { bitmapReset(tabs, a); a++; w = true; } else { bitmapSet(tabs, a); w = false; } } while (w); if (mk < a) mk = a; } printf("%d", mk); free(tabs); } |
English