记录编号 566362 评测结果 AAAAAAAAAA
题目名称 [NOIP 2018]铺设道路 最终得分 100
用户昵称 Gravatar遥时_彼方 是否通过 通过
代码语言 C++ 运行时间 0.016 s
提交时间 2021-11-06 13:38:22 内存使用 4.20 MiB
显示代码纯文本
#include<bits/stdc++.h>
#define ull unsigned long long
#define ll long long
using namespace std;
ull ans;
int nc;
int n[20][100001][2]; 
int ej(int x)
{
	int re=1;
	while(x>>re) re++;
	return --re;
}
void cz(int l,int r,int dn)
{
	if(l==r)
	{
		ans+=(n[0][l][0]-dn);
		return;
	}
	int th=ej(r-l+1);
	int thp=(1<<th);
	int md;
	if(n[th][l][0]<=n[th][r-thp+1][0])
	{
		md=n[th][l][1];
		ans+=(n[th][l][0]-dn);
		dn=n[th][l][0];
	}
	else
	{
		md=n[th][r-thp+1][1];
		ans+=(n[th][r-thp+1][0]-dn);
		dn=n[th][r-thp+1][0];
	}
	if(md!=l) cz(l,md-1,dn);
	if(md!=r) cz(md+1,r,dn);
	return;
}
int main()
{
    freopen("2018road.in","r",stdin);
	freopen("2018road.out","w",stdout);
    cin>>nc;
    for(int i=1;i<=nc;i++)
    {
    	scanf("%d",&n[0][i][0]);
    	n[0][i][1]=i;
    }
    for(int i=1;(1<<i)<=nc;i++)
    {
    	for(int st=1;st+(1<<i)-1<=nc;st++)
    	{
    		if(n[i-1][st][0]<=n[i-1][st+(1<<(i-1))][0])
    		{
    			n[i][st][0]=n[i-1][st][0];
    			n[i][st][1]=n[i-1][st][1];
    		}
    		else
    		{
    			n[i][st][0]=n[i-1][st+(1<<(i-1))][0];
    			n[i][st][1]=n[i-1][st+(1<<(i-1))][1];
    		}
    	}
    }
    cz(1,nc,0);
    cout<<ans<<endl;
    return 0;
}