CSUST 上場最簡單題 題解(線段樹)

2021-10-08 14:00:35 字數 2075 閱讀 5431

從左到右選三道題,要求難度遞增,求花費時間的最小值。

emm,對於這種題目,看到三個值,其實就想要列舉中間值,然後這個又是類似於逆序對。

以難度值為節點編號 ,時間為節點值,然後邊找邊更新,左右都來一次就好了。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define fi first

#define se second

#define min minn

#define debug printf(" i am here\n");

using

namespace std;

typedef

long

long ll;

typedef pair<

int,pair<

int,

int>

> pii;

const

int maxn=

1e6+

5,mod=

998244353

,inf=

0x3f3f3f3f

;const

double eps=

1e-10

;int n,a[maxn]

,b[maxn]

,tree[maxn<<2]

,ri[maxn]

,le[maxn]

;inline

intmin

(int a,

int b)

intquery

(int node,

int l,

int r,

int l,

int r)

if(l>=r)

int mi=inf,mid=

(l+r)

>>1;

if(mid>=l) mi=

min(mi,

query

(node<<

1,l,r,l,mid));

if(midmin(mi,

query

(node<<1|

1,l,r,mid+

1,r));

return mi;

}void

update

(int node,

int pos,

int num,

int l,

int r)

int mid=

(l+r)

>>1;

if(mid>=pos)

update

(node<<

1,pos,num,l,mid)

;else

update

(node<<1|

1,pos,num,mid+

1,r)

; tree[node]

=min

(tree[node<<1]

,tree[node<<1|

1]);

}signed

main()

for(

int i=

1;i<=n;i++

)memset

(tree,

0x3f

,sizeof

(tree));

for(

int i=

1;i<=n;i++

)memset

(tree,

0x3f

,sizeof

(tree));

for(

int i=n;i>=

1;i--

)int ans=inf;

for(

int i=

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

(ans==inf)

else

return0;

}

CSUST 2018 簡單題 題解(思維)

點集權值定義為所有點的權值和,還有如果這些點有連邊,那麼再加上那個邊權 emmm。特別像cf的思維題,根本想不到。我們將邊權分成均等的兩部分,分給它連線的兩個點,然後我們就成了選點問題,貪心即可。因為同時選了這兩個點,這個邊權值算,如果不同時選,相減就正好不算 include include inc...

八數碼簡單題題解

就是想練習一下雙向廣搜,然後就加強了這一題的資料。我也不知道其他方法能不能過 實際上就是太懶了,不想寫其他方法。好啦,回歸正題。什麼是雙向廣搜?所謂雙向搜尋指的是搜尋沿兩個方向同時進行 正向搜尋 從初始結點向目標結點方向搜尋 逆向搜尋 從目標結點向初始結點方向搜尋 當兩個方向的搜尋生成同一子結點時終...

BZOJ2683 簡單題 題解

1.若n比較小,則可以用二維的樹狀陣列或線段樹來做,但是500000,空間開不下,於是考慮離線cdq。子矩陣的數字和表示為也就是二維字首和,因此乙個要查詢的子矩陣,對其有影響的矩陣為s x2 y2 s x2 y1 1 s x1 1 y2 s x1 1 y1 1 這四個字首子矩陣 所以,在沒有修改操作...