社区讨论
P5350求助珂朵莉树QAQ
P5350序列参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mi7yepqg
- 此快照首次捕获于
- 2025/11/21 05:39 4 个月前
- 此快照最后确认于
- 2025/11/21 05:39 4 个月前
CPP
#include<stdio.h>
#include<set>
#include<vector>
using namespace std;
int n, m, mod;
struct Node {
int l, r; mutable int v;
Node(int L, int R = -1, int V = 0) : l(L), r(R), v(V) {}
bool operator < (const Node &x) const { return l < x.l; }
};
set<Node> s;
#define IT set<Node>::iterator
inline IT split(int pos) {
IT it = s.lower_bound(Node(pos));
if(it != s.end() && it->l == pos) return it;
int l = (--it)->l, r = it->r, v = it->v;
s.erase(it);
s.insert(Node(l, pos - 1, v));
return s.insert(Node(pos, r, v)).first;
}
inline void assign(int l, int r, int v) {
IT itr = split(r + 1), itl = split(l);
s.erase(itl, itr); s.insert(Node(l, r, v));
}
inline int sum(int l, int r) {
IT itr = split(r + 1), itl = split(l);
int ret = 0;
for(;itl != itr;itl++) {
ret = (ret + itl->v * (itl->r - itl->l + 1)) % mod;
}
return ret;
}
inline void add(int l, int r, int v) {
IT itr = split(r + 1), itl = split(l);
for(;itl != itr;itl++) {
itl->v = (itl->v + v) % mod;
}
}
inline void copy(int fl, int fr, int l, int r) {
IT itr = split(r + 1), itl = split(l);
IT itfr = split(fr + 1), itfl = split(fl);
vector<Node> v;
for(;itfl != itfr;itfl++) v.push_back(*itfl);
s.erase(itl, itr);
int d = l - fl;
for(int i = 0;i < v.size();i++) {
Node now = v[i];
s.insert(Node(now.l + d, now.r + d, now.v));
}
}
inline void swap(int &a, int &b) { a ^= b, b ^= a, a ^= b; }
inline void replace(int fl, int fr, int l, int r) {
if(l > fl) { swap(fl, l); swap(fr, r); }
IT itr = split(r + 1), itl = split(l);
IT itfr = split(fr + 1), itfl = split(fl);
vector<Node> a, b;
for(IT it = itfl;it != itfr;it++) a.push_back(*it);
for(IT it = itl;it != itr;it++) b.push_back(*it);
int d = l - fl;
s.erase(itl, itr); s.erase(itfl, itfr);
for(int i = 0;i < a.size();i++) { // [l, r]
Node now = a[i];
s.insert(Node(now.l + d, now.r + d, now.v));
}
for(int i = 0;i < b.size();i++) { // [fl, fr]
Node now = b[i];
s.insert(Node(now.l - d, now.r - d, now.v));
}
}
inline void reverse(int l, int r) {
IT itr = split(r + 1), itl = split(l);
vector<Node> v;
for(;itl != itr;itl++) {
v.push_back(*itl);
}
int d = r - l;
for(int i = v.size() - 1;i >= 0;i--) {
Node now = v[i];
s.insert(Node(now.l - d, now.r - d, now.v));
}
}
inline void print() {
for(IT it = s.begin();it != s.end();it++) {
Node now = *it;
for(int i = 0;i < now.r - now.l + 1;i++) {
printf("%d ", now.v);
}
}
}
int main(int argc, char** args) {
int t = 0; mod = 1e9 + 7;
scanf("%d %d", &n, &m);
for(int i = 1;i <= n;i++) {
scanf("%d", &t);
s.insert(Node(i, i, t));
}
s.insert(Node(n + 1));
int opt = 0, l = 0, r = 0, fl = 0, fr = 0, k = 0;
for(int i = 1;i <= m;i++) {
scanf("%d %d %d", &opt, &l, &r);
if(opt == 2 || opt == 3) scanf("%d", &k);
if(opt == 4 || opt == 5) scanf("%d %d", &fl, &fr);
if(opt == 1) printf("%d\n", sum(l, r));
if(opt == 2) assign(l, r, k);
if(opt == 3) add(l, r, k);
if(opt == 4) copy(l, r, fl, fr);
if(opt == 5) replace(fl, fr, l, r);
if(opt == 6) reverse(l, r);
}
print();
}
RE+TLE
回复
共 0 条回复,欢迎继续交流。
正在加载回复...