白白的(baibaide)

白白的(baibaide)

有一个长度为 $n$ 的序列 $a_1, a_2, \dots, a_n$,一开始每个位置都是白色。如果一个区间中每个位置都是白色,则称这是一个白白的区间。如果一个白白的区间向左或向右延长后都不是白白的区间了,则称这是一个极长的白白的区间。有 $q$ 次操作,每次操作会修改某个位置的值,或者把某个位置变成黑色。每次操作后,求所有极长的白白的区间中含有的逆序对数的异或和。强制在线。

$n ≤ 150000,q ≤ 20000,0 ≤ a_i ≤ 10^9,1 ≤ x ≤ n,0 ≤ y ≤ 10^9$

$Subtask1(10pts) : n ≤ 10^3, q ≤ 10^3$
$Subtask2(20pts) : 只有 0 操作$
$Subtask3(30pts) : 只有 1 操作$
$Subtask4(40pts) : 没有特殊限制$


Solution

毒题

有种高级的东西叫做启发式分裂,可以应用于只分裂不合并的题目。

每次扫描较小的那一段,复杂度似乎是nlogn的。

那我们考虑每次枚举小的那一段区间的每个数x,然后在大的区间中查找比x大(小)的数的个数,也就是x对于大区间的逆序对贡献。

大区间的答案等于原来区间的答案减去每次查出的答案,小的重新算。

统计小于?主席树就行。修改?树套树。

然而这题没完...

我们算下复杂度:分裂$nlogn$ ,树套树 $nlog^2n$ ,修改 $qlog^2n$

总复杂度 $ nlog^3n + qlog^2n $

n=150000 炸了

我们考虑优化前面的那个^3

按权值为比较大小的关键字建splay

一棵splay维护一段区间,分裂时查询某一段比x大的有几个。

分裂完小的区间暴力重建splay,总共可以有多棵splay

这样前面就是$nlog^2n$了

树套树似乎不用了?然而splay在单点修改时不能维护答案,于是还要。

总复杂度 $ nlog^2n + qlog^2n $

