標籤+線段樹+離散化好題。
題意:給定乙個長度為
首先,我們知道求滿足
那麼對於原問題,
#include#include#include#define ri register int
using namespace std;
const int maxn=30020;
int n,a[maxn];
int l[maxn<<2],r[maxn<<2],add[maxn<<2],tot[maxn];
long long sum[maxn<<2],ans;
struct nodeshu[maxn];
bool cmp(node a,node b)
void build(int p,int lft,int rit)
void pushupadd(int p)
void update1(int p,int where,int k)
if(where<=r[p <<1]) update1(p <<1,where,k);
if(l[p <<1|1]<=where) update1(p <<1|1,where,k);
pushupadd(p);
}int query1(int p,int lft,int rit)
void pushup(int p)
void update2(int p,int where,long long k)
if(where<=r[p <<1]) update2(p <<1,where,k);
if(l[p <<1|1]<=where) update2(p <<1|1,where,k);
pushup(p);
}long long query2(int p,int lft,int rit)
int main()
sort(shu+1,shu+n+1,cmp);
a[shu[1].pla]=1;
for(ri i=2;i<=n;i++)
build(1,1,n);
for(ri i=2;i<=n;i++)
for(ri i=2;i<=n;i++)
cout<
return 0;
}
P1637 三元上公升子串行
對於這個題,我們對於每乙個數i,分別求出所有比它小的,在它前面的和 比它大的,在它後面的,然後把這兩個乘起來,然後再把這些積加起來就可以了 然而這樣直接做複雜度太高了,我們要優化,仿照樹狀陣列求逆序對的方法,我們就可以在可以接受的時間內求出並且解決問題了 include include includ...
題解 P1637 三元上公升子串行
這道題我也不知道怎麼了,改著改著就ac了。然而自己看不懂自己的 但在我仔細思考後就想通了 233。不是有三個數嗎,那就吧當前列舉的數當做三個數中的第二個,先找比它小的數有幾個,再找比它大的數有幾個,分別用mi 和ma 記錄下來,最終答案就是ans mi i ma i include include ...
三元上公升子串行 洛谷p1637
erwin最近對一種叫 thair 的東西巨感興趣。在含有n個整數的序列a1,a2.an中,三個數被稱作 thair 當且僅當i求乙個序列中 thair 的個數。輸入格式 開始乙個正整數n,以後n個數a1 an。輸出格式 thair 的個數 輸入樣例 1 4 50 18 3 4 6 8 1415 1...