P11365 Ynoi2024 新本格魔法少女りすか

news/2025/1/12 19:44:10/文章来源:https://www.cnblogs.com/binbin200811/p/18667201

P11365 Ynoi2024 新本格魔法少女りすか

神奇的压位树状数组……

思路

序列区间查询操作,考虑分块。

处理好散块与整块之间的贡献即可。

  • 散块对散块:每次询问的区间产生的散块用树状数组计算贡献,复杂度 \(O(\sum m_i \sqrt{n\log n})\)
  • 整块对散块(区间):枚举整块,处理 \(ressum_i\) 表示小于等于 \(i\) 的数在块内有多少个,在处理前缀和 \(sum_i\) 表示前 \(i\) 个数对整块的贡献和。然后枚举查询的区间,前缀和作差直接计算区间 \([l,r]\) 对于该块的贡献,复杂度 \(O(n\sqrt{n\log n})\)

tips:整块的贡献可能算重,可以考虑只计算比自己小的整块的贡献。

总复杂度 \(O(n\sqrt{n\log n})\)

压位树状数组

由于这是一个排列,我们把 \(i\) 在二进制位中的后六位拆下来,设二进制后六位组成的数是 \(x\),在 \(b[i>>6]\) 中把第 \(x\) 位标为 \(1\)。同时,在树状数组 \((i>>6)+1\) 的位置加一。

查询时,除了正常的在树状数组查询,还需要在 \(b[i>>6]\) 加上小于 \(x\) 的位标为一的个数。

这样操作后,单次 \(\log n\) 的查询,变味了 \(\log(n/64)=\log n -6\) 次。

CODE

#include<bits/stdc++.h>
using namespace std;const int maxB=6e3+5,maxn=5e5+5;#define ll long long
#define ull unsigned long long
#define pii pair<int,int>
#define fi first
#define se secondint n,m,B,cnt,N,ctt;
int M[maxn],a[maxn],ressum[maxn],mdf[maxn];ll ans[maxn],sum[maxn];pii qry[maxn];inline int read()
{char c=getchar();int fx=1,sum=0;while(c!='-'&&(c<'0'||c>'9')) c=getchar();if(c=='-') c=getchar(),fx=-1;while('0'<=c&&c<='9') sum=(sum<<1)+(sum<<3)+c-'0',c=getchar();return sum*fx;
}struct fknode1{int l,r;}fk[maxB];
class treearray
{private:#define lowbit(x) (x&(-x))public:int ts[500005];ull b[500005];inline void updata(int i,int y){mdf[++ctt]=i;b[i>>6]|=1ull<<(i&63),i>>=6,i++;while(i<=N) ++ts[i],i+=lowbit(i);}inline void clr(int i){b[i>>=6]=0,i++;while(i<=N&&ts[i]) ts[i]=0,i+=lowbit(i);}inline int getsum(int i){int res=__builtin_popcountll(b[i>>6]&(((i&63)==63?0:(1ull<<((i&63)+1)))-1));i>>=6;while(i) res+=ts[i],i-=lowbit(i);return res;}
}Ts;inline ll add(int l,int r){ll sum=0;for(int i=l;i<=r;i++) sum+=Ts.getsum(a[i]-1);return sum;}
inline void upd(int l,int r){for(int i=l;i<=r;i++) Ts.updata(a[i],1);}
inline void clr()
{if(ctt<=1200) for(int i=1;i<=ctt;i++) Ts.clr(mdf[i]);else for(int i=0;i<=N;i++) Ts.b[i]=0,Ts.ts[i]=0;ctt=0;
}int main()
{n=read(),m=read();N=(n>>6)+1;B=350;for(int i=1;i<=(n-1)/B+1;i++){fk[i].l=fk[i-1].r+1,fk[i].r=min(fk[i].l+B-1,n);}for(int i=1;i<=n;i++) a[i]=read();for(int i=1;i<=m;i++){int t=read();M[i]=cnt+1;for(int j=0,l,r;j<t;j++){l=read(),r=read(),qry[++cnt]=make_pair(l,r);int numl=(l-1)/B+1,numr=(r-1)/B+1;if(numl==numr) {if(r<fk[numl].r||l>fk[numl].l) ans[i]+=add(l,r),upd(l,r);}else{if(l>fk[numl].l) ans[i]+=add(l,fk[numl].r);if(r<fk[numr].r) ans[i]+=add(fk[numr].l,r);if(l>fk[numl].l) upd(l,fk[numl].r);if(r<fk[numr].r) upd(fk[numr].l,r);}}clr();}M[m+1]=cnt+1;for(int i=1;i<=(n-1)/B+1;i++){for(int j=fk[i].l;j<=fk[i].r;j++) ressum[a[j]]++;for(int j=1;j<=n;j++) ressum[j]+=ressum[j-1];int det=fk[i].r-fk[i].l+1;for(int j=1;j<fk[i].l;j++) sum[j]=sum[j-1]+(det-ressum[a[j]]);for(int j=fk[i].l;j<=fk[i].r;j++) sum[j]=sum[j-1];for(int j=fk[i].r+1;j<=n;j++) sum[j]=sum[j-1]+ressum[a[j]-1];for(int j=1;j<=n;j++) ressum[j]=0;for(int j=1;j<=m;j++){int flg=0;ll res=0;for(int k=M[j];k<M[j+1];k++){pii v=qry[k];if(v.fi<=fk[i].l&&fk[i].r<=v.se) {flg=1;continue;}if(v.se<=fk[i].l) res+=sum[v.se]-sum[v.fi-1];else{int l=v.fi,r=v.se,numl=(l-1)/B+1,numr=(r-1)/B+1;if(numl==numr) {if(r<fk[numl].r||l>fk[numl].l) res+=sum[r]-sum[l-1];}else{if(l>fk[numl].l) res+=sum[fk[numl].r]-sum[l-1];if(r<fk[numr].r) res+=sum[r]-sum[fk[numr].l-1];}}}ans[j]+=res*flg;}}for(int i=1;i<=m;i++) printf("%lld\n",ans[i]);
}

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

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

