博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[hdu3308]线段树
阅读量:5059 次
发布时间:2019-06-12

本文共 3340 字,大约阅读时间需要 11 分钟。

题意:单点更新,区间LCIS(最长连续递增序列)查询。具备区间合并维护的性质,不用线段树用什么~

1 #pragma comment(linker, "/STACK:10240000,10240000")  2   3 #include 
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include
11 #include
12 #include
13 #include
14 #include
15 #include
16 17 using namespace std; 18 19 #define mem0(a) memset(a, 0, sizeof(a)) 20 #define lson l, m, rt << 1 21 #define rson m + 1, r, rt << 1 | 1 22 #define define_m int m = (l + r) >> 1 23 #define Rep(a, b) for(int a = 0; a < b; a++) 24 #define lowbit(x) ((x) & (-(x))) 25 #define constructInt4(name, a, b, c, d) name(int a = 0, int b = 0, int c = 0, int d = 0): a(a), b(b), c(c), d(d) {} 26 #define constructInt3(name, a, b, c) name(int a = 0, int b = 0, int c = 0): a(a), b(b), c(c) {} 27 #define constructInt2(name, a, b) name(int a = 0, int b = 0): a(a), b(b) {} 28 29 typedef double db; 30 typedef long long LL; 31 typedef pair
pii; 32 typedef multiset
msi; 33 typedef multiset
::iterator msii; 34 typedef set
si; 35 typedef set
::iterator sii; 36 typedef vector
vi; 37 38 const int dx[8] = { 1, 0, -1, 0, 1, 1, -1, -1}; 39 const int dy[8] = { 0, -1, 0, 1, -1, 1, 1, -1}; 40 const int maxn = 1e5 + 7; 41 const int maxm = 1e5 + 7; 42 const int maxv = 1e7 + 7; 43 const int MD = 1e9 +7; 44 const int INF = 1e9 + 7; 45 const double PI = acos(-1.0); 46 const double eps = 1e-10; 47 48 int A[maxn]; 49 50 struct SegTree { 51 struct Node { 52 int suflen, prelen, len; 53 } tree[maxn << 2]; 54 55 Node merge(Node a, Node b, int l, int m, int r) { 56 Node c; 57 int leftLen = m - l + 1, rightLen = r - m; 58 c.prelen = a.prelen; 59 if (c.prelen == leftLen && A[m] < A[m + 1]) c.prelen += b.prelen; 60 c.suflen = b.suflen; 61 if (c.suflen == rightLen && A[m] < A[m + 1]) c.suflen += a.suflen; 62 c.len = a.len; 63 c.len = max(c.len, b.len); 64 if (A[m] < A[m + 1])c.len = max(c.len, a.suflen + b.prelen); 65 return c; 66 } 67 void build(int l, int r, int rt) { 68 if (l == r) { 69 int x; 70 scanf("%d", &x); 71 A[l] = x; 72 tree[rt].len = tree[rt].prelen = tree[rt].suflen = 1; 73 return ; 74 } 75 define_m; 76 build(lson); 77 build(rson); 78 tree[rt] = merge(tree[rt << 1], tree[rt << 1 | 1], l, m, r); 79 } 80 void update(int p, int x, int l, int r, int rt) { 81 if (l == r) { 82 tree[rt].len = tree[rt].prelen = tree[rt].suflen = 1; 83 A[l] = x; 84 return ; 85 } 86 define_m; 87 if (p <= m) update(p, x, lson); 88 else update(p, x, rson); 89 tree[rt] = merge(tree[rt << 1], tree[rt << 1 | 1], l, m, r); 90 } 91 Node query(int L, int R, int l, int r, int rt) { 92 if (L <= l && r <= R) return tree[rt]; 93 define_m; 94 if (R <= m) return query(L, R, lson); 95 if (L > m) return query(L, R, rson); 96 return merge(query(L, m, lson), query(m + 1, R, rson), L, m, R); 97 } 98 }; 99 100 SegTree st;101 102 int main() {103 //freopen("in.txt", "r", stdin);104 int T;105 cin >> T;106 while (T--) {107 int n, m;108 cin >> n >> m;109 st.build(1, n, 1);110 for (int i = 0, u, v; i < m; i++) {111 char s[3];112 scanf("%s%d%d", s, &u, &v);113 if (s[0] == 'U') {114 st.update(++u, v, 1, n, 1);115 }116 else {117 printf("%d\n", st.query(++u, ++v, 1, n, 1).len);118 }119 }120 }121 return 0;122 }
View Code

 

转载于:https://www.cnblogs.com/jklongint/p/4418997.html

你可能感兴趣的文章
感谢青春
查看>>
Jquery Uploadify4.2 falsh 实现上传
查看>>
雨林木风 GHOST_XP SP3 快速装机版YN12.08
查看>>
linux基础-命令
查看>>
java对象的深浅克隆
查看>>
Hadoop流程---从tpch到hive
查看>>
数据结构3——浅谈zkw线段树
查看>>
Introduction to my galaxy engine 2: Depth of field
查看>>
V2019 Super DSP3 Odometer Correction Vehicle List
查看>>
Python 3.X 练习集100题 05
查看>>
今时不同往日:VS2010十大绝技让VS6叹服
查看>>
设计器 和后台代码的转换 快捷键
查看>>
在线视频播放软件
查看>>
用代码生成器生成的DAL数据访问操作类 基本满足需求了
查看>>
28初识线程
查看>>
Monkey测试结果分析
查看>>
Sublime Text 3 设置
查看>>
浅谈C++底层机制
查看>>
STL——配接器、常用算法使用
查看>>
第9课 uart
查看>>