HDU6447(离散化扫描线+树状数组)
一眼看过去就x排序扫描一下,y是1e9的离散化一下,每层用树状数组维护一下,然后像dp倒着循环似的树状数组就用y倒着插就可行了。
1 #pragma comment(linker, "/STACK:1024000000,1024000000") 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cmath> 6 #include <ctime> 7 #include <cctype> 8 #include <climits> 9 #include <iostream> 10 #include <iomanip> 11 #include <algorithm> 12 #include <string> 13 #include <sstream> 14 #include <stack> 15 #include <queue> 16 #include <set> 17 #include <map> 18 #include <vector> 19 #include <list> 20 #include <fstream> 21 #include <bitset> 22 #define init(a, b) memset(a, b, sizeof(a)) 23 #define rep(i, a, b) for (int i = a; i <= b; i++) 24 #define irep(i, a, b) for (int i = a; i >= b; i--) 25 using namespace std; 26 27 typedef double db; 28 typedef long long ll; 29 typedef unsigned long long ull; 30 typedef pair<int, int> P; 31 const int inf = 0x3f3f3f3f; 32 const ll INF = 1e18; 33 34 template <typename T> void read(T &x) { 35 x = 0; 36 int s = 1, c = getchar(); 37 for (; !isdigit(c); c = getchar()) 38 if (c == '-') s = -1; 39 for (; isdigit(c); c = getchar()) 40 x = x * 10 + c - 48; 41 x *= s; 42 } 43 44 template <typename T> void write(T x) { 45 if (x < 0) x = -x, putchar('-'); 46 if (x > 9) write(x / 10); 47 putchar(x % 10 + '0'); 48 } 49 50 template <typename T> void writeln(T x) { 51 write(x); 52 puts(""); 53 } 54 55 const int maxn = 1e5 + 5; 56 int T, n; 57 struct cord { 58 int x, y, v; 59 60 bool operator < (const cord& rhs) const { 61 if (x != rhs.x) return x < rhs.x; 62 return y > rhs.y; 63 } 64 }a[maxn]; 65 int yy[maxn], tot; 66 struct BIT { 67 int F[maxn]; 68 69 void Update(int pos, int val) { 70 for (; pos <= tot; pos += pos&-pos) 71 F[pos] = max(F[pos], val); 72 } 73 74 int Query(int pos) { 75 int ret = 0; 76 for (; pos; pos -= pos&-pos) 77 ret = max(ret, F[pos]); 78 return ret; 79 } 80 }bit; 81 82 int main() { 83 for (read(T); T; T--, tot = 0) { 84 read(n); 85 rep(i, 1, n) { 86 read(a[i].x); 87 read(a[i].y); 88 read(a[i].v); 89 yy[++tot] = a[i].y; 90 } 91 sort(yy + 1, yy + 1 + tot); 92 tot = unique(yy + 1, yy + 1 + tot) - yy - 1; 93 rep(i, 1, n) { 94 a[i].y = lower_bound(yy + 1, yy + 1 + tot, a[i].y) - yy; 95 } 96 97 sort(a + 1, a + 1 + n); 98 init(bit.F, 0); 99 rep(i, 1, n) { 100 bit.Update(a[i].y, bit.Query(a[i].y - 1) + a[i].v); 101 } 102 writeln(bit.Query(tot)); 103 } 104 return 0; 105 }