颠覆我对数据结构的认知

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<cstdlib>
  4 #include<cstring>
  5 #include<algorithm>
  6 #include<cmath>
  7 #include<set>
  8 #define ll long long
  9 #define maxn 150005
 10 #define Max 1000000000
 11 using namespace std;
 12 int n,q,a[maxn],rt[maxn],tot,cnt,root[maxn];
 13 ll Ans,ans[maxn];
 14 struct no{
 15     int ls,rs,v;
 16 }tr[maxn*400];
 17 set<int>dd;
 18 void wh(int k){
 19     tr[k].v=tr[tr[k].ls].v+tr[tr[k].rs].v;
 20 }
 21 void add(int &k,int l,int r,int pl,int v){
 22     if(!k)k=++cnt;
 23     if(l==r){
 24         tr[k].v+=v;
 25         return;
 26     }
 27     int mid=l+r>>1;
 28     if(pl<=mid)add(tr[k].ls,l,mid,pl,v);
 29     else add(tr[k].rs,mid+1,r,pl,v);
 30     wh(k);
 31 }
 32 ll t_ask(int k,int l,int r,int v,int fl){
 33     if(!k)return 0;
 34     ll sl=0,sr=0;
 35     if(l==r){
 36         return tr[k].v;
 37     }
 38     int mid=l+r>>1;
 39     if(fl==1){//>v
 40         if(v<=mid)return tr[tr[k].rs].v+t_ask(tr[k].ls,l,mid,v,fl);
 41         else return t_ask(tr[k].rs,mid+1,r,v,fl);
 42     }
 43     else{
 44         if(v<=mid)return t_ask(tr[k].ls,l,mid,v,fl);
 45         else return tr[tr[k].ls].v+t_ask(tr[k].rs,mid+1,r,v,fl);
 46     }
 47 }
 48 ll ask(int l,int r,int v,int fl){
 49     if(l>r)return 0;
 50     ll sl=0,sr=0;
 51     if(fl)v++;else v--;
 52     if(l-1>0)for(int i=l-1;i;i-=i&-i)sl+=t_ask(root[i],0,Max,v,fl);
 53     for(int i=r;i;i-=i&-i)sr+=t_ask(root[i],0,Max,v,fl);
 54     return sr-sl;
 55 }
 56 ll query(int l,int r,int x){
 57     ll n1=0,n2=0;
 58     n1=ask(l,x-1,a[x],1);n2=ask(x+1,r,a[x],0);
 59     return n1+n2;
 60 }
 61 struct Splay{
 62     int ch[2],f,v,num,sz;
 63 }t[maxn*50];
 64 void upd(int x){
 65     int ls=t[x].ch[0],rs=t[x].ch[1];
 66     t[x].sz=t[ls].sz+t[rs].sz+t[x].num;
 67 }
 68 int get(int x){return t[t[x].f].ch[1]==x;}
 69 void rotate(int x){
 70     int y=t[x].f,z=t[y].f;
 71     int wx=get(x),wy=get(y);
 72     t[z].ch[wy]=x;t[x].f=z;
 73     t[y].ch[wx]=t[x].ch[wx^1];t[t[x].ch[wx^1]].f=y;
 74     t[x].ch[wx^1]=y;t[y].f=x;
 75     upd(y);upd(x);
 76 }
 77 void splay(int x,int g){
 78     while(t[x].f!=g){
 79         int y=t[x].f,z=t[y].f;
 80         if(z!=g)rotate(get(x)==get(y)?y:x);
 81         rotate(x);
 82     }
 83 }
 84 void modify(int &R,int k,int x,int Num){
 85     int fa=0;
 86     while(k&&t[k].v!=x){
 87         fa=k,k=t[k].ch[x>t[k].v];
 88     }
 89     if(k)t[k].num+=Num;
 90     else {
 91         k=++tot;
 92         if(fa)t[fa].ch[x>t[fa].v]=k;
 93         t[k].v=x;t[k].num=t[k].sz=1;t[k].f=fa;
 94     }
 95     splay(k,0);R=k;
 96 }
 97 ll ask_min(int k,int v){
 98     ll sum=0;
 99     while(k){
100         if(t[k].v<v)sum+=t[t[k].ch[0]].sz+t[k].num,k=t[k].ch[1];
101         else if(t[k].v==v){
102             sum+=t[t[k].ch[0]].sz;
103             break;
104         }    
105         else k=t[k].ch[0];
106     }
107     return sum;
108 }
109 ll ask_max(int k,int v){//>
110     ll sum=0;
111     while(k){
112         if(t[k].v<v)k=t[k].ch[1];
113         else if(t[k].v==v){
114             sum+=t[t[k].ch[1]].sz;
115             break;
116         }    
117         else sum+=t[t[k].ch[1]].sz+t[k].num,k=t[k].ch[0];
118     }
119     return sum;
120 }
121 int main()
122 {
123     cin>>n>>q;dd.insert(1);dd.insert(n+1);
124     for(int i=1;i<=n;i++){
125         scanf("%d",&a[i]);
126         modify(rt[1],rt[1],a[i],1);
127     }
128     for(int i=1;i<=n;i++)
129     for(int j=i;j<=n;j+=j&-j){
130         add(root[j],0,Max,a[i],1);
131     }
132     for(int i=1;i<=n;i++)ans[1]+=query(1,n,i);
133     ans[1]/=2;Ans=ans[1];ll la=0;
134     for(int i=1,op;i<=q;i++){
135         scanf("%d",&op);
136         ll x,y;
137         if(op==0){
138             scanf("%lld%lld",&x,&y);x^=la;y^=la;
139             set<int>::iterator it;
140             it=dd.upper_bound(x);
141             int r=*it-1;it--;int l=*it;
142             Ans^=ans[l];
143             ll num=query(l,r,x);
144             modify(rt[l],rt[l],a[x],-1);
145             ans[l]-=num;
146             for(int j=x;j<=n;j+=j&-j)add(root[j],0,Max,a[x],-1);
147             a[x]=y;
148             modify(rt[l],rt[l],a[x],1);
149             for(int j=x;j<=n;j+=j&-j)add(root[j],0,Max,a[x],1);
150             num=query(l,r,x);
151             ans[l]+=num;Ans^=ans[l];
152             printf("%lld\n",Ans);la=Ans;
153         }
154         else {
155             scanf("%lld",&x);x^=la;
156             set<int>::iterator it;
157             it=dd.upper_bound(x);
158             int r=*it-1;it--;int l=*it;
159             Ans^=ans[l];ll co=0;
160             if(x==l){
161                 co=ask_min(rt[l],a[l]);
162                 modify(rt[l],rt[l],a[l],-1);
163                 ans[l+1]=ans[l]-co;ans[l]=0;
164                 rt[l+1]=rt[l];rt[l]=0;
165                 Ans^=ans[l+1];
166                 dd.insert(l+1);
167             }
168             else if(x==r){
169                 co=ask_max(rt[l],a[r]);
170                 modify(rt[l],rt[l],a[r],-1);
171                 ans[l]-=co;Ans^=ans[l];
172                 dd.insert(r);
173             }
174             else {
175                 if(x-l<r-x){
176                     for(int i=l;i<=x;i++){
177                         co+=ask_min(rt[l],a[i]);
178                         modify(rt[l],rt[l],a[i],-1);
179                     }
180                     ans[x+1]=ans[l]-co;
181                     rt[x+1]=rt[l];rt[l]=0;ans[l]=0;
182                     for(int i=l;i<x;i++){
183                         modify(rt[l],rt[l],a[i],1);
184                         ans[l]+=ask_max(rt[l],a[i]);
185                     }
186                     Ans=(Ans^ans[l]^ans[x+1]);
187                 }
188                 else {
189                     for(int i=r;i>=x;i--){
190                         co+=ask_max(rt[l],a[i]);
191                         modify(rt[l],rt[l],a[i],-1);
192                     }
193                     ans[l]-=co;
194                     for(int i=x+1;i<=r;i++){
195                         modify(rt[x+1],rt[x+1],a[i],1);
196                         ans[x+1]+=ask_max(rt[x+1],a[i]);
197                     }
198                     Ans=(Ans^ans[l]^ans[x+1]);
199                 }
200                 dd.insert(x);dd.insert(x+1);
201             }
202             printf("%lld\n",Ans);la=Ans;
203         }
204     }
205     return 0;
206 }
View Code

 