相关文章

2024秋季学期 光学期末复习笔记

累了,懒得写文案了参考资料 [1] 赵凯华, 钟锡华. 光学(重排本)[M]. 北京大学出版社, 2017.10. [2] 崔宏滨, 李永平, 康学亮. 光学(第二版)[M]. 科学出版社, 2015.7. [3] 王安廷. 光学课程PPT[Z]. 中国科学技术大学, 2024. 干涉衍射偏振

Python 基础知识 之 选择(分支)结构 + 模式匹配结构(match)

选择结构按照条件选择执行不同的代码段1. 单分支结构if语法结构执行流程:如果表达式的值为True,就执行语句块,如果表达式的值为False,就跳过语句块,继续执行下面的语句 ⭐注意: ⭐⭐⭐表达式后面的冒号; 缩进,python中通过缩进来控制程序逻辑示例;# 1. 判断是否中奖 n…

中考英语优秀范文-热点话题-传统文化-003 Chinese Tea 中国茶

1 写作要求 第三次法国国际友好交流学校线上论坛拟于下周五举行。本期论坛的主题为“茶文化”,作为论坛特邀嘉宾,请你写一篇文章,向国际友好交流学校介绍中国的特色茶饮和中国茶文化。 内容包括: 1 茶的历史(中国人种茶、饮茶已有4000多年的历史)和种类(绿茶、红茶、乌龙…

Hetao P3804 Cut 题解 [ 蓝 ] [ AC 自动机 ] [ 差分 ]

AC 自动机简单题。Cut:AC 自动机简单题。思路 看见多个模式串以及求前缀,很显然能想到构建一个 AC 自动机。 那么在用 \(T\) 查询时,当前指针的深度就是该位置的最长前缀匹配长度。这个在字典树 insert 的时候就能求出来。 求出每一位的最长前缀后,因为这些部分都不能作为分…

Lec 14 文件系统与设备

Lec 14 文件系统与设备License 本内容版权归上海交通大学并行与分布式系统研究所所有 使用者可以将全部或部分本内容免费用于非商业用途 使用者在使用全部或部分本内容时请注明来源 资料来自上海交通大学并行与分布式系统研究所+材料名字 对于不遵守此声明或者其他违法使用本内…

Java基础学习(七)

Java基础学习(七):异常机制 目录Java基础学习(七):异常机制概念简单分类异常体系结构异常处理机制自定义异常 本文为个人学习记录,内容学习自 狂神说Java概念异常指程序运行中出现的不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等 异常发生在程序运行期…

24. 基于项的控件

一、基于项的控件PySide6 有专门的显示数据的控件和存储数据的模型,可以显示和存储不同形式的数据。显示数据的控件分为两类,一类是基于 项(item)的控件,另一类是基于 模型(model)的控件,基于项的控件是基于模型的控件的简便类。基于项的控件把读取到的数据存储到项中,…

杂题选记

杂题选记在网上天天划水刷面经,见到 teaser 就记下来。我的想法是,把 8L 倒入 3L,把 3L 倒入 5L,把 8L 倒入 3L,把 3L 倒入 5L,这时候三个瓶子分别有 1L(8L) 2L(3L) 5L(5L) 括号里面表示瓶子最开始的容量。这时候把 1L 水倒掉,把容积为 8L 的瓶子里面的 2L 水倒到 容积为…

pytorch算子调用过程:以rand算子为例

通过pytorch的torch.profiler带调用栈采集运行过程可以看到如下信息,通过chrome://tracing查看,图上每个小条条表示一个traceEvent, json中的信息如下图所示,其中cat表示traceEvent的类型,有cpu_op,python_function等,前者表示torch的cpp代码中定义的操作,后者表示pytorc…

Wordpress更换域名后,网站显示框架和加载问题解决

最近建立了一个站点,由于先使用ip进行网站搭建,经过一段时间备案完成后,需要转成域名。直接在Wordpress后台操作后,直接导致网页框架显示异常,排版错乱,大概就是主题的框架无法加载导致的。 搞了很久,包括恢复数据库和重新建站都是这样,最终发现是伪静态的问题。 我是使…

【Weblogic T3协议】反序列化漏洞分析(上)

免责声明 此文章中所涉及的技术、思路和工具仅供网络安全学习为目的,不得以盈利为目的或非法利用,否则后果自行承担!一、前言 在初入安全的时候,就听说过weblogic的大名,当然听说的并不是weblogic如何如何好用,而是因为其漏洞出现频率实在是有点高...于是乎,便抱着学习的…

关于安卓edge无法播放Wordpress上传的mp4视频问题

使用默认插件上传后,电脑端可以播放视频,其他手机浏览器均可播放视频,但是安卓edge无法加载视频。 大概是如下图样子:经查发现电脑打开页面会显示站点部分不安全的提示,说明edge端做了一些阻挡处理,导致视频无法播放。找了一些资料后,发现可以自行修改加载视频的代码框架…