基礎線段樹
先算al<=ar的,之後取反再算一次
設l[i]表示往左第乙個大於當前的位置+1,r[i]是往右小於的-1
那麼區間[l,r]滿足條件當且僅當r[l]>=r且l[r]<=l
列舉右端點,在x處維護[x,x~r]的最大值,考慮r-1->r的變化
加入的區間[x,r]需要滿足r[x]>=r,l[r]<=x,即對滿足r[x]>=r的x∈[l[r],r]的更新
按照r[x]排序單調單點刪r[x]#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
#define inf 2147483647
#define min(a,b) (ab?a:b)
#define ll long long
//#define file
using namespace std;
struct type q[50001];
struct type b[50001];
int tr[200001][2],tr[200001],a[50001],l[50001],r[50001],d[50001],ans[50001],h,t,n,i,j,k,l,q,find;
bool cmp(type a,type b)
}void change(int t,int l,int r,int x,int y,int s)
down(t*2,mid-l+1);
down(t*2+1,r-mid);
if (x<=mid) change(t*2,l,mid,x,y,s);
if (mid=a[i]) --t;
r[i]=d[t]-1;
d[++t]=i;
} fo(i,1,n) b[i]=;
sort(b+1,b+n+1,cmp);
mt(1,1,n),j=1,k=1;
fo(i,1,n) }
int main()
Prime 演算法的簡述
前面在介紹並查集時順便提了kruskal演算法,既然已經說到了最小生成樹問題,就沒有道理不把prime演算法說了。這裡面先補充下kruskal演算法的大概意思,kruskal演算法通過把所有的邊從小到大排列後,不斷取權值最小的邊加入最小生成樹 起初可能是離散的多個樹,最終連成乙個整體 並通過並查集來...
Prime 程式設計師的修養
求質數演算法的n種境界 1 試除法和初級篩法 儘管題目並沒有要我們寫乙個最優的演算法,但是身為乙個程式設計師,優化應該是一種習慣,在程式設計的過程中,隨著思考進行優化。如果你只能想出乙個最簡單的方法,難道你會有什麼競爭力嗎?最開始我用的就是這個方法,可以說這是最簡單的一種方法了,而且最開始,我就是想...
poj 2395 prime的遞迴實現
求最小水桶的大小,每到達乙個農村就能把水桶補滿。可見是用生成最小樹,求最大邊。關於prime個人感覺用遞迴實現會少乙個for的時間。本題的坑 輸入邊的時候要找最小的,不然會出錯。1 include2 include3 using namespace std 4const int inf 0x3f3f...