zoukankan      html  css  js  c++  java
  • 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
    ");
    214             else
    215                 printf("%d %d
    ",ans1[i],ans2[i]);
    216         }
    217     }
    218     return 0;
    219 }
  • 相关阅读:
    linux的别名(alias/unalias)
    asp.net <%%> <%#%><%=%><%@%><%$%>用法与区别
    SQL获取刚插入的记录的自动增长列ID的值
    包和继承
    面对对象编程(封装)
    面对对象编程(上)
    数组(下)
    java数组-如何在一堆数据中使用数组!
    Request和Response学习笔记5
    Request和Response学习笔记4
  • 原文地址:https://www.cnblogs.com/naix-x/p/3216852.html
Copyright © 2011-2022 走看看