花团

线段树分治裸题

给出了结束时间跟离线没区别

「LibreOJ Round #6」花火

首先在第一次使用交换是显然的

然后统计逆序对暴力是n^2的(前缀和优化)

因为交换两个点改变的只有x<i  y>i

刚开始想了决策是不是单调的

然后发现不是的

我们可以将它放在图上

然后我们会发现只有左上角没有东西,右下角没有东西的点才有用

然后我们会发现这个东西满足决策单调性(很容易证明分别取两个点看一看矩形的变化就行了)

然后就是比较套路的我们要用分治算法来解决

题解用的是树状数组,也就是每层跑一次(就是bfs)

因为理论复杂度差不多然后主席树没细节就写了主席树,跑的好像挺快的啊?

时间复杂度nlog^2

#include <bits/stdc++.h>
using namespace std;
#define rint register int
#define IL inline
#define rep(i,h,t) for (rint i=h;i<=t;i++)
#define dep(i,t,h) for (rint i=t;i>=h;i--)
#define me(x) memset(x,0,sizeof(x))
#define lowbit(x) (x&(-x))
#define ll long long
const int N=4e5;
const int N2=N*;
int a[N],sum,ans,root[N],cnt,n;
#define mid ((h+t)>>1)
struct sgt{
int data[N2],ls[N2],rs[N2];
void insert(rint &x,rint lst,rint h,rint t,rint pos)
{
x=++cnt; ls[x]=ls[lst]; rs[x]=rs[lst];
data[x]=data[lst]+;
if (h==t) return;
if (pos<=mid) insert(ls[x],ls[lst],h,mid,pos);
if (pos>mid) insert(rs[x],rs[lst],mid+,t,pos);
}
int find(rint x,rint h,rint t,rint h1,rint t1)
{
if (!x) return ;
if (h1<=h&&t<=t1) return(data[x]);
rint ans=;
if (h1<=mid) ans+=find(ls[x],h,mid,h1,t1);
if (mid<t1) ans+=find(rs[x],mid+,t,h1,t1);
return ans;
}
IL int query(int x,int y,int h,int t)
{
if (x>y) return();
return(find(root[y],,n,h,t)-find(root[x-],,n,h,t));
}
}B;
int s1[N],s2[N];
void fz(int h,int t,int h1,int t1)
{
int num=-1e9,num2=;
rep(i,h1,t1)
if (s2[i]>=s1[mid])
{
rint t1=s1[mid],t2=s2[i];
rint ans2=;
if (a[t2]<a[t1])
{
// ans1=B.query(t1,t2,a[t2]+1)+t2-t1-B.query(t1,t2,a[t1]);
ans2=*B.query(t1,t2,a[t2]+,a[t1]-)+;
// ans2=t2-t1;
// ans2=2*(ans1-ans2)+1;
if (ans2>=num) num=ans2,num2=i;
}
}
sum=max(sum,num);
if (!num2) num2=h1;
if (h<=mid-) fz(h,mid-,h1,num2);
if (mid+<=t) fz(mid+,t,num2,t1);
}
int main()
{
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
ios::sync_with_stdio(false);
cin>>n;
rep(i,,n) cin>>a[i];
ll ans=;
rep(i,,n)
{
ans+=B.query(,i-,a[i]+,n);
B.insert(root[i],root[i-],,n,a[i]);
}
int cnt1=,cnt2=;
rep(i,,n) if (a[i]>=a[s1[cnt1]]) s1[++cnt1]=i;
a[]=1e9;
dep(i,n,) if (a[i]<=a[s2[cnt2]]) s2[++cnt2]=i;
reverse(s2+,s2+cnt2+);
fz(,cnt1,,cnt2);
cout<<min(ans,ans-sum+)<<endl;
return ;
}

lojround6的更多相关文章

随机推荐

  1. 数据库的OLE字段写入长二进制文件

    //'*************************************************************************************** //'函数:将数据 ...

  2. <杂记>该换个背景图了

    ..当然我刚开始也是懵逼的,我有发现这里可以写css,但是还是缺个图片地址,想了想,这不是还有个相册功能吗. 那应该就是把自己要换的图片上传到相册吧. 右击图片,选择检查元素找到图片的src 如:ht ...

  3. python操作三大主流数据库(14)python操作redis之新闻项目实战②新闻数据的展示及修改、删除操作

    python操作三大主流数据库(14)python操作redis之新闻项目实战②新闻数据的展示及修改.删除操作 项目目录: ├── flask_redis_news.py ├── forms.py ├ ...

  4. MySQL配置说明

    以下内容,来源于http://www.jb51.net/article/48082.htm [client] port = 3306 socket = /tmp/mysql.sock [mysqld] ...

  5. 设计模式--观察者模式Observer(对象行为型)

    一.观察者模式 观察者模式是在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新.观察者模式也被称之为:主题-观察者模式,发布-订阅模式,前者是一,后者是多. ...

  6. LabVIEW 获取本机多个ip地址

    图 1   网上见了好多设置的,都没讲清楚,在这里整理一下本机ip地址的获取问题.关键在"字符串向ip地址转换"函数的设置上面,见下图2,选择多输出就能获取本机的多个ip地址,若不 ...

  7. 前端-----JavaScript 初识基础

    JavaScript的组成 JavaScript基础分为三个部分: ECMAScript:JavaScript的语法标准.包括变量.表达式.运算符.函数.if语句.for语句等. DOM:操作网页上的 ...

  8. 【原创】Linux基础之chkconfig systemd

    CentOS6服务用chkconfig控制,CentOS7改为systemd控制 1 systemd systemd is a suite of basic building blocks for a ...

  9. windows 2012执行powershell脚本报错

    使用powershell运行脚本报错:进行数字签名.无法在当前系统上运行该脚本.有关运行脚本和设置执行策略的详细信息 修复方法:powershell "Set-ExecutionPolicy ...

  10. Codeforces 1045G AI robots [CDQ分治]

    洛谷 Codeforces 简单的CDQ分治题. 由于对话要求互相看见,无法简单地用树套树切掉,考虑CDQ分治. 按视野从大到小排序,这样只要右边能看见左边就可以保证互相看见. 发现\(K\)固定,那 ...