社区讨论
ODT WA 60pts求调
P5350序列参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @m23e3msv
- 此快照首次捕获于
- 2024/10/10 22:24 去年
- 此快照最后确认于
- 2025/11/04 17:28 4 个月前
CPP
#include<bits/stdc++.h>
#define mod 1000000007
using namespace std;
int n,m;
struct node{
int l,r;
mutable long long v;
node(int l,int r,long long v):l(l),r(r),v(v){}
bool operator<(const node&rhs)const{
return l<rhs.l;
}
};
set<node>s;
auto split(int pos){
auto it=s.lower_bound(node(pos,0,0));
if(it!=s.end()&&it->l==pos){
return it;
}
it--;
int l=it->l,r=it->r;
long long v=it->v;
s.erase(it);
s.insert(node(l,pos-1,v));
return s.insert(node(pos,r,v)).first;
}
long long getsum(int l,int r){
auto en=split(r+1),bg=split(l);
long long sum=0;
for(auto it=bg;it!=en;it++){
sum=(sum+(long long)(it->r-it->l+1)*it->v)%mod;
}
return sum;
}
void update(int l,int r,long long v){
auto en=split(r+1),bg=split(l);
s.erase(bg,en);
s.insert(node(l,r,v));
}
void add(int l,int r,long long v){
auto en=split(r+1),bg=split(l);
for(auto it=bg;it!=en;it++){
it->v=(it->v+v)%mod;
}
}
void copy(int l1,int r1,int l2,int r2){
vector<node>res;
auto en1=split(r1+1),bg1=split(l1);
int len=l2-l1;
for(auto it=bg1;it!=en1;it++){
res.push_back(node(it->l+len,it->r+len,it->v));
}
auto en2=split(r2+1),bg2=split(l2);
s.erase(bg2,en2);
for(auto i:res){
s.insert(node(i.l,i.r,i.v));
}
}
void swp(int l1,int r1,int l2,int r2){
vector<node>res1,res2;
auto en1=split(r1+1),bg1=split(l1);
for(auto it=bg1;it!=en1;it++){
res1.push_back(*it);
}
s.erase(bg1,en1);
auto en2=split(r2+1),bg2=split(l2);
for(auto it=bg2;it!=en2;it++){
res2.push_back(*it);
}
s.erase(bg2,en2);
for(auto i:res1){
s.insert(node(i.l-l1+l2,i.r-l1+l2,i.v));
}
for(auto i:res2){
s.insert(node(i.l-l2+l1,i.r-l2+l1,i.v));
}
}
void turn(int l,int r){
auto en=split(r+1),bg=split(l);
auto zcy=bg,czx=en;
vector<node>res;
for(auto it=bg;it!=en;it++){
res.push_back(node(l+r-it->r,l+r-it->l,it->v));
}
s.erase(zcy,czx);
for(auto i:res){
s.insert(node(i.l,i.r,i.v));
}
}
void print(){
for(auto it=s.begin();it!=s.end()&&it->r<=n;it++){
int len=it->r-it->l+1;
long long v=it->v%mod;
while(len--){
printf("%lld ",v);
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
long long x;
scanf("%lld",&x);
x%=mod;
s.insert(node(i,i,x));
}
s.insert(node(n+1,n+1,0ll));
while(m--){
int opt,l1,r1,l2,r2;
long long val;
scanf("%d",&opt);
if(opt==1){
scanf("%d%d",&l1,&r1);
if(l1>r1)swap(l1,r1);
printf("%lld\n",getsum(l1,r1));
}
else if(opt==2){
scanf("%d%d%lld",&l1,&r1,&val);
val%=mod;
if(l1>r1)swap(l1,r1);
update(l1,r1,val);
}
else if(opt==3){
scanf("%d%d%lld",&l1,&r1,&val);
val%=mod;
if(l1>r1)swap(l1,r1);
add(l1,r1,val);
}
else if(opt==4){
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
if(l1>r1)swap(l1,r1);
if(l2>r2)swap(l2,r2);
copy(l1,r1,l2,r2);
}
else if(opt==5){
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
if(l1>r1)swap(l1,r1);
if(l2>r2)swap(l2,r2);
swp(l1,r1,l2,r2);
}
else{
scanf("%d%d",&l1,&r1);
if(l1>r1)swap(l1,r1);
turn(l1,r1);
}
}
print();
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...