This commit is contained in:
Zengtudor 2025-08-18 20:38:47 +08:00
parent f9b5a94c12
commit 34c1b54467
2 changed files with 150 additions and 7 deletions

86
src/8/18/segtreerange.cpp Normal file
View File

@ -0,0 +1,86 @@
#include <cstdint>
#include <iostream>
#include <vector>
using ll = int64_t;
ll n;
std::vector<ll> t;
std::vector<ll> v;
std::vector<ll> lazy;
ll create(ll cur,ll l,ll r){
if(l==r){
t[cur]=v[l];
return v[l];
}
ll mid = (l+r)/2;
t[cur]=create(2*cur, l, mid)
+ create(2*cur+1, mid+1, r);
return t[cur];
}
ll rangeadd(ll cur, ll l, ll r, ll ql, ll qr, ll val) {
if (lazy[cur] != 0) {
t[cur] += lazy[cur] * (r - l + 1);
if (l != r) {
lazy[2 * cur] += lazy[cur];
lazy[2 * cur + 1] += lazy[cur];
}
lazy[cur] = 0;
}
if (ql > r || qr < l) return t[cur];
if (ql <= l && r <= qr) {
t[cur] += val * (r - l + 1);
if (l != r) {
lazy[2 * cur] += val;
lazy[2 * cur + 1] += val;
}
return t[cur];
}
ll mid = (l + r) / 2;
return t[cur] = rangeadd(2 * cur, l, mid, ql, qr, val)
+ rangeadd(2 * cur + 1, mid + 1, r, ql, qr, val);
}
ll rangequery(ll cur, ll l, ll r, ll ql, ll qr) {
if (lazy[cur] != 0) {
t[cur] += lazy[cur] * (r - l + 1);
if (l != r) {
lazy[2 * cur] += lazy[cur];
lazy[2 * cur + 1] += lazy[cur];
}
lazy[cur] = 0;
}
if (ql > r || qr < l) return 0;
if (ql <= l && r <= qr) return t[cur];
ll mid = (l + r) / 2;
return rangequery(2 * cur, l, mid, ql, qr)
+ rangequery(2 * cur + 1, mid + 1, r, ql, qr);
}
int main(){
std::cin>>n;
t.resize((n+1)*4);
v.resize(n+1);
lazy.resize((n+1)*4);
for(ll i=1; i<=n; i++){
std::cin>>v[i];
}
create(1, 1, n);
ll q;
std::cin>>q;
while(q--){
ll l, r, val;
std::cin>>l>>r>>val;
rangeadd(1, 1, n, l, r, val);
std::cout << t[1] << "\n";
}
std::cin>>q;
while(q--){
ll l, r;
std::cin>>l>>r;
std::cout << rangequery(1, 1, n, l, r) << "\n";
}
}

View File

@ -1,7 +1,64 @@
#include <climits>
#include <iostream>
#include <random>
int main(){
auto p = new int();
std::cout<<p<<'\n';
#include <list>
class MyLinkedList {
public:
std::list<int> l;
MyLinkedList() {
}
int get(int index) {
if(index>=l.size()){
return -1;
}
auto p = l.begin();
while(index--){
p++;
}
return *p;
}
void addAtHead(int val) {
l.push_front(val);
}
void addAtTail(int val) {
l.push_back(val);
}
void addAtIndex(int index, int val) {
if(index==l.size()){
l.push_back(val);
return;
}
if(index>l.size())return;
auto p = l.begin();
while(index--){
++p;
}
l.insert(p,val);
}
void deleteAtIndex(int index) {
if(0<=index && index<l.size()){
auto p = l.begin();
while(index--){
++p;
}
l.erase(p);
}
}
};
/**
* Your MyLinkedList object will be instantiated and called as such:
* MyLinkedList* obj = new MyLinkedList();
* int param_1 = obj->get(index);
* obj->addAtHead(val);
* obj->addAtTail(val);
* obj->addAtIndex(index,val);
* obj->deleteAtIndex(index);
*/
int main(){
}