洛谷 P5350 序列 珂朵莉树
题目描述

分析
操作一、二、三为珂朵莉树的基本操作,操作四、五、六稍作转化即可
不会珂朵莉树请移步至这里
求和操作
把每一段区间分别取出,暴力相加
ll qh(ll l,ll r){
it2=Split(r+1),it1=Split(l);
ll ans=0;
for(it=it1;it!=it2;it++){
ans=(ans+(it->r-it->l+1)*it->val)%mod;
}
return ans;
}
赋值操作
直接调用\(Assign\)函数将其推平即可
void Assign(ll l,ll r,ll val){
it2=Split(r+1),it1=Split(l);
s.erase(it1,it2);
s.insert(asd(l,r,val));
}
修改操作
把每一段区间分别取出,暴力修改
void ad(ll l,ll r,ll val){
it2=Split(r+1),it1=Split(l);
for(it=it1;it!=it2;it++){
it->val+=val;
it->val%=mod;
}
}
复制操作
将区间\([l1,r1]\)中的元素取出记录一下,加入到区间\([l2,r2]\)中即可
void fz(ll l1,ll r1,ll l2,ll r2){
it2=Split(r1+1),it1=Split(l1);
for(tot=0,it=it1;it!=it2;it++){
a[++tot]=l2+it->l-l1,b[tot]=l2+it->r-l1,c[tot]=it->val;
}
for(ll i=1;i<=tot;++i){
Assign(a[i],b[i],c[i]);
}
}
交换操作
套用复制操作
我们可以先将区间\([l1,r1]\)复制到区间\([n+1,n+r1-l1+1]\)中
再将区间\([l2,r2]\)复制到区间\([l1,r1]\)中
最后再把区间\([n+1,n+r1-l1+1]\)复制到区间\([l2,r2]\)中
void jh(ll l1,ll r1,ll l2,ll r2) {
fz(l1,r1,n+1,n+r1-l1+1);
fz(l2,r2,l1,r1);
fz(n+1,n+r1-l1+1,l2,r2);
}
翻转操作
把区间中的数取出,再倒序加入
vector<asd> g;
void xz(ll l,ll r){
g.clear();
it2=Split(r+1),it1=Split(l);
aa=r;
for(it=it1;it!=it2;it++){
ll l=it->l,r=it->r,val=it->val;
g.push_back(asd(l,r,val));
}
s.erase(it1,it2);
for(ll i=0;i<g.size();i++){
s.insert(asd(aa-(g[i].r-g[i].l),aa,g[i].val));
aa-=(g[i].r-g[i].l+1);
}
}
完整代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+5;
const ll mod=1e9+7;
ll a[maxn],b[maxn],c[maxn];
struct asd{
ll l,r;
mutable ll val;
bool operator < (const asd& A) const{
return l<A.l;
}
asd(ll aa,ll bb,ll cc){
l=aa,r=bb,val=cc;
}
asd(ll aa){
l=aa;
}
};
#define sit set<asd>::iterator
set<asd> s;
ll aa,bb,cc,dd,ee,n,m;
sit it,it1,it2;
sit Split(ll wz){
it=s.lower_bound(asd(wz));
if(it!=s.end() && it->l==wz) return it;
it--;
ll l=it->l,r=it->r,val=it->val;
s.erase(it);
s.insert(asd(l,wz-1,val));
return s.insert(asd(wz,r,val)).first;
}
ll qh(ll l,ll r){
it2=Split(r+1),it1=Split(l);
ll ans=0;
for(it=it1;it!=it2;it++){
ans=(ans+(it->r-it->l+1)*it->val)%mod;
}
return ans;
}
void Assign(ll l,ll r,ll val){
it2=Split(r+1),it1=Split(l);
s.erase(it1,it2);
s.insert(asd(l,r,val));
}
void ad(ll l,ll r,ll val){
it2=Split(r+1),it1=Split(l);
for(it=it1;it!=it2;it++){
it->val+=val;
it->val%=mod;
}
}
vector<asd> g;
void xz(ll l,ll r){
g.clear();
it2=Split(r+1),it1=Split(l);
aa=r;
for(it=it1;it!=it2;it++){
ll l=it->l,r=it->r,val=it->val;
g.push_back(asd(l,r,val));
}
s.erase(it1,it2);
for(ll i=0;i<g.size();i++){
s.insert(asd(aa-(g[i].r-g[i].l),aa,g[i].val));
aa-=(g[i].r-g[i].l+1);
}
}
int tot;
void fz(ll l1,ll r1,ll l2,ll r2){
it2=Split(r1+1),it1=Split(l1);
for(tot=0,it=it1;it!=it2;it++){
a[++tot]=l2+it->l-l1,b[tot]=l2+it->r-l1,c[tot]=it->val;
}
for(ll i=1;i<=tot;++i){
Assign(a[i],b[i],c[i]);
}
}
void jh(ll l1,ll r1,ll l2,ll r2) {
fz(l1,r1,n+1,n+r1-l1+1);
fz(l2,r2,l1,r1);
fz(n+1,n+r1-l1+1,l2,r2);
}
int main(){
scanf("%lld%lld",&n,&m);
for(ll i=1;i<=n;i++){
scanf("%lld",&aa);
s.insert(asd(i,i,aa));
}
s.insert(asd(n+1,n+1,0));
for(ll i=1;i<=m;i++){
scanf("%lld",&aa);
if(aa==1){
scanf("%lld%lld",&bb,&cc);
printf("%lld\n",qh(bb,cc));
} else if(aa==2){
scanf("%lld%lld%lld",&bb,&cc,&dd);
Assign(bb,cc,dd);
} else if(aa==3){
scanf("%lld%lld%lld",&bb,&cc,&dd);
ad(bb,cc,dd);
} else if(aa==4){
scanf("%lld%lld%lld%lld",&bb,&cc,&dd,&ee);
fz(bb,cc,dd,ee);
} else if(aa==5){
scanf("%lld%lld%lld%lld",&bb,&cc,&dd,&ee);
jh(bb,cc,dd,ee);
} else {
scanf("%lld%lld",&bb,&cc);
xz(bb,cc);
}
}
it2=Split(n+1),it1=Split(1);
for(it=it1;it!=it2;it++){
for(ll i=it->l;i<=it->r;i++)printf("%lld ",it->val%mod);
}
printf("\n");
return 0;
}
洛谷 P5350 序列 珂朵莉树的更多相关文章
- 洛谷P2572 [SCOI2010]序列操作(珂朵莉树)
传送门 珂朵莉树是个吼东西啊 这题线段树代码4k起步……珂朵莉树只要2k…… 虽然因为这题数据不随机所以珂朵莉树的复杂度实际上是错的…… 然而能过就行对不对…… (不过要是到时候noip我还真不敢打… ...
- 洛谷$P2572\ [SCOI2010]$ 序列操作 线段树/珂朵莉树
正解:线段树/珂朵莉树 解题报告: 传送门$w$ 本来是想写线段树的,,,然后神仙$tt$跟我港可以用珂朵莉所以决定顺便学下珂朵莉趴$QwQ$ 还是先写线段树做法$QwQ$? 操作一二三四都很$eas ...
- 洛谷AT2342 Train Service Planning(思维,动态规划,珂朵莉树)
洛谷题目传送门 神仙思维题还是要写点东西才好. 建立数学模型 这种很抽象的东西没有式子描述一下显然是下不了手的. 因为任何位置都以\(k\)为周期,所以我们只用关心一个周期,也就是以下数都在膜\(k\ ...
- 洛谷P4344 [SHOI2015]脑洞治疗仪(珂朵莉树)
传送门 看到区间推倒……推平就想到珂朵莉树 挖脑洞直接assign,填坑先数一遍再assign再暴力填,数数的话暴力数 //minamoto #include<iostream> #inc ...
- 洛谷P2787 语文1(chin1)- 理理思维(珂朵莉树)
传送门 一看到区间推倒……推平操作就想到珂朵莉树 区间推平直接assign,查询暴力,排序的话开一个桶统计,然后一个字母一个字母加就好了 开桶统计的时候忘了保存原来的左指针然后挂了233 //mina ...
- 洛谷P2082 区间覆盖(加强版)(珂朵莉树)
传送门 虽然是黄题而且还是一波离散就能解决的东西 然而珂朵莉树还是很好用 相当于一开始区间全为0,然后每一次区间赋值,问最后总权值 珂朵莉树搞一搞就好了 //minamoto #include< ...
- [转]我的数据结构不可能这么可爱!——珂朵莉树(ODT)详解
参考资料: Chtholly Tree (珂朵莉树) (应某毒瘤要求,删除链接,需要者自行去Bilibili搜索) 毒瘤数据结构之珂朵莉树 在全是珂学家的珂谷,你却不知道珂朵莉树?来跟诗乃一起学习珂朵 ...
- 『珂朵莉树 Old Driver Tree』
珂朵莉树 珂朵莉树其实不是树,只是一个借助平衡树实现的数据结构,主要是对于有区间赋值的数据结构题,可以用很暴力的代码很高效地完成任务,当然这是建立在数据随机的基础上的. 即使数据不是随机的,写一个珂朵 ...
- 「学习笔记」珂朵莉树 ODT
珂朵莉树,也叫ODT(Old Driver Tree 老司机树) 从前有一天,珂朵莉出现了... 然后有一天,珂朵莉树出现了... 看看图片的地址 Codeforces可还行) 没错,珂朵莉树来自Co ...
随机推荐
- yum 安装包的时候提示“没有可用软件包”
今天在使用 yum 命令进行包的下载时候,Linux 提示 没有可用的软件包~ 如下: [root@localhost share]# yum -y install wordpress 已加载插件:f ...
- django drf 10大请求序列化方法
## 整体单改 路由层.模型层.序列化层不需要做修改,只需要处理视图层:views.py ```python"""1) 单整体改,说明前台要提供修改的数据,那么数据就需要 ...
- WARN deploy.SparkSubmit$$anon$2: Failed to load org.apache.spark.examples.sql.streaming.StructuredNetworkWordCount.
前言 今天运行Spark Structured Streaming官网的如下 ./bin/run-example org.apache.spark.examples.sql.streaming.Str ...
- python在循环中追加字典
1. 在循环中用append增加key值,最终生成全是key值的list: 2. 在循环中用append增加value值,最终生成全是value值的list: 3. 最后用zip将两个list合并成一 ...
- 【UVA11383】 Golden Tiger Claw 【二分图KM算法(板子)】
题目 题目传送门:https://www.luogu.com.cn/problem/UVA11383 分析 最近刚刚学了二分图,然后来了一个这样的题,看完题意之后,稍微想一想就能想出来是一个二分图,然 ...
- abp审计日志功能的关闭
参考官网介绍:https://aspnetboilerplate.com/Pages/Documents/Audit-Logging
- python 请使用迭代查找一个list中最小和最大值,并返回一个tuple
请使用迭代查找一个list中最小和最大值,并返回一个tuple: 要注意返回的值的类型是不是tuple def findMinAndMax(L): min=0 max=0 if len(L)==0: ...
- hbase2.1.9 centos7 完全分布式 搭建随记
hbase2.1.9 centos7 完全分布式 搭建随记 这里是当初在三个ECS节点上搭建hadoop+zookeeper+hbase+solr的主要步骤,文章内容未经过润色,请参考的同学搭配其他博 ...
- web3.js支持SimpleChain跨链调用
SimpleChain的跨链协议已经对外开放很久了,很多应用也已经慢慢支持Simplechain的跨链.最近社区开发者web3.js中集成了Simplechain的跨链接口,开发者只需用npm安装包文 ...
- 「疫期集训day7」周期
我们成功入侵了圣康坦,屋子里到处都是面包,食物,水...现在我们的目标就在眼前----亚眠------鲁道登夫攻势中损失惨重的德国精英兵 今天考试考出了历史最低,原因在于T1签到题挂了,ull真的毒瘤 ...