珂朵莉树

news/2024/9/23 15:23:32/文章来源:https://www.cnblogs.com/wlesq/p/18331441

好文章

个人理解:珂朵莉树其实就是\(set\)大法,就是暴力,可以构造特殊数据卡掉,但是在随机数据的情况下,它是非常快的

struct ASD
{ll l,r;mutable ll val;//方便更改,指针是常量,必须加上mutablebool operator < (const ASD& A)const{return l<A.l;}ASD(ll a,ll b,ll c){l=a;r=b;val=c;}ASD(ll a){l=a;}
};
#define sit set<ASD>::iterator//懒人

分裂操作,将一个区间中的一个位置分裂成\([l,pos],[pos+1,r]\),是核心步骤,以后都是围绕他进行的

	set<ASD> s;sit split(ll pos){sit it=s.lower_bound(ASD(pos));if(it!=s.end()&&(*it).l==pos)return it;it--;ll l=(*it).l,r=(*it).r,val=(*it).val;s.erase(it);s.insert(ASD(l,pos-1,val));//注意边界啊,以后要用到return s.insert(ASD(pos,r,val)).first;//first返回迭代器,second返回值}

区间推平,很暴力,一定要先找\(r+1\),再找&l&,否则位置会改变,\(RE\)

	void assign(ll l,ll r,ll val){sit it2=split(r+1),it1=split(l);//删除区间[l,r+1)中所有的节点,注意左闭右开s.erase(it1,it2);s.insert(ASD(l,r,val));}	

同理,区间加

	void add(ll l,ll r,ll val){sit it2=split(r+1),it1=split(l);for(sit it=it1;it!=it2;it++){(*it).val+=val;}}

查找第\(k\)

	ll kth(ll l,ll r,ll k){sit it2=split(r+1),it1=split(l);vector <pair<ll,ll>> a;a.clear();for(sit it=it1;it!=it2;it++){a.push_back({(*it).val,(*it).r-(*it).l+1});}sort(a.begin(),a.end());//排个序就行了,真暴力for(ull i=0;i<a.size();i++){k-=a[i].second;if(k<=0)return a[i].first;}// return 0;}
简单封一封
#define sit set<ASD>::iterator
struct ASD
{ll l,r;mutable ll val;bool operator < (const ASD& A)const{return l<A.l;}ASD(ll a,ll b,ll c){l=a;r=b;val=c;}ASD(ll a){l=a;}
};
struct ODT
{set<ASD> s;sit split(ll pos){sit it=s.lower_bound(ASD(pos));if(it!=s.end()&&(*it).l==pos)return it;it--;ll l=(*it).l,r=(*it).r,val=(*it).val;s.erase(it);s.insert(ASD(l,pos-1,val));return s.insert(ASD(pos,r,val)).first;}void assign(ll l,ll r,ll val){sit it2=split(r+1),it1=split(l);s.erase(it1,it2);s.insert(ASD(l,r,val));}	void add(ll l,ll r,ll val){sit it2=split(r+1),it1=split(l);for(sit it=it1;it!=it2;it++){(*it).val+=val;}}ll kth(ll l,ll r,ll k){sit it2=split(r+1),it1=split(l);vector <pair<ll,ll>> a;a.clear();for(sit it=it1;it!=it2;it++){a.push_back({(*it).val,(*it).r-(*it).l+1});}sort(a.begin(),a.end());for(ull i=0;i<a.size();i++){k-=a[i].second;if(k<=0)return a[i].first;}// return 0;}ll cx(ll l ,ll r,ll x,ll mod){sit it2=split(r+1),it1=split(l);ll ans=0;for(sit it=it1;it!=it2;it++){ans=(ans+((*it).r-(*it).l+1)*qpow((*it).val,x,mod)%mod)%mod;}return ans;}
}odt;

例题

[模板CF896C]

点击查看代码
#include <bits/stdc++.h>
#define speed() ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define ll long long
#define ull unsigned long long
#define lid (rt<<1)
#define rid (rt<<1|1)
// #define endl '\n'
//#define int long long
#define pb push_back
#define pii pair<int,int>using namespace std;
ll qpow(ll  a,ll b,ll mod)
{ll ans=1;a%=mod;//一定要有,CF不让用__int128while(b){if(b&1)ans=ans*a%mod;a=a*a%mod;b>>=1;}return ans;
}
#define sit set<ASD>::iterator
struct ASD
{ll l,r;mutable ll val;bool operator < (const ASD& A)const{return l<A.l;}ASD(ll a,ll b,ll c){l=a;r=b;val=c;}ASD(ll a){l=a;}
};
struct ODT
{set<ASD> s;sit split(ll pos){sit it=s.lower_bound(ASD(pos));if(it!=s.end()&&(*it).l==pos)return it;it--;ll l=(*it).l,r=(*it).r,val=(*it).val;s.erase(it);s.insert(ASD(l,pos-1,val));return s.insert(ASD(pos,r,val)).first;}void assign(ll l,ll r,ll val){sit it2=split(r+1),it1=split(l);s.erase(it1,it2);s.insert(ASD(l,r,val));}	void add(ll l,ll r,ll val){sit it2=split(r+1),it1=split(l);for(sit it=it1;it!=it2;it++){(*it).val+=val;}}ll kth(ll l,ll r,ll k){sit it2=split(r+1),it1=split(l);vector <pair<ll,ll>> a;a.clear();for(sit it=it1;it!=it2;it++){a.push_back({(*it).val,(*it).r-(*it).l+1});}sort(a.begin(),a.end());for(ull i=0;i<a.size();i++){k-=a[i].second;if(k<=0)return a[i].first;}// return 0;}ll cx(ll l ,ll r,ll x,ll mod){sit it2=split(r+1),it1=split(l);ll ans=0;for(sit it=it1;it!=it2;it++){ans=(ans+((*it).r-(*it).l+1)*qpow((*it).val,x,mod)%mod)%mod;}return ans;}
}odt;
const int N = 1e5+5;
ll n,m,seed,vmax,a[N];
ll rnd()
{ll ret = seed;seed = (seed * 7 + 13)%1000000007;return ret;
}int main ()
{speed();// freopen("in.in","r",stdin);// freopen("out.out","w",stdout);cin>>n>>m>>seed>>vmax;// cout<<n<<endl;for(int i=1;i<=n;i++){a[i]=(rnd()%vmax)+1;odt.s.insert(ASD(i,i,a[i]));}// cout<<"******"<<endl;ll op,l,r,x,y;for(int i=1;i<=m;i++){// cout<<i<<endl;op=(rnd()%4)+1;// cout<<op<<endl;l=(rnd()%n)+1;r=(rnd()%n)+1;if(l>r)swap(l,r);if(op==3){x=rnd()%(r-l+1)+1;cout<<odt.kth(l,r,x)<<endl;}else{x=rnd()%vmax+1;}if(op==1){// cout<<i<<endl;odt.add(l,r,x);}if(op==2)odt.assign(l,r,x);if(op==4){y=rnd()%vmax+1;cout<<odt.cx(l,r,x,y)<<endl;}// cout<<"*******"<<endl;}return 0;
}

image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/773897.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云原生 .NET Aspire 8.1 新增对 构建容器、编排 Python的支持

.NET Aspire 用于云原生应用开发,提供用于构建、测试和部署分布式应用的框架,这些应用通常利用微服务、容器、无服务器体系结构等云构造。2024年7月23日宣布的新 8.1 版本是该平台自 5 月正式发布以来的第一次重大更新,Microsoft 对 .NET Aspire 的第一个重大更新Aspire 8.1…

读零信任网络:在不可信网络中构建安全系统04最小特权

最小特权1. 公钥基础设施 1.1. PKI 1.2. 数字证书本身并不能解决身份认证问题 1.2.1. 需要一种方法来验证获得的公钥的确属于某人 1.2.2. 公钥基础设施(PKI)解决了这个问题 1.3. PKI定义了一组角色及其职责,能够在不可信的网络中安全地分发和验证公钥 1.4. PKI的目标是允许无…

Linux工作原理13用户环境

13用户环境 本书主要关注 Linux 系统中通常作为服务器进程和交互式用户会话基础的部分。但是,系统和用户最终还是要在某个地方相遇。在这一点上,启动文件扮演着重要角色,因为它们为 shell 和其他交互式程序设置了默认值。它们决定了用户登录时系统的行为方式。 大多数用户不…

[vue3] Vue3源码阅读笔记 reactivity - baseHandlers

vue3的reactivity模块的baseHandlers主要为普通对象和数组的Proxy实现了拦截操作的处理,通过3个类分别实现了getter和setter等操作的拦截,并对一些数组原型上的方法做了特殊处理,使得数组操作可以更好地适配vue的响应式系统。源码位置:https://github.com/vuejs/core/blob/…

Go语言结构体(struct)面向对象编程进阶篇(封装,继承和多态)

作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 目录一.Go语言的封装(encapsulation)实现1.什么是封装(encapsulation)2.封装(encapsulation)的好处3.golang如何实现封装(encapsulation)4.代码实现4.1 代码组织结构4.2 创建go.mod文件4.3 dongman.go4.4 mai…

解决历理 如何用cmd运行小键盘

cmd不可以直接运行键盘上的按键,但是可以打开电脑上的软键盘来对应键盘键。 打开软键盘来运行键盘上的按键步骤如下: 1、点击Windows徽标键和R键,在出现的窗口中输入cmd; 2、点击确定,弹出命令提示符窗口; 3、在命令提示符窗口输入osk,点击键盘上的Enter,屏幕上就会出现…

ARGOCD用户管理

1.创建用户alice kubectl apply -f argocd-cm.yamlapiVersion: v1 kind: ConfigMap metadata:name: argocd-cmnamespace: argocdlabels:app.kubernetes.io/name: argocd-cmapp.kubernetes.io/part-of: argocd data:# add an additional local user with apiKey and login capab…

全网最适合入门的面向对象编程教程:27 类和对象的Python实现-Python中异常层级与自定义异常类的实现

本文主要介绍了在使用Python进行面向对象编程时,异常的层级和如何使用继承关系完成自定义自己项目中异常类,并以传感器数据采集为例进行讲解。全网最适合入门的面向对象编程教程:27 类和对象的 Python 实现-Python 中异常层级与自定义异常类的实现摘要: 本文主要介绍了在使…

初识WPF

1.新建wpf程序,app.xaml文件说明: 2.Attribute特征:为了表示同类标签中的某个标签阈值不同,可以给它的特征赋值: 3.命名空间的引用:使用xmlns特征来定义名称空间:语法格式为:xmlns[:可选的映射前缀]=“命名空间”,如果没有写映射前缀,说明是默认的命名空间: 4.x:Cl…

认知觉醒-1-大脑的构造

最近重新开始审视自己的生活和规划,无意间在微信读书上看到了《认知觉醒》这本书评价挺不错的,所以通过听书和看书的方式进行了学习,感觉对自己的现状很有启发,简单记录一下自己的读书心得。 大脑的构造导致了你就是不爱学习 本书提到,人类的大脑是由三部分构成的,可以分…

前端断点及使用

原文链接:https://www.cnblogs.com/sunny3158/p/17797552.html 一、打断点的方式1.找到源码位置,添加断点(1)寻找源码位置①如果是正常html页面,那么源码一般是在对应域名下面。如果是webpack处理的页面,并且开启了源码映射,源码就是在webpack://下面。可通过快捷键ctrl…

emojiCTF2024

emojiCTF2024emojiCTF2024 WEB http 题目: ​​ 思路:修改 UA 头为 EMOJI_CTF_User_Agent_v1.0:User-Agent: EMOJI_CTF_User_Agent_v1.0​ 修改 http 方法,试了一下,修改成 PUT,可以 添加一个自定义头部,EMOJI-CTF-Auth: Passw0rd!​ 抓包修改就行,成功后在路径上加个 …