| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
哪位牛可以解释一下这个程序为什么是错的,内附说明。线段树节点存两个域: 1. 该区间内的最大brightest和 2.恰好为该区间长度的brightest和
排序已经保证了到右边界时会先减然后才会加(也就是处理了边界——边上的星星不可以加——只加左不加右)。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 30010;
typedef long long llg;
struct node
{
llg x, y, c;
}p[N<<2];
struct TreeNode
{
llg sum, max;
}tree[N<<5];
llg n, w, h, limit;
llg py[N<<2];
bool cmp(node a, node b)
{
if(a.x == b.x)
return a.c < b.c;
else
return a.x < b.x;
}
llg getpos(llg key)
{
llg l, r, mid;
l = 1;
r = limit;
while(l <= r)
{
mid = (l+r) >> 1;
if(py[mid] == key) return mid;
else if(py[mid] > key) r = mid-1;
else l = mid+1;
}
return -1;
}
void BuildTree(llg u, llg l, llg r)
{
llg tmp = u<<1, mid = (l+r)>>1;
tree[u].max = tree[u].sum = 0;
if(l+1 == r) return;
BuildTree(tmp, l, mid);
BuildTree(tmp+1, mid, r);
}
void Insert(llg u, llg l, llg r, llg a, llg b, const llg &c)
{
llg tmp = u<<1, mid = (l+r)>>1;
if(l==a && r==b)
{
tree[u].sum += c;
tree[u].max = max(tree[tmp].max, tree[tmp+1].max) + tree[u].sum;
return;
}
else
{
if(b <= mid) Insert(tmp, l, mid, a, b, c);
else if(a >= mid) Insert(tmp+1, mid, r, a, b, c);
else
{
Insert(tmp, l, mid, a, mid, c);
Insert(tmp+1, mid, r, mid, r, c);
}
tree[u].max = max(tree[tmp].max, tree[tmp+1].max)+tree[u].sum;
}
}
int main()
{
llg i, ans;
while(scanf("%lld%lld%lld", &n, &w, &h) != EOF)
{
memset(tree, 0, sizeof(tree)); //equal to build tree
for(i = 1; i <= n; i++)
{
scanf("%lld%lld%lld", &p[i].x, &p[i].y, &p[i].c);
p[i+n].x = p[i].x+w;
p[i+n].y = p[i].y;
p[i+n].c = -p[i].c;
py[i] = p[i].y;
py[i+n] = p[i].y+h;
}
if(!n)
{
printf("0\n");
continue;
}
n <<= 1;
sort(py+1, py+n+1);
sort(p+1, p+n+1, cmp);
limit = 1;
for(i = 2; i <= n; i++)
if(py[i] != py[i-1])
py[++limit] = py[i];
ans = 0;
for(i = 1; i <= n; i++)
{
Insert(1, 1, limit, getpos(p[i].y), getpos(p[i].y+h), p[i].c);
ans = max(ans, tree[1].max);
}
printf("%lld\n", ans);
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator