mirror of
https://gitcode.com/Zengtudor/alg2025.git
synced 2025-08-21 10:42:07 +00:00
update
This commit is contained in:
parent
f9b5a94c12
commit
34c1b54467
86
src/8/18/segtreerange.cpp
Normal file
86
src/8/18/segtreerange.cpp
Normal 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";
|
||||
}
|
||||
}
|
71
src/test.cpp
71
src/test.cpp
@ -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(){
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user