NOIP2016提高A組8 11 自然數

2021-07-16 13:08:46 字數 2847 閱讀 3436

n)求出mex(1,i)(1<=i<=n):

雖然0

<=ai<=10^9,但只有n個數,所以mex一定小於等於n

for(long

long j=1;j<=n;j++)}}

顯然mex是單調不下降的,

接著用線段樹維護mex。

如果刪掉a[i],從下乙個mex比a[i]大的位置到下乙個a[i]的位置之前的mex都會改變,都會變成a[i]。

所以用線段樹維護區間最大mex以及區間mex和。

#include 

#include

#include

#include

#include

#include

#include

const long

long maxlongint=2147483647;

const long

long mo=1000000007;

const long

long n=2010000;

using namespace std;

long

long a[n],n,ans=0,next[n];

long

long bz[n]=;

struct ddx

tree[n*4];

long

long put(long

long v,long

long l,long

long r,long

long x,long

long y)

long

long mid=(l+r)/2;

if(x<=mid)

put(v*2,l,mid,x,y);

else

put(v*2+1,mid+1,r,x,y);

tree[v].sum=tree[v*2].sum+tree[v*2+1].sum;

tree[v].mxe=max(tree[v*2].mxe,tree[v*2+1].mxe);

}long

long findpos(long

long v,long

long l,long

long r,long

long x)

long

long mid=(l+r)/2;

if(tree[v].lazy>=0)

long

long o=0;

if(tree[v*2].mxe>x)

o=findpos(v*2,l,mid,x);

else

o=findpos(v*2+1,mid+1,r,x);

tree[v].sum=tree[v*2].sum+tree[v*2+1].sum;

tree[v].mxe=max(tree[v*2].mxe,tree[v*2+1].mxe);

return o;

}long

long change(long

long v,long

long l,long

long r,long

long x,long

long y,long

long z)

long

long mid=(l+r)/2;

if(tree[v].lazy>=0)

if(y<=mid)

change(v*2,l,mid,x,y,z);

else

if(x>mid)

change(v*2+1,mid+1,r,x,y,z);

else

tree[v].sum=tree[v*2].sum+tree[v*2+1].sum;

tree[v].mxe=max(tree[v*2].mxe,tree[v*2+1].mxe);

}long

long find(long

long v,long

long l,long

long r,long

long x,long

long y)

long

long mid=(l+r)/2;

if(tree[v].lazy>=0)

if(y<=mid)

find(v*2,l,mid,x,y);

else

if(x>mid)

find(v*2+1,mid+1,r,x,y);

else

tree[v].sum=tree[v*2].sum+tree[v*2+1].sum;

tree[v].mxe=max(tree[v*2].mxe,tree[v*2+1].mxe);

}int main()

}for(long

long i=1;i<=n;i++)

if(!next[i])

next[i]=n+1;

memset(bz,true,sizeof(bz));

for(long

long i=0;i<=n*4-1;i++)

tree[i].lazy=-1;

long

long top=0;

ans=0;

for(long

long j=1;j<=n;j++)

}put(1,1,n,j,top);

}for(long

long i=2;i<=n;i++)

find(1,1,n,i,n);

}printf("%lld",ans);

}

NOIP2016提高A組8 11 錢倉

發現,一定有乙個點作為起點,所有的路徑都不經過這個起點。接著貪心求答案,如果c i 1 將其中ci 1個錢往後 鋪 易證x 2 y2 x y 2 那麼維護乙個佇列,先進先出,就能保證最小。include include include include include include include ...

NOIP2016提高A組8 11 錢倉

發現,一定有乙個點作為起點,所有的路徑都不經過這個起點。接著貪心求答案,如果 c i 1 將其中 c i 1 個錢往後 鋪 易證 x 2 y 2 x y 2 那麼維護乙個佇列,先進先出,就能保證最小。include include include include include include in...

NOIP2016提高A組8 11 自然數

第一行n 第二行n個數 答案3 0 1 3 n 200000 a i 109 50分暴力明顯,用標記陣列隨便yy 但是你可能在想要離散化,其實凡是大於n的都直接等於n就行了,mex最大就是n 想 如果知道 1,n 的mex,能不能求到 2,n 顯然mex 1,i 是單調遞增的,當第乙個數被刪掉時,如...