FOJ1492 地震预测

FOJ1492 地震预测

http://acm.fzu.edu.cn/problem.php?pid=1492
TLE了很多,以前向别人要了代码看不懂,今晚重做,一次AC。主要思想是记录排序后相邻的元素并及时更新。

#include < iostream >
#include
< cmath >
#include
< algorithm >
using   namespace  std;

struct  Node
{
    
int pos,val;
    
bool operator<(const Node &a) const
    
{
        
return val<a.val;
    }

}
node[ 100001 ];
int  pos[ 100001 ],alloc[ 100001 ][ 2 ]; // pos 原来元素(1-n)在排序后的位置,alloc排序后相邻元素在原序列的位置

inline 
int  min( int  a, int  b)
{
    
return a>? b : a;
}


int  main()
{
    
int i,n,res,t1,t2;
    
while(scanf("%d",&n)!=EOF)
    
{
        
for(i=1;i<=n;i++)
        
{
            scanf(
"%d",&node[i].val);
            node[i].pos
=i;
        }

        sort(node
+1,node+n+1);
        node[
0].pos=0,node[0].val=100000000;
        node[n
+1].pos=n+1,node[n+1].val=100000000;
        pos[
0]=0,pos[n+1]=n+1;
        
for(i=1;i<=n;i++)
        
{
            pos[node[i].pos]
=i;
            alloc[node[i].pos][
0]=node[i-1].pos;
            alloc[node[i].pos][
1]=node[i+1].pos;
        }

        res
=node[pos[n]].val;
        
for(i=1;i<n;i++)
        
{
            t1
=abs(node[pos[i]].val-node[pos[alloc[i][0]]].val);
            t2
=abs(node[pos[i]].val-node[pos[alloc[i][1]]].val);
            res
+=min(t1,t2);
            alloc[alloc[i][
0]][1]=alloc[i][1];
            alloc[alloc[i][
1]][0]=alloc[i][0];
        }

        printf(
"%d\n",res);
    }

    
return 0;
}

你可能感兴趣的:(FOJ1492 地震预测)