您的位置:首页 > 其它

HDU 4605 Magic Ball Game(离线算法)

2013-07-26 12:43 295 查看
题目链接

思路就很难想+代码实现也很麻烦,知道算法后,已经写的很繁琐而且花了很长时间,200+,好久没写过这么长的代码了。

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <map>
#include <ctime>
#include <cmath>
#include <algorithm>
using namespace std;
#define maxn 100101
struct node
{
int l,r;
} tree[maxn];
struct nodez
{
int u,v,next;
} edge[100101];
int w[maxn];
int n;
int pl[maxn];
int pr[maxn];
int que[maxn];
int qu[maxn],qv[maxn];
int o[maxn];
int ww[maxn],num;
int ans1[maxn],ans2[maxn];
int tot;
int first[101101];
void CL()
{
tot = 1;
memset(o,0,sizeof(o));
memset(first,-1,sizeof(first));
memset(pl,0,sizeof(pl));
memset(pr,0,sizeof(pr));
}
int lowbit(int t)
{
return t&(-t);
}
void insert1(int t,int d)
{
while(t <= n)
{
pl[t] += d;
t += lowbit(t);
}
}
void insert2(int t,int d)
{
while(t <= n)
{
pr[t] += d;
t += lowbit(t);
}
}
int getsum1(int t)
{
int sum = 0;
while(t)
{
sum += pl[t];
t -= lowbit(t);
}
return sum;
}
int getsum2(int t)
{
int sum = 0;
while(t)
{
sum += pr[t];
t -= lowbit(t);
}
return sum;
}
int bin(int x)
{
int str,end,mid;
str = 1;
end = num;
while(str < end)
{
mid = (str+end)/2;
if(w[mid] < x)
str = mid + 1;
else
end = mid;
}
return str;
}
void add(int u,int v)
{
edge[tot].u = u;
edge[tot].v = v;
edge[tot].next = first[u];
first[u] = tot ++;
}
void dfs(int x)
{
int sp,s1,s2,s3,s4,s5,s6,i,v;
if(o[x])
{
for(i = first[x]; i != -1; i = edge[i].next)
{
v = edge[i].v;
if(x == 1)
{
ans1[v] = 0;
ans2[v] = 0;
}
else
{
if(qv[v] > w[num])
{
s1 = s2 = getsum1(n);
s5 = 0;
s3 = s4  = getsum2(n);
s6 = 0;
sp = n;
}
else if(qv[v] < w[1])
{
s1 = s2 = s3 = s4 = 0;
s5 = getsum1(n);
s6 = getsum2(n);
sp = n;
}
else
{
sp = bin(qv[v]);
s1 = getsum1(sp-1);
s2 = getsum1(sp);
s3 = getsum2(sp-1);
s4 = getsum2(sp);
s5 = getsum1(n) - s1;
s6 = getsum2(n) - s3;
}
if(w[sp] == qv[v]&&s2 - s1 > 0)
{
ans1[v] = -1;
ans2[v] = 0;
}
else if(w[sp] == qv[v]&&s4 - s3 > 0)
{
ans1[v] = -1;
ans2[v] = 0;
}
else
{
ans1[v] = s3;
ans2[v] = s3*3 + s6 + s1*3 + s5;
}
}
}
}
if(tree[x].l != -1)
{
int nu;
nu = bin(ww[x]);
insert1(nu,1);
dfs(tree[x].l);
insert1(nu,-1);
insert2(nu,1);
dfs(tree[x].r);
insert2(nu,-1);
}
return ;
}
int main()
{
int i,m,t,fa,ls,rs;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
CL();
for(i = 1; i <= n; i ++)
{
scanf("%d",&w[i]);
ww[i] = w[i];
}
for(i = 1; i <= n; i ++)
{
tree[i].l = tree[i].r = -1;
}
sort(w+1,w+n+1);
num = 1;
for(i = 2; i <= n; i ++)
{
if(w[num] != w[i])
w[++num] = w[i];
}
scanf("%d",&m);
for(i = 0; i < m; i ++)
{
scanf("%d%d%d",&fa,&ls,&rs);
tree[fa].l = ls;
tree[fa].r = rs;
}
scanf("%d",&m);
for(i = 1; i <= m; i ++)
{
scanf("%d%d",&qu[i],&qv[i]);
add(qu[i],i);
o[qu[i]] = 1;
}
dfs(1);
for(i = 1; i <= m; i ++)
{
if(ans1[i] == -1)
printf("0\n");
else
printf("%d %d\n",ans1[i],ans2[i]);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: