Home Article Practice abc

abc

2020-05-21 20:54  views:1019  source:小键人193860    

/**
* Note: The returned array must be malloced, assume caller calls free().
*/
#define For(a, b) for (a = 0 ; a < b ; a++)
int g_n;
int g_hashcnt;
int g_hashcntxy;
#define HA 200000
struct Hx {
int x;
int xout;
struct Hx *next;
};
struct Hxy {
int x;
int y;
int xout;
struct Hxy *next;
};
struct Hx * hasx[HA];
struct Hxy * g_hasxy[HA];
int flag[HA];
int a1[HA];
int a2[HA];
int a3[HA];
int a4[HA];
int* gridIllumination(int N, int** lamps, int lampsSize, int*
lampsColSize, int** queries, int queriesSize, int* queriesColSize, int* returnSize)
{
int i;
g_n = N;
g_hashcnt = 0;
g_hashcntxy = 0;
int *out = (int *)malloc(sizeof(int) * queriesSize);
For(i, HA) {
a1[i] = 0;
a2[i] = 0;
a3[i] = 0;
a4[i] = 0
hasx[i] = NULL;
g_hasxy[i] = NULL;
flag[i] = 0;
}
For(i, lampsSize) {
Padd(lamps[i][0], lamps[i][1]);
}
For(i, queriesSize) {
out[i] = statt(queries[i][0], queries[i][1]);
Prm(queries[i][0], queries[i][1]);
}
*returnSize = queriesSize;
return out;
}
void Prm(int x, int y)
{
_Prm(x, y);
if (x - 1 >= 0) {
_Prm(x - 1, y);
if (y - 1 >= 0) _Prm(x - 1, y - 1);
if (y + 1 < g_n) _Prm(x - 1, y + 1);
}
if (x + 1 < g_n) {
_Prm(x + 1, y);
if (y - 1 >= 0) _Prm(x + 1, y - 1);
if (y + 1 < g_n) _Prm(x + 1, y + 1);
}
if (y - 1 >= 0) _Prm(x, y - 1);
if (y + 1 < g_n) _Prm(x, y + 1);
}
void Padd(int x, int y)
{
flag[hashxy(x, y)]++;
a1[hashx(x)]++;
a2[hashx(y)]++;
a3[hashx(x + y)]++;
a4[hashx(x + g_n - 1 - y)]++;
}
void _Prm(int x, int y)
{
if(flag[hashxy(x, y)] > 0) {
flag[hashxy(x, y)]--;
a1[hashx(x)]--;
a2[hashx(y)]--;
a3[hashx(x + y)]--;
a4[hashx(x + g_n - 1 - y)]--;
}
}
int statt(int x, int y)
{
if (a1[hashx(x)] > 0 || a2[hashx(y)] > 0 || a3[hashx(x + y)]
> 0 || a4[hashx(x + g_n - 1 - y)] > 0) {return 1;}
return 0;
}
int hashx(int x)
{
int temp = x % HA;
struct Hx **ptr = &hasx[temp];
next:
if (*ptr != NULL) {
if ((*ptr)->x == x)
return (*ptr)->xout;
ptr = &((*ptr)->next);
goto next;
} else {
(*ptr) = (struct Hx *)malloc(sizeof(struct Hx));
(*ptr)->x = x;
(*ptr)->xout = g_hashcnt++;
(*ptr)->next = NULL;
return (*ptr)->xout;
}
}
int hashxy(int x, int y)
{
int temp = (x + y) % HA;
struct Hxy **ptr = &g_hasxy[temp];
next:
if ((*ptr) != NULL) {
if ((*ptr)->x == x && (*ptr)->y == y)
return (*ptr)->xout;
ptr = &((*ptr)->next);
goto next;
} else {
(*ptr) = (struct Hxy *)malloc(sizeof(struct Hxy));
(*ptr)->x = x;(*ptr)->y = y;
(*ptr)->xout = g_hashcntxy;
(*ptr)->next = NULL;
return g_hashcntxy++;
}
}
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
#define For(a, b) for (a = 0 ; a < b ; a++)
int g_n;
int g_hashcnt;
int g_hashcntxy;
#define HA 200000
struct Hx {
int x;
int xout;
struct Hx *next;
};
struct Hxy {
int x;
int y;
int xout;
struct Hxy *next;
};
struct Hx * hasx[HA];
struct Hxy * g_hasxy[HA];
int flag[HA];
int a1[HA];
int a2[HA];
int a3[HA];
int a4[HA];
int* gridIllumination(int N, int** lamps, int lampsSize, int* lampsColSize,
int** queries, int queriesSize, int* queriesColSize, int* returnSize)
{
int i;
g_n = N;
g_hashcnt = 0;
g_hashcntxy = 0;
int *out = (int *)malloc(sizeof(int) * queriesSize);
For(i, HA) {
a1[i] = 0;
a2[i] = 0;
a3[i] = 0;
a4[i] = 0
hasx[i] = NULL;
g_hasxy[i] = NULL;
flag[i] = 0;
}
For(i, lampsSize) {
Padd(lamps[i][0], lamps[i][1]);
}
For(i, queriesSize) {
out[i] = statt(queries[i][0], queries[i][1]);
Prm(queries[i][0], queries[i][1]);
}
*returnSize = queriesSize;
return out;
}
void Prm(int x, int y)
{
_Prm(x, y);
if (x - 1 >= 0) {
_Prm(x - 1, y);
if (y - 1 >= 0) _Prm(x - 1, y - 1);
if (y + 1 < g_n) _Prm(x - 1, y + 1);
}
if (x + 1 < g_n) {
_Prm(x + 1, y);
if (y - 1 >= 0) _Prm(x + 1, y - 1);
if (y + 1 < g_n) _Prm(x + 1, y + 1);
}
if (y - 1 >= 0) _Prm(x, y - 1);
if (y + 1 < g_n) _Prm(x, y + 1);
}
void Padd(int x, int y)
{
flag[hashxy(x, y)]++;
a1[hashx(x)]++;
a2[hashx(y)]++;
a3[hashx(x + y)]++;
a4[hashx(x + g_n - 1 - y)]++;
}
void _Prm(int x, int y)
{
if(flag[hashxy(x, y)] > 0) {
flag[hashxy(x, y)]--;
a1[hashx(x)]--;
a2[hashx(y)]--;
a3[hashx(x + y)]--;
a4[hashx(x + g_n - 1 - y)]--;
}
}
int statt(int x, int y)
{
if (a1[hashx(x)] > 0 || a2[hashx(y)] > 0 || a3[hashx(x + y)] > 0
|| a4[hashx(x + g_n - 1 - y)] > 0) {return 1;}
return 0;
}
int hashx(int x)
{
int temp = x % HA;
struct Hx **ptr = &hasx[temp];
next:
if (*ptr != NULL) {
if ((*ptr)->x == x)
return (*ptr)->xout;
ptr = &((*ptr)->next);
goto next;
} else {
(*ptr) = (struct Hx *)malloc(sizeof(struct Hx));
(*ptr)->x = x;
(*ptr)->xout = g_hashcnt++;
(*ptr)->next = NULL;
return (*ptr)->xout;
}
}
int hashxy(int x, int y)
{
int temp = (x + y) % HA;
struct Hxy **ptr = &g_hasxy[temp];
next:
if ((*ptr) != NULL) {
if ((*ptr)->x == x && (*ptr)->y == y)
return (*ptr)->xout;
ptr = &((*ptr)->next);
goto next;
} else {
(*ptr) = (struct Hxy *)malloc(sizeof(struct Hxy));
(*ptr)->x = x;(*ptr)->y = y;
(*ptr)->xout = g_hashcntxy;
(*ptr)->next = NULL;
return g_hashcntxy++;
}
}



Disclaimer: The above articles are added by users themselves and are only for typing and communication purposes. They do not represent the views of this website, and this website does not assume any legal responsibility. This statement is hereby made! If there is any infringement of your rights, please contact us promptly to delete it.

字符:    改为:
去打字就可以设置个性皮肤啦!(O ^ ~ ^ O)