這兩題都是二維偏序,二維偏序的題怎麼去做呢?
回憶一下二維偏序,可以化為這樣乙個問題:設乙個點為(x,y),問(1 ~ x-1,1 ~ y-1)(即乙個點的左下方)有多少個點?
那我們一般怎麼做呢,就是固定一維(x或y)然後排序,在另一維統計答案。這麼做的正確性看看題,手動模擬一下就知道了(嚴格證明我不知道)。
poj 2352:
很明顯題目已經固定了y這一維,然後我們統計x就可以了。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define io ios::sync_with_stdio(false)
#define int long long
using
namespace std;
string s;
int a[
50005
],n,c[
50005
],t,ax[
50005
],ay[
50005
],ans[
50005];
void
add(
int x,
int y)
intask
(int x)
signed
main()
for(
int i=
0;i<=n-
1;i++
)}
luogu 3431
暴力dp很容易,然後我們發現其實就是二維偏序,就用二維偏序去優化dp行了。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define io ios::sync_with_stdio(false)
//#define int long long
using
namespace std;
struct node
t[100005*4
];struct dian
a[100005];
int n,m,k,ay[
100005
],ans=-1
;bool
cmp(dian x,dian y)
else
}void
build
(int rt,
int l,
int r)
int mid=l+r>>1;
build
(rt*
2,l,mid)
;build
(rt*2+
1,mid+
1,r)
; t[rt]
.sum=
max(t[rt*2]
.sum,t[rt*2+
1].sum);}
void
upd(
int rt,
int x,
int v)
int mid=t[rt]
.l+t[rt]
.r>>1;
if(x<=mid)
else
t[rt]
.sum=
max(t[rt*2]
.sum,t[rt*2+
1].sum);}
intask
(int rt,
int l,
int r)
int mid=t[rt]
.l+t[rt]
.r>>1;
if(l>mid)
else
if(r<=mid)
else
}int
main()
sort
(a+1
,a+k+
1,cmp)
;build(1
,1,k);
for(
int i=
1;i<=k;i++
)sort
(ay+
1,ay+k+1)
;int len=
unique
(ay+
1,ay+k+1)
-(ay+1)
;for
(int i=
1;i<=k;i++
) cout<}
二維偏序問題
想學cdq分治,然而cdq的經典題目是三維偏序問題,是建立在二維偏序問題的基礎上的。我這只蒟蒻連個二維偏序問題都沒做過。在網上找了一大圈,才勉強找到乙個二維偏序的題目。bzoj的許可權啊。是時候買個許可權號了。題目鏈結 這個牛客網也不知道是什麼鬼。給你n個物品,每個物品有兩個參量,分別為 s,w 讓...
Laptop 二維偏序
fst是一名可憐的小朋友,他很強,但是經常fst,所以rating一直低迷。但是重點在於,他非常適合acm!並在最近的區域賽中獲得了不錯的成績。拿到獎金後fst決定買一台新筆記本,但是fst發現,在 能承受的範圍內,筆記本的記憶體和速度是不可兼得的。可是,有一些筆記本是被另外一些 完虐 的,也就是記...
二維偏序 tree
最近接觸到一些偏序的東西。傳統線段樹非葉子節點的劃分點mid l r 2,但小r線段樹mid是自己定的。但滿足l mid 這道題n和詢問個數都到了1e5,所以考慮nlogn的做法。我們發現區間定位個數 答案 和完全被該區間包含的節點個數所相關。具體性質如下 區間定位個數 答案 2 區間長度 完全被該...