10.18模拟赛

sol:不难吧,首先假设所有的狮子会一口气吃到底,(只剩一只),

10.18模拟赛

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=100005,inf=2e9+7;
int n,a[N],rt,re[N],pp,pre[N];
struct segtree{int l,r,mi,ma,miid,maid;inline int mid(){return (l+r)>>1;}}Tree[N<<2];
#define c1 x<<1
#define c2 x<<1|1
inline void Ami(int x,int y){Tree[x].mi=Tree[y].mi;Tree[x].miid=Tree[y].miid;}
inline void Ama(int x,int y){Tree[x].ma=Tree[y].ma;Tree[x].maid=Tree[y].maid;}
inline void Up(int x){if(Tree[c1].mi!=Tree[c2].mi){if(Tree[c1].mi<Tree[c2].mi)Ami(x,c1); else Ami(x,c2);}else Ami(x,c1);if(Tree[c1].ma!=Tree[c2].ma){if(Tree[c1].ma>Tree[c2].ma)Ama(x,c1); else Ama(x,c2);}else Ama(x,c2);}
inline void build(int l,int r,int x){Tree[x].l=l;Tree[x].r=r;if(l==r){Tree[x].mi=Tree[x].ma=a[l];Tree[x].maid=Tree[x].miid=l;return;}int mid=(l+r)>>1;build(l,mid,c1);build(mid+1,r,c2); Up(x);}
inline void ins(int po,int x,int v){if(Tree[x].l==Tree[x].r){Tree[x].mi=Tree[x].ma=v;return;}int mid=Tree[x].mid();if(po<=mid)ins(po,c1,v);else ins(po,c2,v); Up(x);}
inline void del(int po,int x){if(Tree[x].l==Tree[x].r){Tree[x].mi=inf;Tree[x].ma=-1;return;}int mid=Tree[x].mid();if(po<=mid)del(po,c1);else del(po,c2); Up(x);}
int main()
{
    int i,p1,p2; scanf("%d",&n);
    for(i=1;i<=n;i++)scanf("%d",&a[i]); build(1,n,1); pp=n-1;
    for(i=1;i<n;i++)
    {
        p1=Tree[1].miid; p2=Tree[1].maid; pre[p2]=i; a[p2]-=a[p1]; del(p1,1); ins(p2,1,a[p2]); re[i]=p1;
    }
    for(i=n-1;i>=1;i=min(--i,pp))
    {
        if(pre[re[i]])pp=pre[re[i]]-1;
    }printf("%d\n",pp); sort(re+1,re+pp+1); for(i=1;i<pp;i++)printf("%d ",re[i]);printf("%d\n",re[pp]);
}
View Code

相关文章: