您的位置:首页 > 大数据 > 人工智能

【二维线段树】 HDU 1823 Luck and Love | HDU 4819 Mosaic

2014-02-17 16:45 169 查看
【HDU 1823 Luck and Love】

原题直通车:HDU 1823 Luck and Love

题意:成块(矩形)更新最大值

代码:

#include<iostream>
#include<cstdio>
#include<climits>
#include<cstring>

#define Lson L, mid, rt<<1
#define Rson mid+1, R, rt<<1|1
#define Mid (L+R)>>1
using namespace std;
const int INF = INT_MAX;
const int maxn = 1005;

int n, m;
int Max[105<<2][maxn<<2];
int x, y, v, ans, ro, xleaf;
int x1, y1, x2, y2;

void query1D(int L, int R, int rt) {
if(y1 <= L && R<=y2) {
ans = max(Max[ro][rt], ans);
} else {
int mid = Mid;
if(y1 <= mid) query1D(Lson);
if(y2 > mid)  query1D(Rson);
}
}
void query2D(int L, int R, int rt) {
if(x1 <= L && R <= x2) {
ro = rt;
query1D(0, m, 1);
} else {
int mid = Mid;
if(x1 <= mid) query2D(Lson);
if(x2 > mid)  query2D(Rson);
}
}
void update1D(int L, int R, int rt) {
if( L == R) {
if(xleaf) {
Max[ro][rt] = max(Max[ro][rt], v);
return ;
}
Max[ro][rt] = max(Max[ro<<1][rt], Max[ro<<1|1][rt]);
} else {
int mid = Mid;
if(y <= mid) update1D(Lson);
else update1D(Rson);
Max[ro][rt] = max(Max[ro][rt<<1], Max[ro][rt<<1|1]);
}
}

void update2D(int L, int R, int rt) {
if(L == R) {
ro = rt;
xleaf = 1;
update1D(0, m, 1);
} else {
int mid = Mid;
if(x <= mid) update2D(Lson);
else update2D(Rson);
ro = rt;
xleaf = 0;
update1D(0, m, 1);
}
}

int main() {
int T;
while(~scanf("%d", &T) && T) {
n = 100, m = 1000;
memset(Max, -1, sizeof(Max));
while(T--) {
char op[3];
scanf("%s", op);
if(op[0] == 'I') {
int h; double a, b;
scanf("%d%lf%lf", &h, &a, &b);
x = h - 100, y = (int)(a*10), v = (int)(b*10);
update2D(0, n, 1);
} else {
int h, u; double a, b;
scanf("%d%d%lf%lf", &h, &u, &a, &b);
x1 = h - 100, y1 = (int)(a*10);
x2 = u - 100, y2 = (int)(b*10);
if(x1 > x2) swap(x1, x2);
if(y1 > y2) swap(y1, y2);
ans = -1;
query2D(0, n, 1);
if(ans == -1) {
puts("-1"); continue;
}
printf("%.1lf\n", ans/10.0);
}
}
}
return 0;
}


【HDU 4819 Mosaic】

原题直通车: HDU 4819 Mosaic

题意:成块查寻最大值、最小值,并单点更新。

代码:

#include<iostream>
#include<cstdio>
#include<climits>

#define Lson L, mid, rt<<1
#define Rson mid+1, R, rt<<1|1
#define Mid (L+R)>>1

using namespace std;
const int INF = INT_MAX;
const int maxn = 800<<2;

int n, m;
int Max[maxn][maxn], Min[maxn][maxn];
int ro, xleaf;
int x1, y1, x2, y2;
int x, y, v, l;
int maxx, minx;

void query1D(int L, int R, int rt) {
if(y1 <= L && R<=y2) {
maxx = max(Max[ro][rt], maxx);
minx = min(Min[ro][rt], minx);
} else {
int mid = Mid;
if(y1 <= mid) query1D(Lson);
if(y2 > mid)  query1D(Rson);
}
}

void query2D(int L, int R, int rt) {
if(x1 <= L && R <= x2) {
ro = rt;
query1D(1, m, 1);
} else {
int mid = Mid;
if(x1 <= mid) query2D(Lson);
if(x2 > mid)  query2D(Rson);
}
}

void update1D(int L, int R, int rt) {
if( L == R) {
if(xleaf) {
Max[ro][rt] = Min[ro][rt] = v;
return ;
}
Max[ro][rt] = max(Max[ro<<1][rt], Max[ro<<1|1][rt]);
Min[ro][rt] = min(Min[ro<<1][rt], Min[ro<<1|1][rt]);
} else {
int mid = Mid;
if(y <= mid) update1D(Lson);
else update1D(Rson);
Max[ro][rt] = max(Max[ro][rt<<1], Max[ro][rt<<1|1]);
Min[ro][rt] = min(Min[ro][rt<<1], Min[ro][rt<<1|1]);
}
}
void update2D(int L, int R, int rt) {
if(L == R) {
ro = rt;
xleaf = 1;
update1D(1, m, 1);
} else {
int mid = Mid;
if(x <= mid) update2D(Lson);
else update2D(Rson);
ro = rt;
xleaf = 0;
update1D(1, m, 1);
}
}

int main() {
int T, cas = 1; scanf("%d", &T);
while(T--) {
scanf("%d", &n);
m = n;
for(int i=1; i<=n; ++i)
for(int j=1; j<=m; ++j)   {
scanf("%d", &v);
x = i, y = j;
update2D(1, n, 1);
}
int Q; scanf("%d", &Q);
printf("Case #%d:\n", cas++);
while(Q--) {
scanf("%d%d%d", &x, &y, &l);
l >>= 1;
x1 = max(1, x-l), y1 = max(1, y-l);
x2 = min(n, x+l), y2 = min(n, y+l);
maxx = -INF, minx = INF;
query2D(1, n, 1);
v = (maxx+minx)>>1;
printf("%d\n", v);
update2D(1, n, 1);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: