(其实是启发式分裂?大雾
题目大意:n名同学要进行一次方队展示。方队展示的全过程如下:初始时,所有同学站成一横行,从左到右第i名同学编号为i,身高为ai。然后,所有同学按照一定的顺序依次出队,第i名出队的同学编号为bi。每名同学出队后,原先该同学所在的这一行会进行“变队形”操作:原先在该同学左侧的同学位置不动,在右侧的同学整体移动到队伍最后方组成新的一行,并保持他们的相对位置不变,其效果是原先的这一行分裂成了两行(注意这两行均有可能为空)。变队形前后所有同学的编号和身高不变。在同学们看来,从左往右身高依次递增的队形是最美观的。因此他们定义某一行的“不美观度”如下:设这一行有k名同学,第i名同学的身高为qi,则其“不美观度”为有序数对(i,j)的数量,满足1<=i<j<=k且qi>qj。特别地,若k=0或k=1,则这一行的“不美观度”为0。现在,你需要帮助同学们求出:每名同学出队之前,方队中“不美观度”最大的一行的“不美观度”是多少。
题解:每次分裂的时候暴力扫描小的一边更新答案,通过加入主席树区间询问若当前节点和为0则return掉、维护ans的堆的时候0不要push进去、如果当前答案是0那么之后答案也是0、求区间左右端点不要lowerbound两次而是先求一次然后it++、最后一个优化时求区间逆序对的时候如果区间比较小就采取暴力(因为常数小),这样就能足够快了。

// luogu-judger-enable-o2
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<set>
#include<utility>
#define gc getchar()
#define lint long long
#define mp make_pair
#define fir first
#define sec second
#define inf (LLONG_MIN/100)
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define N 100010
#define debug(x) cerr<<#x<<"="<<x
#define sp <<" "
#define ln <<endl
using namespace std;
typedef pair<int,lint> pili;
typedef set<pili> spili;
typedef spili::iterator spilit;
inline int inn()
{int x,ch;while((ch=gc)<'0'||ch>'9');x=ch^'0';while((ch=gc)>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^'0');return x;
}
int a[N],n;spili ps;multiset<lint> ans;
struct segment{lint s;segment *ch[2];
}*T[N];
int build(segment* &rt,int l,int r)
{rt=new segment,rt->s=0;int mid=(l+r)>>1;if(l==r) return 0;return build(rt->ch[0],l,mid),build(rt->ch[1],mid+1,r),0;
}
int update(segment* &x,segment* &y,int p,int v,int l,int r)
{x=new segment,x->ch[0]=y->ch[0],x->ch[1]=y->ch[1],x->s=y->s+v;if(l==r) return 0;int mid=(l+r)>>1;if(p<=mid) update(x->ch[0],y->ch[0],p,v,l,mid);else update(x->ch[1],y->ch[1],p,v,mid+1,r);return 0;
}
lint query(segment* &rt,int s,int t,int l,int r)
{if((s<=l&&r<=t)||!rt->s) return rt->s;int mid=(l+r)>>1;lint ans=0;if(s<=mid) ans+=query(rt->ch[0],s,t,l,mid);if(mid<t) ans+=query(rt->ch[1],s,t,mid+1,r);return ans;
}
int b1[55],b2[55];
inline lint query(int l,int r,int s,int t) { if(l>r||s>t) return 0;return query(T[r],s,t,1,n)-query(T[l-1],s,t,1,n); }
inline lint calcA(int l,int r)
{if(r-l+1<=30) { int ans=0;rep(i,l,r) rep(j,i+1,r) ans+=(a[i]>a[j]);return ans; }lint ans=0ll;rep(i,l,r) ans+=query(i+1,r,1,a[i]-1);return ans;
}
inline lint calcB1(int l,int r,int s,int t)
{if(t-s+1<=50){int ans=0;int c1=0;rep(i,l,r) b1[++c1]=a[i];sort(b1+1,b1+c1+1);int c2=0;rep(i,s,t) b2[++c2]=a[i];sort(b2+1,b2+c2+1);for(int i=1,j=0;i<=c1;i++,ans+=j)while(j<c2&&b1[i]>b2[j+1]) j++;return ans;}lint ans=0;rep(i,l,r) ans+=query(s,t,1,a[i]-1);return ans;
}
inline lint calcB2(int l,int r,int s,int t)
{if(r-l+1<=50){int ans=0;int c1=0;rep(i,l,r) b1[++c1]=a[i];sort(b1+1,b1+c1+1);int c2=0;rep(i,s,t) b2[++c2]=a[i];sort(b2+1,b2+c2+1);for(int i=1,j=0;i<=c1;i++,ans+=j)while(j<c2&&b1[i]>b2[j+1]) j++;return ans;}lint ans=0;rep(i,s,t) ans+=query(l,r,a[i]+1,n);return ans;
}
char ss[N*22],tt[20];int ssl,ttl;
inline int show(lint x)
{if(!x) ss[++ssl]='0';for(ttl=0;x;x/=10) tt[++ttl]=x%10+'0';for(;ttl;ttl--) ss[++ssl]=tt[ttl];return ss[++ssl]='\n';
}
int main()
{n=inn();lint A,B,C,las;rep(i,1,n) a[i]=inn();build(T[0],1,n);rep(i,1,n) update(T[i],T[i-1],a[i],1,1,n);A=calcA(1,n),ps.insert(mp(0,A)),ps.insert(mp(n+1,0)),ans.insert(-A);rep(i,1,n){multiset<lint>::iterator it=ans.lower_bound(inf);show(las=(it==ans.end()?0:-*it));int p=inn()^(int(las%n));if(las==0) { rep(j,i+1,n) show(0);break; }spilit pre=--ps.lower_bound(mp(p,0)),nxt=pre;nxt++;int L=pre->fir+1,R=nxt->fir-1,lsz=p-L+1,rsz=R-p;//[L,p],(p,R]if(lsz<rsz) A=calcA(L,p),B=calcB1(L,p,p+1,R),C=pre->sec-A-B;else C=calcA(p+1,R),B=calcB2(L,p,p+1,R),A=pre->sec-B-C;A-=query(L,p-1,a[p]+1,n),B-=query(p+1,R,1,a[p]-1);(pre->sec?ans.erase(ans.find(-pre->sec)),0:0),(A?ans.insert(-A),0:0),(C?ans.insert(-C),0:0),ps.erase(pre),ps.insert(mp(L-1,A)),ps.insert(mp(p,C));}return fwrite(ss+1,sizeof(char),ssl,stdout),0;
}

方队 - 启发式合并 - 主席树相关推荐

  1. 中石油训练赛 - Russian Dolls on the Christmas Tree(树上启发式合并/主席树)

    题目链接:点击查看 题目大意:给出一棵 n 个节点的树,以点 1 为根,现在对于每个节点作为根的子树求解:子树中有多少个编号不相交的连续子段,如:1 2 4 5 7,共有三个连续的段,分别为 [ 1 ...

  2. 山东理工大学第十二届ACM程序设计竞赛 - Cut the tree(树上启发式合并+线段树)

    题目链接:点击查看 题目大意:给一个具有 N 个节点的有根树,以 1 号节点为根,节点编号从 1 开始,点有点权.树的第 H 层权值为深度为 H 的所有点的点权之和.树的总权值为所有层权值的最大值.问 ...

  3. 51nod2626-未来常数【树上启发式合并,线段树】

    正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=2626 题目大意 给出nnn个点的一棵树,每个区间[l,r][l,r][l ...

  4. Codeforces 600E Lomsat gelral 树上启发式合并,线段树合并.

    文章目录 题意 题解 update:洛谷上已经可交此题. 题意 给一棵1为根的树,每个点有个颜色,求每一个点的子树里出现最多的颜色的和. 题解 我们用两组nnn个mapcnt和summap\ cnt和 ...

  5. CodeForces - 600E Lomsat gelral(树上启发式合并)

    题目链接:点击查看 题目大意:给出一棵树,每个节点都有一个编号代表一种颜色,现在对于每个子树求出现最多的颜色的编号之和 题目分析:因为n给到了1e5,看完这个题第一反应就是暴力n*n,但显然是会超时的 ...

  6. 洛谷 P3302 [SDOI2013]森林 主席树+启发式合并

    click here~:https://www.luogu.org/problem/P3302 emmm这个题是真的烦 一看题发现这题不是count on a tree的升级版么 如果一点思路没有的话 ...

  7. BZOJ 3277 串 BZOJ 3473 字符串 (广义后缀自动机、时间复杂度分析、启发式合并、线段树合并、主席树)...

    标签那么长是因为做法太多了... 题目链接: (bzoj 3277) https://www.lydsy.com/JudgeOnline/problem.php?id=3277 (bzoj 3473) ...

  8. 洛谷P7361:拜神(SA、二分、主席树、启发式合并)

    解析 很好的一道SA的题.(觉得完全可以评黑了啊qwq) 我一开始拿SAM和线段树硬做,不断修正最后发现自己无法在可接受复杂度内解决的问题,直接GG- 垃圾数据还骗到了50分 所以写一道题之前还是要先 ...

  9. P3302-[SDOI2013]森林【主席树,LCA,启发式合并】

    正题 题目链接:https://www.luogu.com.cn/problem/P3302 题目大意 nnn个点的一个森林,要求支持以下操作 连接两个不连通的点 询问两个点之间最短路径上第kkk大的 ...

最新文章

  1. 浅析Android插件化
  2. 3.1 Android组件intent filter
  3. 复合梯形公式matlab代码_MATLAB龙贝格积分算法
  4. adf时间作用域_ADF:在任务流终结器中支持bean作用域
  5. if 组件是否存在_UE4 UMG简介+Slate组件问题排查
  6. 小程序遵循的语法_我如何构建一个遵循股市针对freeCodeCamp挑战的应用程序。
  7. 打印杨辉三角(数组练习)
  8. 认定信息网络传播行为应采用服务器标准,认定信息网络传播行为应采用“服务器标准”...
  9. JavaScript文档DOM对象处理HTML→document属性方法、write、getElementBy**、getsetAttribute、节点操作方法、innerHTML、操作CSS样式属性
  10. sql注入检测工具 mysql_SQL注入测试
  11. javassist修炼笔记
  12. Taro webview中的h5页面如何使用原生小程序API
  13. WPS简历模板的图标怎么修改_160套个人求职简历模板精美套装,修改内容直接套用...
  14. linux专业画图工具astah下载和安装
  15. C++计算两平面之间的夹角
  16. JAVA操作Word合并、替换占位符、Word插入富文本、生成水印
  17. 推荐一些亲测实用的小软件
  18. linux解压tar命令
  19. 反序列化失败although at least one Creator existsno delegate- or property-based Creator 异常
  20. 西部蓝盘和绿盘的区别是什么?适合哪些人群?

热门文章

  1. MySQL 远程连接报“ SQL 执行错误 # 1130.
  2. ORACLE序列的作用
  3. C语言sopc蜂鸣器按键弹奏中音,SOPC乐曲演奏大作业.doc
  4. 科普 | 继Wi-Fi 6之后的Wi-Fi 6E
  5. faile什么意思_fail是什么意思_fail在线翻译_英语_读音_用法_例句_海词词典
  6. WordPress大前端乐动体育指出:主题博客模板新增9个功能,修复7个bug
  7. Echarts 修改X轴字体大小
  8. excel常用小操作
  9. 【收藏】数据分析必会的Excel高频函数合集
  10. SQL Server数据库插入数据中文显示乱码问题