CPOJ 九校聯考第二場day1 優美序列

題面

從左到右枚舉優美區間的右端點,假設當前枚舉到ii,那麼區間[k,i][k,i]爲優美區間當且僅當
k+num==i k+num==i
其中numnum[k,i][k,i]中相差爲11的數對(a,b)(a<b)(a,b)(a<b)的數對個數
枚舉到ii時我們將a[i]+1a[i]+1a[i]1a[i]-1的貢獻計入
a[i]+1a[i]+1所在位置爲p1p_1,a[i]1a[i]-1所在位置爲p2p_2
那麼若pi(i=1,2)<ip_i(i=1,2)<ipi>0p_i>0時會對[1,pi][1,p_i]產生11的貢獻
所以我們只需一棵茲磁區間加法與區間求最大值的線段樹即可
我們用堆按從大到小維護ll,對於詢問(l,r)(l,r),我們在線段樹上查詢[1,l][1,l]k+numk+num的最大值以及最大的kk,若k+num==ik+num==i則找到了該詢問的答案,將該詢問從堆中彈出,否則將其留在堆中,並枚舉下一個ii
顯然若存在優美區間[l1,r1][l_1,r_1][l2,r2][l_2,r_2]滿足l2<r1l_2<r_1且互不包含,那麼區間[l2,r1][l_2,r_1]也是優美的,因此可以保證這樣最優
Code
區間詢問的第二種寫法比第一種寫法不知快到哪裏去了

Pair ask(LL l,LL r,LL now,LL x,LL y){
		if (x<=l && r<=y) return tr[now];
		if (r<x || l>y) return Pair(0,0);
		pd(now);
		return max(ask(l,mid,lson,x,y),ask(mid+1,r,rson,x,y));
	}
Pair ask(LL l,LL r,LL now,LL x,LL y){
		if (x<=l && r<=y) return tr[now];
		if (r<x || l>y) return Pair(0,0);
		pd(now);
		Pair res=Pair(0,0);
		if (mid>=x) cmax(res,ask(l,mid,lson,x,y));
		if (mid+1<=y) cmax(res,ask(mid+1,r,rson,x,y));
		return res;
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章