Description

Input

Output

Sample Input

4 3
6 0 10 1
1 2
1 0
1 2

Sample Output

1
1
0

Data Constraint

Solution

  • 先一遍归并排序算出初始答案。

  • 对于 0 操作,我们需要计算改变的那一位对答案的贡献。

  • 这个就是单点修改+区间查询比 x 大的数的个数,树状数组套权值线段树即可(动态开点)。

  • 对于 1 操作,我们要分裂区间,可以考虑启发式合并,扫短的那边算贡献。

  • 但如果用前面的树套树来算,这部分复杂度将达到 O(Qlog3n)O(Q\ log^3n)O(Q log3n) ,不能接受。

  • 我们发现由于查询时查询的区间(长的那边)是固定的,这是一个突破口。

  • 再开一个一维的权值线段树来维护就可以了!

  • 每次分裂区间时将短的那边多开成一个线段树(最多 Q 个)即可。

  • 这样计算复杂度就是 O(Qlog2n)O(Q\ log^2n)O(Q log2n) 了。

  • 总时间复杂度 O((N+Q)log2n)O((N+Q)\ log^2n)O((N+Q) log2n) ,空间复杂度 O(Nlog2n)O(N\ log^2n)O(N log2n) 。

Code

#include<cstdio>
#include<set>
#include<cctype>
using namespace std;
typedef long long LL;
const int N=150005,inf=1e9+1;
struct data
{int s,l,r;
}f[N*30*17];
int n,q,tot,qx,qy,num;
LL ans,cnt;
int a[N],b[N],c[N];
int rt[N],rt1[N],bel[N];
LL val[N];
set<int>ss;
set<int>::iterator it;
inline int read()
{int X=0,w=0; char ch=0;while(!isdigit(ch)) w|=ch=='-',ch=getchar();while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
void solve(int l,int r)
{if(l>=r) return;int mid=l+r>>1;solve(l,mid);solve(mid+1,r);int j=l,k=mid+1,s=l-1;while(j<=mid && k<=r)if(b[k]<b[j]){c[++s]=b[k++];cnt+=mid-j+1;}else c[++s]=b[j++];while(j<=mid) c[++s]=b[j++];while(k<=r) c[++s]=b[k++];for(int i=l;i<=r;i++) b[i]=c[i];
}
void change(int &v,int l,int r)
{if(!v) v=++tot;f[v].s+=qy;if(l==r) return;int mid=l+r>>1;if(qx<=mid) change(f[v].l,l,mid); else change(f[v].r,mid+1,r);
}
int find(int v,int l,int r)
{if(!v) return 0;if(qx<=l && r<=qy) return f[v].s;int mid=l+r>>1,s=0;if(qx<=mid) s=find(f[v].l,l,mid);if(qy>mid) s+=find(f[v].r,mid+1,r);return s;
}
inline void add(int x,int y)
{qx=y,qy=1;while(x<=n){change(rt[x],0,inf);x+=x&-x;}
}
inline void del(int x,int y)
{qx=y,qy=-1;while(x<=n){change(rt[x],0,inf);x+=x&-x;}
}
inline LL get(int x,int y,int z)
{LL s=0;if(y>z) return 0;qx=y,qy=z;while(x){s+=find(rt[x],0,inf);x-=x&-x;}return s;
}
int main()
{freopen("baibaide.in","r",stdin);freopen("baibaide.out","w",stdout);n=read(),q=read();for(int i=1;i<=n;i++) a[i]=b[i]=read();solve(1,n);ss.insert(0);ss.insert(n+1);for(int i=1;i<=n;i++) add(i,a[i]);val[num=1]=ans=cnt;for(int i=1;i<=n;i++){bel[i]=num;qx=a[i],qy=1;change(rt1[num],0,inf);}for(int j=1;j<=q;j++){int op=read(),x=read();if(j>1) x^=ans;it=ss.upper_bound(x);int r=*it,l=*--it;l++,r--;if(!op){int y=read();if(j>1) y^=ans;ans^=val[bel[l]];LL sum=get(x-1,a[x]+1,inf)-get(l-1,a[x]+1,inf);sum+=get(r,0,a[x]-1)-get(x,0,a[x]-1);val[bel[l]]-=sum;del(x,a[x]);qx=a[x],qy=-1;change(rt1[bel[l]],0,inf);a[x]=y;add(x,y);qx=y,qy=1;change(rt1[bel[l]],0,inf);sum=get(x-1,y+1,inf)-get(l-1,y+1,inf);sum+=get(r,0,y-1)-get(x,0,y-1);val[bel[l]]+=sum;ans^=val[bel[l]];}else{ss.insert(x);if(x-l<r-x){int pos=bel[r];for(int i=l;i<=x;i++){qx=a[i],qy=-1;change(rt1[pos],0,inf);}ans^=val[pos];for(int i=l;i<=x;i++){qx=0,qy=a[i]-1;val[pos]-=find(rt1[pos],0,inf);}if(l<x){num++;for(int i=l;i<x;i++) bel[i]=num;for(int i=l;i<x;i++){qx=a[i],qy=1;change(rt1[num],0,inf);}int len=cnt=0;for(int i=l;i<x;i++) b[++len]=a[i];solve(1,len);val[num]=cnt;ans^=cnt;qx=a[x]+1,qy=inf;cnt+=find(rt1[num],0,inf);val[pos]-=cnt;}ans^=val[pos];}else{int pos=bel[l];for(int i=x;i<=r;i++){qx=a[i],qy=-1;change(rt1[pos],0,inf);}ans^=val[pos];for(int i=x;i<=r;i++){qx=a[i]+1,qy=inf;val[pos]-=find(rt1[pos],0,inf);}if(x<r){num++;for(int i=x+1;i<=r;i++) bel[i]=num;for(int i=x+1;i<=r;i++){qx=a[i],qy=1;change(rt1[num],0,inf);}int len=cnt=0;for(int i=x+1;i<=r;i++) b[++len]=a[i];solve(1,len);val[num]=cnt;ans^=cnt;qx=0,qy=a[x]-1;cnt+=find(rt1[num],0,inf);val[pos]-=cnt;}ans^=val[pos];}}printf("%lld\n",ans);}return 0;
}

JZOJ 6030. 【GDOI2019模拟2019.2.25】白白的相关推荐

  1. [jzoj 6093] [GDOI2019模拟2019.3.30] 星辰大海 解题报告 (半平面交)

    题目链接: https://jzoj.net/senior/#contest/show/2686/2 题目: 题解: 说实话这题调试差不多花了我十小时,不过总算借着这道题大概了解了计算几何的基础知识 ...

  2. 【JZOJ 6079】【GDOI2019模拟2019.3.23】染色问题

    Description m≤n+5,k,n≤105m\leq n+5,k,n\leq10^5m≤n+5,k,n≤105 Solution 1 这个图只有5条返祖边所以才能做, 先把所有有返祖边的点拿出 ...

  3. [JZOJ6075]【GDOI2019模拟2019.3.20】桥【DP】【线段树】

    Description N,M<=100000,S,T<=1e9 Solution 首先可以感受一下,我们把街道看成一行,那么只有给出的2n个点的纵坐标是有用的,于是我们可以将坐标离散化至 ...

  4. [JZOJ6093]【GDOI2019模拟2019.3.30】星辰大海【计算几何】【半平面交】

    Description 给出平面上n个点,其中1号点是可以移动的,但是移动的范围不能改变任意三个点所成的角的状态([0,π),[π,π],(π,2π][0,\pi),[\pi,\pi],(\pi,2\ ...

  5. gmoj 6087. 【GDOI2019模拟2019.3.26】获取名额 题解

    题目 https://gmoj.net/senior/#main/show/6087 题解 发现 ans=1−∏i=lr(1−aix)ans=1-\prod_{i=l}^r \left(1-\frac ...

  6. 2019年25大人工智能趋势!一文看到未来

    来源:智东西 摘要:2019年25个AI趋势. 人工智能的下一步是什么?上周,知名机构CBinsights的分析师分析各个行业,得到了2019年最值得关注的25个人工智能趋势.虽然人工智能正在各个行业 ...

  7. 7-1 模拟EXCEL排序 (25 分)

    7-1 模拟EXCEL排序 (25 分) Excel可以对一组纪录按任意指定列排序.现请编写程序实现类似功能. 输入格式: 输入的第一行包含两个正整数N(≤10 ​5 ​​ ) 和C,其中N是纪录的条 ...

  8. 训练日志 2019.1.25

    昨天晚上熬夜看球...今天早上效率成功的低了不少...就补了一道题.. 下午打比赛都是之前的题,出的太少,效率不够高,有两道题思路很明确,但卡细节卡到死,long long 和 Runtime 以及把 ...

  9. R7-9 模拟EXCEL排序 (25 分)

    R7-9 模拟EXCEL排序 (25 分) Excel可以对一组纪录按任意指定列排序.现请编写程序实现类似功能. 输入格式: 输入的第一行包含两个正整数N(≤105) 和C,其中N是纪录的条数,C是指 ...

最新文章

  1. SLAM、3D vision求职经历
  2. sshpass连接主机以及执行命令
  3. Spring的Hello, world,还有拿来主义
  4. boost::fusion::zip用法的测试程序
  5. BugkuCTF-WEB题file_get_contents
  6. oracle 11g 环境,Linux彻底清理Oracle 11g RAC环境方案
  7. 加载elementor时出现问题_element ui 按需引入出现问题
  8. Mac新手使用技巧,键盘键位分布和快捷键
  9. JetBrains:修改C盘中的JetBrains家族软件如PyCharm、WebStorm等的缓存文件位置
  10. 程序员做饭指南,GitHub教程来了
  11. MTK-QCOM-SPRD 刷机
  12. Java proxy 代理
  13. 热核特征(heat kernel signature,HKS)简单解释(附可运行代码)
  14. 桌面远程控制计算机名字和,Win7系统远程控制其他计算机桌面教程
  15. 苏轼:醉笑陪君三万场 不诉离殇
  16. 【EndNote】-详细步骤-导入网页/电子文献及外网(IEEE)文献
  17. 环宇智行基于NVIDIA TX2的L4级自动驾驶方案
  18. wince博客名人堂
  19. Python数据分析入门与实践
  20. plm服务器 硬件性能,如何对PLM系统进行性能诊断与调优?

热门文章

  1. 向Window窗体发送消息,控制程序的运行.
  2. 深度之眼课程打卡-统计学习方法01
  3. 二十万字C/C++、嵌入式软开面试题全集宝典九
  4. 【Python】append和extend的区别
  5. [云炬创业基础笔记]第二章创业者测试23
  6. ustc小道消息20211213
  7. [云炬mysql数据库笔记] Work2
  8. 云炬随笔20210803
  9. 学长毕业日记 :本科毕业论文写成博士论文的神操作20170401
  10. [我的1024开源程序]200元仿豆瓣小程序带评论