当前位置: 首页 > news >正文

「WC2014-紫荆花之恋」题解

P3920 [WC2014] 紫荆花之恋

sol

首先如果不带修的话就是点分治板子,带修的话就是动态点分树板子。

由于写过一篇动态点分树的博客,这里就对动态点分树部分不详细讲解了,主要讲一下信息维护吧。不会的话可以点进去先看一下。

理论上来说,应当使用平衡树,可以使得全局复杂度为 \(O(n\log^3n)\),但平衡树又难写常数又大,因此考虑根号数据结构。

式子推一下就是一维偏序条件,那么这个数据结构必须实现插入并查询排名的功能。考虑大小链,大链有序,小链无序,每次大链二分小链遍历。如果小链大小超过阈值直接和大链归并排序即可,阈值设做 \(\sqrt n\) 可以做到 \(O(n\sqrt n)\) 的复杂度。整体复杂度是 \(O(n\sqrt n\log^2 n)\),实际上跑得特别快。

然后就没什么了,就是个动态点分树板子。

code

const int N=1e5+5,V=1e9,B=320;
const flt A=0.8;int n;
struct sq{vec<ll> big,sml,t;inline void ins(ll x){sml.pub(x);if(sml.size()>B){int a=0,b=0;t.clear();sort(sml.begin(),sml.end());while(a<big.size()&&b<sml.size())t.pub(big[a]<sml[b]?big[a++]:sml[b++]);while(a<big.size())t.pub(big[a++]);while(b<sml.size())t.pub(sml[b++]);sml.clear();big=t;}}inline ll query(ll v){int res=upper_bound(big.begin(),big.end(),v)-big.begin();for(auto i:sml)if(i<=v)++res;return res;}inline void clear(){big.clear(),sml.clear();}
}dat[N],daf[N];int Fa[N];
vec<pil> g[N];
ll r[N];
vec<int> son[N],grd[N],grl[N];bool don[N];int siz,sz[N];
void gsiz(int x,int f){sz[x]=1;for(auto e:g[x]){int y=e.fir;if(!don[y]&&y!=f)gsiz(y,x),sz[x]+=sz[y];}
}
int rot,mx[N];
void grot(int x,int f){mx[x]=siz-sz[x];for(auto e:g[x]){int y=e.fir;if(!don[y]&&y!=f)grot(y,x),chmax(mx[x],sz[y]);}if(mx[x]<mx[rot])rot=x;
}
void dfs(int x,int f,int z,int dp){dat[z].ins(dp-r[x]);if(Fa[z])daf[z].ins(grl[x].back()-r[x]);grd[x].pub(z),grl[x].pub(dp);son[z].pub(x);for(auto e:g[x]){int y=e.fir;if(!don[y]&&y!=f)dfs(y,x,z,dp+e.sec);}
}
void calc(int x,int fa){gsiz(x,x);siz=sz[x];mx[rot=0]=inf;grot(x,x);x=rot;Fa[x]=fa;for(auto e:g[x]){int y=e.fir;if(!don[y])dfs(y,x,x,e.sec);}dat[x].ins(-r[x]);if(fa)daf[x].ins(grl[x].back()-r[x]);don[x]=1;for(auto e:g[x]){int y=e.fir;if(!don[y])calc(y,x);}
}inline void Main(){int T;cin>>T>>n;ll ans=0;rep(i,1,n){int a,c;cin>>a>>c>>r[i];a^=ans%V;if(!a){dat[1].ins(-r[i]);}else{g[a].pub({i,c}),g[i].pub({a,c});Fa[i]=a;grd[i]=grd[a],grl[i]=grl[a];grd[i].pub(a),grl[i].pub(0);for(auto &j:grl[i])j+=c;repl(j,0,grd[i].size()){int x=grd[i][j];ans+=dat[x].query(r[i]-grl[i][j]);if(j)ans-=daf[x].query(r[i]-grl[i][j-1]);son[x].pub(i);dat[x].ins(grl[i][j]-r[i]);if(j)daf[x].ins(grl[i][j-1]-r[i]);}dat[i].ins(-r[i]);daf[i].ins(c-r[i]);repl(j,1,grd[i].size())if(son[grd[i][j-1]].size()*A<son[grd[i][j]].size()){int x=grd[i][j-1],f=Fa[x];don[f]=1;for(auto y:son[x]){while(1){int t=grd[y].back();grd[y].pob(),grl[y].pob();if(t==x)break;}son[y].clear();don[y]=0;dat[y].clear(),daf[y].clear();}son[x].clear();don[x]=0;dat[x].clear(),daf[x].clear();calc(x,f);break;}}put(ans);}
}
http://www.hn-smt.com/news/371/

相关文章:

  • 想让默认头像不再千篇一律,就顺手复刻了一下 GitHub 的思路
  • java(3)基础规范
  • 读书日记3
  • Tuack 生成 OI 比赛题目 PDF 笔记
  • 数据库三大范式、Union和Union all的区别
  • CSP-S2025 游记
  • 「LG3600-随机数生成器」题解
  • MathType7下载包安装教程2025最新下载+安装+汉化激活(附安装包,超详细)
  • 2025强网杯ezphp复现
  • 漏洞报告被拒绝的常见原因及避免方法
  • 【IEEE出版 | 重庆邮电大学主办 | 多届次、高层次】第六届人工智能与计算机工程国际学术会议(ICAICE 2025)
  • Docker容器里面部署的Jenkins的Java17升级到21版本(无需删除之前容器,内部在线升级) - 攻城狮
  • 报表知识
  • 渐进过程中大O与小o混用
  • 消息队列的有序性
  • 【LTDC】DMA2D —— 嵌入式系统的 GPU
  • unity管理器设计:Manager of Managers
  • iview table 排序 columns 里面写 sortable: custom 不要写 sortable: true 不然会进行二次内部排序序号等 字段。
  • 本地运行nginx服务,模拟线上环境访问项目
  • git提交远程项目步骤
  • 2025 年搅拌器搅拌设备,侧入式搅拌设备,斜插式揽拌设备,卧式搅拌设备厂家最新推荐,聚焦资质、案例、售后的五家企业深度解读
  • 2025 年环保搅拌设备,搅拌装置设备,框式搅拌设备厂家最新推荐,实力品牌深度解析采购无忧之选!
  • CorelDRAW的shell扩展ShellXP.dll导致资源管理器explorer.exe卡死/冻结/无响应/挂起
  • 2025 年定制矿车,大型矿车,固定式矿车厂家最新推荐,产能、专利、环保三维数据透视
  • 醒图电脑版下载与安装教程(2025最新版)
  • 2025 年江苏电缆附件,热缩电缆附件,冷缩电缆附件,预制电缆附件厂家最新推荐,产能、专利、环保三维数据透视
  • Android Studio 使用glibc2.28的版本
  • 2025年10月兰花油品牌推荐榜:五款精华油深度对比与选购指南
  • 2025年浅拾兰花双萃致臻精华油:从成分与技术维度解析其护肤功效
  • 2025 年进口螺杆泵,萨伯特螺杆泵,污泥螺杆泵厂家最新推荐,实力品牌深度解析采购无忧之选!