【HDOJ】4902 Nice boat
区间线段树。题目还不错。
1 /* */ 2 #include <iostream> 3 #include <string> 4 #include <map> 5 #include <queue> 6 #include <set> 7 #include <vector> 8 #include <algorithm> 9 #include <cstdio> 10 #include <cmath> 11 #include <cstring> 12 #include <climits> 13 #include <cctype> 14 using namespace std; 15 16 #define lson l, mid, rt<<1 17 #define rson mid+1, r, rt<<1|1 18 #define MAXN 100005 19 20 typedef struct { 21 int mx, val; 22 } node_t; 23 24 node_t T[MAXN<<2]; 25 int n, m, x; 26 int l; 27 28 int gcd(int n, int m) { 29 if (m == 0) 30 return n; 31 if (m > n) 32 return gcd(m, n); 33 return gcd(m, n%m); 34 } 35 36 void PushUp(int rt) { 37 T[rt].val = T[rt<<1].val==T[rt<<1|1].val ? T[rt<<1].val:-1; 38 T[rt].mx = max(T[rt<<1].mx, T[rt<<1|1].mx); 39 } 40 41 void PushDown(int rt) { 42 if (T[rt].val >= 0) { 43 T[rt<<1].val = T[rt<<1|1].val = T[rt].val; 44 T[rt<<1].mx = T[rt<<1|1].mx = T[rt].mx; 45 } 46 } 47 48 void build(int l, int r, int rt) { 49 if (l == r) { 50 scanf("%d", &T[rt].val); 51 T[rt].mx = T[rt].val; 52 return ; 53 } 54 int mid = (l+r)>>1; 55 build(lson); 56 build(rson); 57 PushUp(rt); 58 } 59 60 void update1(int ll, int rr, int l, int r, int rt) { 61 if (ll<=l && rr>=r) { 62 T[rt].val = x; 63 T[rt].mx = x; 64 return ; 65 } 66 int mid = (l+r)>>1; 67 PushDown(rt); 68 if (rr <= mid) { 69 update1(ll, rr, lson); 70 } else if (ll > mid) { 71 update1(ll, rr, rson); 72 } else { 73 update1(ll, mid, lson); 74 update1(mid+1, rr, rson); 75 } 76 PushUp(rt); 77 } 78 79 void update2(int ll, int rr, int l, int r, int rt) { 80 if (T[rt].mx <= x) 81 return ; 82 int mid = (l+r)>>1; 83 if (ll<=l && rr>=r) { 84 if (T[rt].val >= 0) { 85 T[rt].val = gcd(T[rt].val, x); 86 T[rt].mx = T[rt].val; 87 } else { 88 update2(ll, rr, lson); 89 update2(ll, rr, rson); 90 PushUp(rt); 91 } 92 return ; 93 } 94 PushDown(rt); 95 if (rr <= mid) { 96 update2(ll, rr, lson); 97 } else if (ll > mid) { 98 update2(ll, rr, rson); 99 } else { 100 update2(ll, mid, lson); 101 update2(mid+1, rr, rson); 102 } 103 PushUp(rt); 104 } 105 106 void printAll(int l, int r, int rt) { 107 if (T[rt].val >= 0) { 108 for (int i=l; i<=r; ++i) 109 printf("%d ", T[rt].val); 110 return ; 111 } 112 int mid = (l+r)>>1; 113 printAll(lson); 114 printAll(rson); 115 } 116 117 int main() { 118 int i, j, k; 119 int l, r; 120 int t; 121 122 #ifndef ONLINE_JUDGE 123 freopen("data.in", "r", stdin); 124 freopen("data.out", "w", stdout); 125 #endif 126 127 scanf("%d", &t); 128 while (t--) { 129 scanf("%d", &n); 130 build(1, n, 1); 131 scanf("%d", &m); 132 while (m--) { 133 scanf("%d %d %d %d", &k, &l, &r, &x); 134 if (k == 1) { 135 update1(l, r, 1, n, 1); 136 } else { 137 update2(l, r, 1, n, 1); 138 } 139 } 140 printAll(1, n, 1); 141 putchar('\n'); 142 } 143 144 return 0; 145 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 为DeepSeek添加本地知识库
· 精选4款基于.NET开源、功能强大的通讯调试工具
· DeepSeek智能编程
· 大模型工具KTransformer的安装
· [计算机/硬件/GPU] 显卡