现在的位置: 首页 > 算法 > 正文

poj 3368 Frequent values(线段树)

2019年04月02日 算法 ⁄ 共 1409字 ⁄ 字号 评论关闭
不会做,看了别人的想法 做的
详见原文 http://blog.sina.com.cn/s/blog_6635898a0100kzpx.html

#include <stdio.h>
#define M 100005

struct data
{
    int
l,r,max;
}node[3*M];
struct da
{
    int
start,end;
}seg[M];

int num[M],hash[M];
int Max (int a,int b)
{
    return a
> b?a:b;
}
void C_Tree (int left,int right,int u)
{
    node[u].l =
left;
    node[u].r =
right;
    if (left ==
right)
    {
       
node[u].max = seg[left].end - seg[left].start + 1;
       
return ;
    }
    int mid =
(left + right)>>1;
    C_Tree
(left,mid,u<<1);
    C_Tree
(mid+1,right,(u<<1)+1);
    node[u].max
= Max
(node[u<<1].max,node[(u<<1)+1].max);

}

int query (int left,int right,int u)
{
    if
(node[u].l == left&&node[u].r ==
right)
       
return node[u].max;
    int mid =
(node[u].l + node[u].r)>>1;
/////////////////////////////////////
 if (right <= mid)
       
return query (left,right,u<<1);
    if (left
>= mid + 1)
       
return query
(left,right,(u<<1)+1);
    int a =
query (left,mid,u<<1);
    int b =
query (mid+1,right,(u<<1)+1);
//////////////////////////////////////////
                                  
//这样写跟下面的写法有时竟然是一样AC和WA的关系 不明白
    if (right
<=
mid)                   
//什么原因??
       
query (left,right,u<<1);
    else if
(left >= mid + 1)
       
query (left,right,(u<<1)+1);
    else
    {
       
int a = query (left,mid,u<<1);
       
int b = query
(mid+1,right,(u<<1)+1);
       
return Max (a,b);
    }
}
int main ()
{
    int
n,m,i,k,loc,a,b;
    while (scanf
("%d",&n)&&n)
    {
       
scanf ("%d",&m);
       
for (i = 1;i <= n;i ++)
           
scanf ("%d",&num[i]);
       
k = 0;
       
loc = 100005;
       
for (i = 1;i <= n;i ++)
    

抱歉!评论已关闭.