從左到右選三道題,要求難度遞增,求花費時間的最小值。
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 這四個字首子矩陣 所以,在沒有修改操作...