转载于:https://www.cnblogs.com/liankewei/p/10657581.html

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

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

相关文章

使用Adaptive cards来构建Teams app的界面

Teams app的task module十分好用&#xff0c;当用户点击了一个卡片上的按钮是可以在Teams里弹出一个对话框&#xff0c;对话框的内容可以是开发人员自己的一个网页页面&#xff0c;或者是adaptive card。 在我的LuckyDraw bot里&#xff0c;我比较了这两种的优势和劣势&#xf…

Boosting(提升方法)之GBDT

一、GBDT的通俗理解 提升方法采用的是加法模型和前向分步算法来解决分类和回归问题&#xff0c;而以决策树作为基函数的提升方法称为提升树&#xff08;boosting tree&#xff09;。GBDT(Gradient Boosting Decision Tree)就是提升树算法的一种&#xff0c;它使用的基学习器是C…

CC攻击原理及防范方法

一、 CC攻击的原理&#xff1a; CC攻击的原理就是攻击者控制某些主机不停地发大量数据包给对方服务器造成服务器资源耗尽&#xff0c;一直到宕机崩溃。CC主要是用来消耗服务器资源的&#xff0c;每个人都有这样的体验&#xff1a;当一个网页访问的人数特别多的时候&#xff0c…

分享到Teams

在今年三月份末&#xff0c;Teams的官方文档推出了一个新功能&#xff1a;将网页&#xff08;一个URL&#xff09;分享到Teams里。 也就是说开发人员现在可以很方便的开发一个页面&#xff0c;页面里有一个Teams的图标&#xff0c;当访问此页面的最终用户点击这个图标后可以将…

MySQL命令行查询乱码解决方法

转自Agoly的博客&#xff0c;原文链接https://www.cnblogs.com/qmfsun/p/4846467.html 感谢博主Agoly这篇文章说的很详细很透彻。 MySQL会出现中文乱码的原因不外乎下列几点&#xff1a;1.server本身设定问题&#xff0c;例如还停留在latin1 2.table的语系设定问题(包含charact…

『流畅的Python』第1~4章笔记_数据结构、编码

由于1~4章内容零散且基础&#xff0c;所以统计一下涉及到的内容&#xff0c;记录一下&#xff0c;方便查阅&#xff08;第一张图右键新页面打开即可看到清晰大图&#xff09;

docker 安装ELK

参考文档&#xff1a; Docker ELK使用文档&#xff1a;http://elk-docker.readthedocs.io/ 1.拉取镜像 查看 Docker Hub 的镜像 docker search elk 拉取镜像 sudo docker pull sebp/elk 2.启动容器 docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -p 4560:4560 -it --na…

在Teams Hackathon上介绍LuckyDraw

很荣幸有机会在今天的Teams Hackathon上介绍LuckyDraw这个teams app。 因为到场的都是各路开发高手&#xff0c;所以当时在准备这个ppt的时候特别增加了难度等级&#xff0c;哈哈。 从如何构建云原生的Teams app&#xff0c;到IaC&#xff0c;重点讲了如何开发一个面向全球用户…

Word 2010 制作文档结构之图标自动编号设置

注意&#xff1a; 使用图片自动编号时&#xff0c;如果文档标题使用的样式是通过“将所选内容保存为新快速样式”所生成的样式&#xff0c;则图片自动编号不会生效 因此设置标题样式时&#xff0c;不要 新建样式&#xff0c;直接使用word预设的“标题 1”样式和“标题 2”样式即…

