线段树之老年康复
hdu - 1166 敌兵布阵(求和) 题目链接:戳这里
1 #include <cstdio> 2 #include <cstring> 3 #include <string> 4 #include <algorithm> 5 #include <cmath> 6 #include <vector> 7 #include <queue> 8 #include <iostream> 9 using namespace std; 10 typedef long long ll; 11 #define lson l,mid,rt<<1 12 #define rson mid+1,r,rt<<1|1 13 #define lef rt<<1 14 #define rig rt<<1|1 15 const int maxn = 5e4 + 10; 16 int t, n; 17 int sum[maxn << 2]; 18 char st[maxn]; 19 void update(int rt) 20 { 21 sum[rt] = sum[lef] + sum[rig]; 22 } 23 void build(int l, int r,int rt) //l 与 r代表的是数组里值的位置,rt用来找该值在树中的位置 24 { 25 if(l == r) 26 { 27 scanf("%d", &sum[rt]); 28 return; 29 } 30 //cout<<1<<endl; 31 int mid = l + (r - l) / 2; 32 build(lson), build(rson); 33 update(rt); 34 } 35 void add(int p, int c, int l, int r,int rt) 36 { 37 if(l == r) 38 { 39 sum[rt] += c; 40 return; 41 } 42 //cout<<l<<" "<<r<<endl; 43 int mid = l + (r - l) / 2; 44 if(p <= mid) add(p, c, lson); 45 else add(p, c, rson); 46 update(rt); 47 } 48 int qy(int L, int R, int l, int r, int rt) 49 { 50 if(L <= l && R >= r) 51 { 52 return sum[rt]; 53 } 54 //cout<<2<<endl; 55 int mid = l + (r - l) / 2; 56 int ans = 0; 57 if(L <= mid) ans += qy(L, R, lson); 58 if(R > mid) ans += qy(L, R, rson); 59 return ans; 60 } 61 int main(){ 62 63 scanf("%d", &t); 64 for(int cas = 1; cas <= t; ++cas) 65 { 66 printf("Case %d:\n", cas); 67 scanf("%d", &n); 68 build(1, n, 1); 69 //printf("111"); 70 while(scanf("%s", st)) 71 { 72 if(st[0] == 'E') break; 73 int u, v; 74 scanf("%d %d", &u, &v); 75 if(st[0] == 'Q') 76 { 77 printf("%d\n", qy(u, v, 1, n, 1)); 78 } 79 if(st[0] == 'A') 80 { 81 add(u, v, 1, n, 1); 82 } 83 if(st[0] == 'S') 84 { 85 add(u, -v, 1, n, 1); 86 } 87 } 88 } 89 return 0; 90 }
牛客网多校第6场 I Team Rocket(维护最大值) 题目链接:戳这里
1 #include <iostream> 2 #include<bits/stdc++.h> 3 using namespace std; 4 typedef long long ll; 5 #define lson l,mid,rt<<1 6 #define rson mid+1,r,rt<<1|1 7 #define lef rt<<1 8 #define rig rt<<1|1 9 const int maxn = 2e5 + 10; 10 const ll mod = 998244353; 11 const ll inf = 0x3f3f3f3f; 12 struct nod 13 { 14 int l; 15 int r; 16 int id; 17 nod(){} 18 nod(int L, int R, int Id) 19 { 20 l = L, r = R, id = Id; 21 } 22 bool operator < (const nod &b) const 23 { 24 return l < b.l; 25 } 26 }nu[maxn], tre[maxn << 2]; 27 int ans[maxn]; 28 ll res = 0; 29 ll x, y; 30 int pos = 0, cnt = 0; 31 void updat(int rt) 32 { 33 tre[rt].r = max(tre[lef].r, tre[rig].r); 34 return; 35 } 36 void build(int l, int r, int rt) 37 { 38 if(l == r) 39 { 40 tre[rt] = nu[l]; 41 return; 42 } 43 int mid = l + (r - l) / 2; 44 build(lson), build(rson); 45 updat(rt); 46 } 47 void qy(int l, int r, int rt, int i,int x) 48 { 49 if(tre[rt].r < x) return; 50 if(l == r) 51 { 52 ++cnt; 53 tre[rt].r = -inf; 54 res = (res * tre[rt].id) % mod; 55 ans[tre[rt].id] = i; 56 return; 57 } 58 int mid = l + (r - l) / 2; 59 qy(lson, i, x); 60 if(pos >= mid + 1) qy(rson, i, x); 61 updat(rt); 62 } 63 int main() 64 { 65 int t, n, m; 66 scanf("%d", &t); 67 for(int cas = 1; cas <= t; ++cas) 68 { 69 memset(tre, 0, sizeof(tre)); 70 memset(ans, 0, sizeof(ans)); 71 scanf("%d %d", &n, &m); 72 for(int i = 1; i <= n; ++i) 73 { 74 scanf("%lld %lld", &nu[i].l, &nu[i].r); 75 nu[i].id = i; 76 } 77 sort(nu + 1, nu + 1 + n); 78 build(1, n, 1); 79 res = 0; 80 printf("Case #%d:\n", cas); 81 for(int i = 1; i <= m; ++i) 82 { 83 scanf("%lld", &y); 84 x = y ^ res; 85 cnt = 0, res = 1; 86 pos = upper_bound(nu + 1, nu + 1 + n,nod(int(x), 0, 0)) - nu - 1; 87 if(pos > 0) 88 qy(1, n, 1, i, x); 89 if(cnt == 0) 90 res = 0; 91 printf("%d\n", cnt); 92 } 93 for(int i = 1; i <= n; ++i) 94 { 95 96 printf("%d%c", ans[i], i==n?'\n':' '); 97 } 98 99 } 100 return 0; 101 }