HDU 4605 Magic Ball Game(离线算法)

题目链接

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

  1 #pragma comment(linker, "/STACK:1024000000,1024000000")
  2 #include <cstdio>
  3 #include <cstdlib>
  4 #include <cstring>
  5 #include <map>
  6 #include <ctime>
  7 #include <cmath>
  8 #include <algorithm>
  9 using namespace std;
 10 #define maxn 100101
 11 struct node
 12 {
 13     int l,r;
 14 } tree[maxn];
 15 struct nodez
 16 {
 17     int u,v,next;
 18 } edge[100101];
 19 int w[maxn];
 20 int n;
 21 int pl[maxn];
 22 int pr[maxn];
 23 int que[maxn];
 24 int qu[maxn],qv[maxn];
 25 int o[maxn];
 26 int ww[maxn],num;
 27 int ans1[maxn],ans2[maxn];
 28 int tot;
 29 int first[101101];
 30 void CL()
 31 {
 32     tot = 1;
 33     memset(o,0,sizeof(o));
 34     memset(first,-1,sizeof(first));
 35     memset(pl,0,sizeof(pl));
 36     memset(pr,0,sizeof(pr));
 37 }
 38 int lowbit(int t)
 39 {
 40     return t&(-t);
 41 }
 42 void insert1(int t,int d)
 43 {
 44     while(t <= n)
 45     {
 46         pl[t] += d;
 47         t += lowbit(t);
 48     }
 49 }
 50 void insert2(int t,int d)
 51 {
 52     while(t <= n)
 53     {
 54         pr[t] += d;
 55         t += lowbit(t);
 56     }
 57 }
 58 int getsum1(int t)
 59 {
 60     int sum = 0;
 61     while(t)
 62     {
 63         sum += pl[t];
 64         t -= lowbit(t);
 65     }
 66     return sum;
 67 }
 68 int getsum2(int t)
 69 {
 70     int sum = 0;
 71     while(t)
 72     {
 73         sum += pr[t];
 74         t -= lowbit(t);
 75     }
 76     return sum;
 77 }
 78 int bin(int x)
 79 {
 80     int str,end,mid;
 81     str = 1;
 82     end = num;
 83     while(str < end)
 84     {
 85         mid = (str+end)/2;
 86         if(w[mid] < x)
 87             str = mid + 1;
 88         else
 89             end = mid;
 90     }
 91     return str;
 92 }
 93 void add(int u,int v)
 94 {
 95     edge[tot].u = u;
 96     edge[tot].v = v;
 97     edge[tot].next = first[u];
 98     first[u] = tot ++;
 99 }
100 void dfs(int x)
101 {
102     int sp,s1,s2,s3,s4,s5,s6,i,v;
103     if(o[x])
104     {
105         for(i = first[x]; i != -1; i = edge[i].next)
106         {
107             v = edge[i].v;
108             if(x == 1)
109             {
110                 ans1[v] = 0;
111                 ans2[v] = 0;
112             }
113             else
114             {
115                 if(qv[v] > w[num])
116                 {
117                     s1 = s2 = getsum1(n);
118                     s5 = 0;
119                     s3 = s4  = getsum2(n);
120                     s6 = 0;
121                     sp = n;
122                 }
123                 else if(qv[v] < w[1])
124                 {
125                     s1 = s2 = s3 = s4 = 0;
126                     s5 = getsum1(n);
127                     s6 = getsum2(n);
128                     sp = n;
129                 }
130                 else
131                 {
132                     sp = bin(qv[v]);
133                     s1 = getsum1(sp-1);
134                     s2 = getsum1(sp);
135                     s3 = getsum2(sp-1);
136                     s4 = getsum2(sp);
137                     s5 = getsum1(n) - s1;
138                     s6 = getsum2(n) - s3;
139                 }
140                 if(w[sp] == qv[v]&&s2 - s1 > 0)
141                 {
142                     ans1[v] = -1;
143                     ans2[v] = 0;
144                 }
145                 else if(w[sp] == qv[v]&&s4 - s3 > 0)
146                 {
147                     ans1[v] = -1;
148                     ans2[v] = 0;
149                 }
150                 else
151                 {
152                     ans1[v] = s3;
153                     ans2[v] = s3*3 + s6 + s1*3 + s5;
154                 }
155             }
156         }
157     }
158     if(tree[x].l != -1)
159     {
160         int nu;
161         nu = bin(ww[x]);
162         insert1(nu,1);
163         dfs(tree[x].l);
164         insert1(nu,-1);
165         insert2(nu,1);
166         dfs(tree[x].r);
167         insert2(nu,-1);
168     }
169     return ;
170 }
171 int main()
172 {
173     int i,m,t,fa,ls,rs;
174     scanf("%d",&t);
175     while(t--)
176     {
177         scanf("%d",&n);
178         CL();
179         for(i = 1; i <= n; i ++)
180         {
181             scanf("%d",&w[i]);
182             ww[i] = w[i];
183         }
184         for(i = 1; i <= n; i ++)
185         {
186             tree[i].l = tree[i].r = -1;
187         }
188         sort(w+1,w+n+1);
189         num = 1;
190         for(i = 2; i <= n; i ++)
191         {
192             if(w[num] != w[i])
193                 w[++num] = w[i];
194         }
195         scanf("%d",&m);
196         for(i = 0; i < m; i ++)
197         {
198             scanf("%d%d%d",&fa,&ls,&rs);
199             tree[fa].l = ls;
200             tree[fa].r = rs;
201         }
202         scanf("%d",&m);
203         for(i = 1; i <= m; i ++)
204         {
205             scanf("%d%d",&qu[i],&qv[i]);
206             add(qu[i],i);
207             o[qu[i]] = 1;
208         }
209         dfs(1);
210         for(i = 1; i <= m; i ++)
211         {
212             if(ans1[i] == -1)
213                 printf("0\n");
214             else
215                 printf("%d %d\n",ans1[i],ans2[i]);
216         }
217     }
218     return 0;
219 }

 

posted @ 2013-07-26 12:43  Naix_x  阅读(407)  评论(1编辑  收藏  举报