HDU 4605 Magic Ball Game(离线算法)
2013-07-26 12:43
295 查看
题目链接
思路就很难想+代码实现也很麻烦,知道算法后,已经写的很繁琐而且花了很长时间,200+,好久没写过这么长的代码了。
思路就很难想+代码实现也很麻烦,知道算法后,已经写的很繁琐而且花了很长时间,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; }
相关文章推荐
- hdu-4605-Magic Ball Game-线段树+离线操作
- hdu 4605 Magic Ball Game(离线+树状数组)
- HDU 4605 Magic Ball Game 树上主席树
- HDU 4605 Magic Ball Game 树状数组
- HDU 4605 Magic Ball Game (dfs+离线树状数组)
- HDU 4605 Magic Ball Game (在线主席树|| 离线 线段树)
- hdu 4605-Magic Ball Game(树状数组)
- HDU 4605 Magic Ball Game 解题报告
- HDU 4605 Magic Ball Game (在线主席树|| 离线 线段树)
- hdu-4605 Magic Ball Game[离散化+回溯+树状数组]
- hdu 4605:Magic Ball Game(主席树或者离线)
- 2013 多校联合 F Magic Ball Game (hdu 4605)
- hdu 4605 Magic Ball Game
- HDU 4605 Magic Ball Game 树状数组
- Magic Ball Game - HDU 4605 树状数组
- 2013 多校联合 F Magic Ball Game (hdu 4605)
- HDU 4605 Magic Ball Game(离线、BIT)
- hdu 4605 Magic Ball Game
- HDU 4605 Magic Ball Game (在线主席树|| 离线 线段树)
- 2013 多校第一场 hdu 4605 Magic Ball Game