NOIP 2013 day 2 t1 t2

来源:互联网 发布:mac无法重装系统 编辑:程序博客网 时间:2024/04/30 15:05

这里写图片描述
从最小的差开分别处理

#include <iostream>#include <cstdio>#include <cstring>#include <ctime>#define ll long longusing namespace std;const int maxm=1e5+100;struct node{    ll sum;    ll id;}st[maxm<<2];ll ans,n,t[maxm],cnt;void build(ll o,ll l,ll r){    if(l==r)    {        st[o].sum=t[l];        st[o].id=l;        return;    }    ll mid=(l+r)/2;    build((o<<1),l,mid);    build((o<<1)|1,mid+1,r);    if(st[(o<<1)].sum<st[(o<<1)|1].sum)      st[o]=st[(o<<1)];    else     st[o]=st[(o<<1)|1];}ll ask(ll o,ll l,ll r,ll ql,ll qr){    if(ql<=l&&r<=qr)     return o;    ll mid=(l+r)/2;    ll o1,o2;    if(qr<=mid)      return ask(o<<1,l,mid,ql,qr);    if(ql>mid)     return ask((o<<1)|1,mid+1,r,ql,qr);    o1=ask((o<<1),l,mid,ql,qr),o2=ask((o<<1)|1,mid+1,r,ql,qr);    if(st[o1].sum<st[o2].sum) return o1;    else return o2;}void dfs(ll l,ll r,ll sum){    if(l>r) return;    ll o=ask(1,1,cnt,l,r);    //printf("%d\n",st[o].id);    //if(st[o].sum-sum==0) return;    ans+=(st[o].sum-sum);    dfs(l,st[o].id-1,st[o].sum);    dfs(st[o].id+1,r,st[o].sum);}int main(){    //freopen("block.in","r",stdin);    //freopen("block.out","w",stdout);    scanf("%lld",&n);    ll x;    for(int i=1;i<=n;i++)     {         scanf("%lld",&x);         if(x!=t[cnt]) t[++cnt]=x;     }    build(1,1,cnt);    dfs(1,cnt,0);    printf("%lld",ans);    return 0;} 

这里写图片描述
找峰值,然后特判。

#include <cstdio>#include <iostream>#include <queue>#include <cstring>#include <ctime>#include <algorithm>using namespace std;int n,a[110000],tot;int ans;bool f[110000];int main(){    scanf("%d",&n);    for(int i=1,x;i<=n;i++)    {        scanf("%d",&x);        if(a[tot]!=x) a[++tot]=x;    }    for(int i=1;i<=tot;i++)     if(a[i]>a[i-1]&&a[i]>a[i+1]) f[i]=1,ans++;    ans*=2;    if(f[1]!=1) ans++;    if(f[tot]==1) ans--;    printf("%d",ans);}
原创粉丝点击