在Teams中对网站的URL特殊解析

Teams中有一个不太被大家注意的扩展点&#xff0c;名字叫Link unfurling&#xff0c;就是对于一些特殊域名的URL进行特别的解释。 可能这么说&#xff0c;大家还是无法理解&#xff0c;我们看一下下面这个图&#xff0c;当用户在message输入框中输入了一窜url后&#xff0c;Te…

Wireshark 在Windows下的安装

1、wireshark官网地址&#xff1a;https&#xff1a;//www.wireshark.ort/ 下载抓包驱动&#xff1a;windows使用winpcap&#xff0c;Linux使用libcap2、安装下载好的wireshark程序包&#xff1a;3、安装winpcap插件&#xff1a;4、安装USBPcap插件&#xff1a;5、安装完成&…

OSChina 周三乱弹 —— 爸爸说,这个是从他硬盘里掉出来的

2019独角兽企业重金招聘Python工程师标准>>> Osc乱弹歌单&#xff08;2018&#xff09;请戳&#xff08;这里&#xff09; 【今日歌曲】 焕焕 &#xff1a;分享郑秀文的单曲《唉声叹气》 《唉声叹气》 手机党少年们想听歌&#xff0c;请使劲儿戳&#xff08;这里&am…

LuckyDraw app被评为Microsoft365 App Award

今天查了一下LuckyDraw app&#xff0c;突然发现我上半年开发的Teams app: LuckyDraw&#xff0c;竟然多了一个勋章图标&#xff0c;点进去一看是微软给我的app评了一个”Microsoft 365 App Award”。Super surprise!!&#x1f60d;&#x1f60d;&#x1f60d; 看来我必须要抓…

Teams架构剖析(2019年版本)

在上个月刚刚结束的Ignite大会上&#xff0c;Teams产品的架构师Bill Bliss给大家奉上了最新的Teams的架构设计&#xff0c;之前2017年和2018年微软的技术大会上都Teams架构的分享&#xff0c;但是今年大神把Teams架构讲得很深入&#xff0c;覆盖面很广。我这里就挑一些&#xf…

pycharm工具下代码下面显示波浪线的去处方法

近期安装了python后&#xff0c;发现使用pycharm工具打开代码后发现代码下边会有波浪线的显示&#xff1b;但是该代码语句确实没有错误&#xff0c;通过查询发现了两种方法去掉该波纹的显示&#xff0c;下面就具体说明一下&#xff1a; 方法一&#xff1a; 打开pycharm在右下方…

js面向对象与PHP面向对象总结

js面向对象&#xff1a; 1.什么是对象&#xff1f; 对象&#xff1a;任何实体都是对象&#xff0c;拥有属性和方法两大特征 属性&#xff1a;描述事物的特点&#xff1b; 方法&#xff1a;实物拥有的行为&#xff1b; 2.在JS里 Person.name"zhang" Person.fnfunction…

Dubbo原理与框架设计

Dubbo是常用的开源服务治理型RPC框架&#xff0c;在之前osgi框架下不同bundle之间的方法调用时用到过。其工作原理和框架设计值得开源技术爱好者学习和研究。 一、Dubbo的工作原理 调用关系说明 服务容器负责启动&#xff0c;加载&#xff0c;运行服务提供者。服务提供者在启动…

面向全球用户的Teams app之Culture计量单位和禁忌篇

我在前一篇文章里分享了Global Ready的app时会遇到的不同文化对于数字方面的挑战。这篇我继续分享不同文化对于计量单位和禁忌方面的挑战。 我们先来看一个例子&#xff0c;假如有一个teams bot&#xff0c;它告诉你一些动物的速度&#xff0c;比如它告诉你&#xff1a; 猎豹能…

【我的Android进阶之旅】Android自定义Lint实践

背景 2017年8月份的时候&#xff0c;我在公司开始推广Lint、FindBugs等静态代码检测工具。然后发现系统自带的Lint检测的Issue不满足我们团队内部的特定需求&#xff0c;因此去自定义了部分Lint规则。这个检测运行了大半年&#xff0c;运行良好&#xff0c;团队的代码规范也有了…

存储结构与索引

一、SQL数据存储的基本介绍 数据库中的数据存储涉及页&#xff08;Page&#xff09;和区&#xff08;Extent)这两个概念了。SQL server中数据存储的基本单位是页。为数据库中的数据文件&#xff08;.mdf或.ndf&#xff09;分配的磁盘空间可以从逻辑上划分成页&#xff08;从0到…