• 【HDU】3333 Turing Tree


     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 using namespace std;
     5 typedef __int64 LL;
     6 #define MAXN 30010
     7 #define MAXM 100010
     8 int a[MAXN],b[MAXN],vis[MAXN];
     9 LL ans[MAXM],tree[MAXN<<2];
    10 struct node
    11 {
    12     int left,right,pos;
    13     friend bool operator<(node a,node b)
    14     {
    15         return a.right<b.right;
    16     }
    17 };
    18 node p[MAXM];
    19 inline void PushUp(int rt)
    20 {
    21     tree[rt]=tree[rt<<1]+tree[rt<<1|1];
    22 }
    23 void Update(int x,int val,int L,int R,int rt)
    24 {
    25     if(L==R)
    26         tree[rt]=val;
    27     else
    28     {
    29         int mid=(L+R)>>1;
    30         if(x<=mid)
    31             Update(x,val,L,mid,rt<<1);
    32         else
    33             Update(x,val,mid+1,R,rt<<1|1);
    34         PushUp(rt);
    35     }
    36 }
    37 LL Query(int x,int y,int L,int R,int rt)
    38 {
    39     if(x<=L&&R<=y)
    40         return tree[rt];
    41     int mid=(L+R)>>1;
    42     LL ans=0;
    43     if(x<=mid)
    44         ans+=Query(x,y,L,mid,rt<<1);
    45     if(y>mid)
    46         ans+=Query(x,y,mid+1,R,rt<<1|1);
    47     return ans;
    48 }
    49 int main()
    50 {
    51     int t,n,m,i,j,k,q;
    52     scanf("%d",&t);
    53     while(t--)
    54     {
    55         scanf("%d",&n);
    56         for(i=1;i<=n;i++)
    57         {
    58             scanf("%d",&a[i]);
    59             b[i]=a[i];
    60         }
    61         sort(b+1,b+1+n);
    62         m=unique(b+1,b+1+n)-b;
    63         scanf("%d",&q);
    64         for(i=0;i<q;i++)
    65         {
    66             scanf("%d%d",&p[i].left,&p[i].right);
    67             p[i].pos=i;
    68         }
    69         sort(p,p+q);
    70         memset(vis,0,sizeof(vis));
    71         memset(tree,0,sizeof(tree));
    72         for(i=1,j=0;i<=n;i++)
    73         {
    74             k=lower_bound(b+1,b+m,a[i])-b;
    75             if(vis[k])
    76                 Update(vis[k],0,1,n,1);
    77             vis[k]=i;
    78             Update(vis[k],a[i],1,n,1);
    79             for(;j<q;j++)
    80             {
    81                 if(p[j].right<=i)
    82                     ans[p[j].pos]=Query(p[j].left,p[j].right,1,n,1);
    83                 else
    84                     break;
    85             }
    86         }
    87         for(i=0;i<q;i++)
    88             printf("%I64d\n",ans[i]);
    89     }
    90     return 0;
    91 }
    新博客:www.zhixiangli.com
  • 相关阅读:
    Condition控制线程通信
    Lock同步锁
    通过Callable接口创建线程
    CountDownLatch闭锁
    CopyOnWriteArrayList笔记
    原子变量与CAS算法
    Java网络编程之UDP
    Java网络编程之Socket
    Java网络编程之URLConnection
    Java中处理异常中return关键字
  • 原文地址:https://www.cnblogs.com/DrunBee/p/2565484.html
Copyright © 2020-2023  润新知