[Ynoi2016] 镜中的昆虫 题解
1.[JSOI2008]火星人 题解2.[BZOJ3786] 星系探索 题解3.[ZJOI2015]幻想乡战略游戏 题解4.[SDOI2015] 寻宝游戏5.[HNOI2011] 数学作业 题解6.[HDU5396] Expression 题解7.[NOIP2018] 旅行 题解8.[POI2012] Rendezvous 题解9.[BZOJ3037] 创世纪 题解10.[HEOI2014]大工程 题解11.[ZJOI2019] 语言 题解12.[国家集训队] 矩阵乘法 题解13.[THUPC2017] 天天爱射击 题解14.[SCOI2007] 蜥蜴 题解15.[SDOI2015] 星际战争 题解16.[国家集训队] happiness 题解17.[SDOI2016] 数字配对 题解18.[SDOI2009] 晨跑 题解19.[SCOI2007] 修车20.acwing329 围栏障碍训练场 题解21.无限之环 题解22.[BZOJ4350] 括号序列再战猪猪侠 题解23.[TJOI2015] 弦论 题解24.[SDOI2008] Sandy的卡片 题解25.[AHOI2013] 差异 题解
26.[Ynoi2016] 镜中的昆虫 题解
27.[JOISC 2023 Day3] Tourism 题解28.[PA2021] Od deski do deski 题解29.[TJOI2019] 甲苯先生的字符串 题解30.[POI2014] HOT-Hotels 加强版题解31.[Ynoi2015] 盼君勿忘 题解32.[luogu2123] 皇后游戏33.[JXOI2017] 加法 题解34.[luogu1248] 加工生产调度 题解35.[NOIP2018] 赛道修建36.[Ynoi2015] 我回来了 题解37.[HNOI2009] 图的同构计数38.[BZOJ3811] 玛里苟斯 题解39.[BZOJ3569] DZY Loves Chinese II 题解40.[SCOI2016] 幸运数字 题解41.[HDU5603] the soldier of love 题解42.[QOJ8672][PKUSC2024] 排队43.[BZOJ3489] A simple rmq problem44.[HAOI2010] 软件安装 题解45.[IOI2020] 连接擎天树 题解46.[LOJ6669] Nauuo and Binary Tree 题解47.[JOISC2019] 聚会 题解48.[CERC2014] Parades 题解49.[SHOI2017] 摧毁“树状图”50.[NOI2014] 购票 题解51.[WC2018] 通道 题解52.[BZOJ2741][FOTILE模拟赛] L 题解53.[THUSC2015] 异或运算 题解54.[BZOJ4771] 七彩树 题解55.[BZOJ4605] 崂山白花蛇草水 题解56.[BZOJ3600] 没有人的算术 题解57.[WC2014] 紫荆花之恋 题解58.[SDOI2008] 洞穴勘测 题解59.[POJ3237] 树的维护 题解60.[国家集训队] Tree2 题解61.[WC2006] 水管局长 题解62.[BZOJ3514] [Codechef MARCH14] GERALD07加强版 题解63.[luogu4114] Qtree1 题解64.[THUWC2017] 在美妙的数学王国中畅游 题解(内附求导小技巧)65.[BZOJ3159] 决战 题解66.[BZOJ2194] 快速傅立叶之二 题解67.[ZJOI2014] 力 题解68.[BZOJ3451] Normal 题解69.[BZOJ3771] Triple 题解70.[BZOJ3160] 万径人踪灭 题解71.[SDOI2015] 序列统计 题解72.[联合省选 2020A] 组合数问题 题解73.[HDU4625] JZPTREE+[国家集训队] Crash 的文明世界 题解74.[TJOI/HEOI2016] 求和 题解75.[BZOJ5093] 图的价值 题解76.[FJOI2016] 建筑师 题解77.[BZOJ4665] 小w的喜糖 题解78.[BZOJ3622] 已经没有什么好害怕的了 题解79.[BZOJ4671] 异或图 题解80.[BZOJ4833] 最小公倍佩尔数 题解81.[BalticOI 2022] Uplifting Excursion (Day1) 题解82.[JLOI2016] 成绩比较 题解难度在最近遇到的题里相对较高,在这里写一篇珂学题解。
(以下是学校给的部分分)
\(20\%\):直接暴力枚举。
另外 \(20\%\):假如我们取 \(pre\),对于 \(pre<l\) 的,\(ans++\),明显二维偏序,树状数组或 \(cdq\) 即可,时间复杂度 \(O(n\log n)\)。
另外 \(40\%\):相当于多加一个时间维,三维偏序,\(cdq\) 典中典,时间复杂度 \(O(n\log^2n)\)。
这是正解向的,实际上第二个部分分还可以莫队,第三个部分分还可以分块或带修莫队。
\(100\%\):这里引入珂朵莉树:
模板题 \(CF896C\),也是普遍认为的算法来源。
实际上就是将相同的数合到一个区间,对于区间赋值(珂朵莉树中通常称为推平),直接将这些区间全部并到一块,合成一个区间(珂朵莉树精髓,\(assign\))。时间复杂度在随机数据下,可证明为 \(O(n\log n)\) 级别的,可以自己上网搜。
我们用珂朵莉树维护 \(pre\),就可以保证时间维变成 \(n+m\) 个。
时间复杂度 \(O(n\log^2n)\)。
//中国珂学院 SNGXYZ 分院 OI 科第三办公室研究员 LYH
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e5+5,M=2e6+5;
int n,m,cnm,cnq,pr[N];
int a[N],lst[N],ans[N],cna;
struct node{
int x,y,t,v,id;
}q[M];map<int,int>mp;
int cmp1(node x,node y){
return x.t!=y.t?x.t<y.t:x.id<y.id;
}int cmp2(node x,node y){
return x.x!=y.x?x.x<y.x:x.id<y.id;
}struct chtholly{
struct odt{
int l,r;
mutable int v;
bool operator<(const odt &c)const{
return l<c.l;
}
};set<odt>st,cl[N];
#define iter set<odt>::iterator
iter ins(int l,int r,int v){
cl[v].insert({l,r,v});
return st.insert({l,r,v}).first;
}void del(int l,int r,int v){
cl[v].erase({l,r,v});
st.erase({l,r,v});
}iter spilt(int x){
iter it=st.lower_bound({x,0,0});
if(it!=st.end()&&(*it).l==x) return it;
it--;int l=(*it).l,r=(*it).r,v=(*it).v;
del(l,r,v),ins(l,x-1,v);
return ins(x,r,v);
}int pre(int x){
iter it=--st.upper_bound({x,0,0});
if((*it).l<x) return x-1;
iter ch=cl[(*it).v].lower_bound({x,0,0});
return (ch!=cl[(*it).v].begin())*(*(--ch)).r;
}void assign(int l,int r,int v,int t){
iter tr=spilt(r+1),tl=spilt(l);
vector<int>ps;
for(iter it=tl;it!=tr;it++){
if(it!=tl) ps.emplace_back((*it).l);
iter nxt=cl[(*it).v].upper_bound(*it);
if(nxt!=cl[(*it).v].end()) ps.emplace_back((*nxt).l);
cl[(*it).v].erase(*it);
}st.erase(tl,tr);ins(l,r,v);
ps.emplace_back(l);
iter nxt=cl[v].upper_bound({l,r,v});
if(nxt!=cl[v].end()) ps.emplace_back((*nxt).l);
for(int i=0;i<ps.size();i++){
q[++cnq]=(node){ps[i],pr[ps[i]],t,-1,0};
pr[ps[i]]=pre(ps[i]);
q[++cnq]=(node){ps[i],pr[ps[i]],t,1,0};
}
}
}seniorious;
struct BIT{
int c[N];
void add(int x,int y){
for(;x<N;x+=x&-x)
c[x]+=y;
}int ans(int x){
int re=0;
for(;x;x-=x&-x)
re+=c[x];
return re;
}
}bit;
void cdq(int l,int r){
if(l==r) return;
int mid=(l+r)/2;
cdq(l,mid),cdq(mid+1,r);
int i=l,j=mid+1;
while(j<=r){
while(i<=mid&&q[i].x<=q[j].x){
if(!q[i].id) bit.add(q[i].y+1,q[i].v);
i++;
}if(q[j].id) ans[q[j].id]+=bit.ans(q[j].y+1)*q[j].v;
j++;
}for(int k=l;k<i;k++)
if(!q[k].id) bit.add(q[k].y+1,-q[k].v);
inplace_merge(q+l,q+mid+1,q+r+1,cmp2);
}signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
if(!mp[a[i]])
mp[a[i]]=++cnm;
a[i]=mp[a[i]];
pr[i]=lst[a[i]];
lst[a[i]]=i;
q[++cnq]={i,pr[i],0,1,0};
seniorious.ins(i,i,a[i]);
}for(int i=1;i<=m;i++){
int x;cin>>x;
if(x==1){
int l,r,v;cin>>l>>r>>v;
if(!mp[v]) mp[v]=++cnm;
seniorious.assign(l,r,mp[v],i);
}else{
int l,r;cin>>l>>r;
q[++cnq]={r,l-1,i,1,++cna};
q[++cnq]={l-1,l-1,i,-1,cna};
}
}sort(q+1,q+cnq+1,cmp1);
cdq(1,cnq);
for(int i=1;i<=cna;i++)
cout<<ans[i]<<"\n";
return 0;
}/*
在太阳西斜的这个世界里,置身天上之森。
等这场战争结束之后,不归之人与望眼欲穿的众人。
人人本着正义之名,长存不灭的过去、逐渐消逝的未来。
我回来了,纵使日薄西山,即便看不到未来。
此时此刻的光辉,盼君勿忘。
————世界上最幸福的女孩
*/
合集:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)