HDU 5517 二維樹狀陣列

2021-08-05 19:03:37 字數 1589 閱讀 6023

hdu 5517 

題意: 

有二元組(a,b),三元組(c,d,e)。當b == e時它們能構成(a,c,d)。 

然後,當不存在(u,v,w)!=(a,b,c)且u>=a,v>=b,w>=c時,則是乙個better集合裡的元素。 

問這個better集合有幾個元素。 

思路: 

自己寫的時候完全沒有思路啊~ 

參考了和

首先基本思路是對於(a1,b1),(a2,b2),當b1==b2時,只留a最大的那個。 

同理(c,d,e),當c、e相同時只留d最大的那個。 

因為e必須要和b相同才能拼接成三元組,所以遍歷輸入(c,d,e)時就能把有效的(c,d,e)記錄下來形成(a,d,e). 

然後要去重和不合法的(a,d,e)。按a從大到小排序,用二位樹狀陣列統計在平面直角座標上x >= d和y>=e的地方是否出現過(a,d,e),沒出現過即合法。 

#include #include #include #include #include #include #include #include using namespace std;

#define ll long long

const int maxn = 1e5 + 5;

int id1[maxn], cnt1[maxn];

struct p

p(int _c, int _d, int _e, ll _v)

bool operator == (const p &rbs)const

}p[maxn];

bool cmp1(p u, p v)

const int maxm = 1000 + 5;

int tree[maxm][maxm];

int lowbit(int a)

void add(int x, int y, int val)

}ll sum(int x, int y)

}return ans;

}ll query(int x1, int y1, int x2, int y2)

int main()

else if(id1[b] == a) cnt1[b]++;

}int num = 0;

for(int i = 0 ; i < m ; i++)

}sort(p, p + num, cmp1);

n = 0;

for(int i = 1 ; i < num ; i++)

else p[++n] = p[i];

}// for(int i = 0 ; i < n ; i++)

// printf("i = %d, c = %d, d = %d, e = %d\n", i, p[i].c, p[i].d, p[i].e);

memset(tree, 0, sizeof(tree));

ll ans = 0;

for(int i = n ; i >= 0 ; i--)

printf("case #%d: %i64d\n", cas, ans);

}return 0;

}

hdu5517 二維樹狀陣列

題意是給了 n個二元組 m個三元組,二元組可以和三元組 合併生成3元組,合併條件是與合併成 前提是 b e,如果存在組合 uwv 使得u a w c v d 並且uwv和acd不等 就說abc 不是最優的,求問最後又多少個組合是最優的 這個組合中是允許重複的 我們對於每個b只取最大的a,然後讓這個最...

HDU 5517 三維偏序 二維樹狀陣列

題意 已知a集合 a,b b集合 c,d,e c a b a,c,d 在b和e相等的情況下才可以,問題是求出c中有幾個元素,該元素除了自己沒有比他大的,的定義是當 a a b b c c 時,才成立。思路 三位偏序cdq可以解決,但是如果抓住c,d的範圍是1000的話,可以直接用二維樹狀陣列代替。由...

hdu1892二維樹狀陣列

樹狀陣列一般的操作只有 1.單點更新,區間查詢 2.區間更新,單點查詢 其中區間更新和單點更新不能同時寫在一起,會對樹狀陣列的結構早成影響。這題 wa的情況主要是沒有考慮到 x1,y1 可能大於 x2,y2 訓練 訓練題鏈結 include include include include inclu...