花团

线段树分治裸题

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

「LibreOJ Round #6」花火

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

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

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

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

然后发现不是的

我们可以将它放在图上

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

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

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

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

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

时间复杂度nlog^2

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define rint register int
  4. #define IL inline
  5. #define rep(i,h,t) for (rint i=h;i<=t;i++)
  6. #define dep(i,t,h) for (rint i=t;i>=h;i--)
  7. #define me(x) memset(x,0,sizeof(x))
  8. #define lowbit(x) (x&(-x))
  9. #define ll long long
  10. const int N=4e5;
  11. const int N2=N*;
  12. int a[N],sum,ans,root[N],cnt,n;
  13. #define mid ((h+t)>>1)
  14. struct sgt{
  15. int data[N2],ls[N2],rs[N2];
  16. void insert(rint &x,rint lst,rint h,rint t,rint pos)
  17. {
  18. x=++cnt; ls[x]=ls[lst]; rs[x]=rs[lst];
  19. data[x]=data[lst]+;
  20. if (h==t) return;
  21. if (pos<=mid) insert(ls[x],ls[lst],h,mid,pos);
  22. if (pos>mid) insert(rs[x],rs[lst],mid+,t,pos);
  23. }
  24. int find(rint x,rint h,rint t,rint h1,rint t1)
  25. {
  26. if (!x) return ;
  27. if (h1<=h&&t<=t1) return(data[x]);
  28. rint ans=;
  29. if (h1<=mid) ans+=find(ls[x],h,mid,h1,t1);
  30. if (mid<t1) ans+=find(rs[x],mid+,t,h1,t1);
  31. return ans;
  32. }
  33. IL int query(int x,int y,int h,int t)
  34. {
  35. if (x>y) return();
  36. return(find(root[y],,n,h,t)-find(root[x-],,n,h,t));
  37. }
  38. }B;
  39. int s1[N],s2[N];
  40. void fz(int h,int t,int h1,int t1)
  41. {
  42. int num=-1e9,num2=;
  43. rep(i,h1,t1)
  44. if (s2[i]>=s1[mid])
  45. {
  46. rint t1=s1[mid],t2=s2[i];
  47. rint ans2=;
  48. if (a[t2]<a[t1])
  49. {
  50. // ans1=B.query(t1,t2,a[t2]+1)+t2-t1-B.query(t1,t2,a[t1]);
  51. ans2=*B.query(t1,t2,a[t2]+,a[t1]-)+;
  52. // ans2=t2-t1;
  53. // ans2=2*(ans1-ans2)+1;
  54. if (ans2>=num) num=ans2,num2=i;
  55. }
  56. }
  57. sum=max(sum,num);
  58. if (!num2) num2=h1;
  59. if (h<=mid-) fz(h,mid-,h1,num2);
  60. if (mid+<=t) fz(mid+,t,num2,t1);
  61. }
  62. int main()
  63. {
  64. freopen("1.in","r",stdin);
  65. freopen("1.out","w",stdout);
  66. ios::sync_with_stdio(false);
  67. cin>>n;
  68. rep(i,,n) cin>>a[i];
  69. ll ans=;
  70. rep(i,,n)
  71. {
  72. ans+=B.query(,i-,a[i]+,n);
  73. B.insert(root[i],root[i-],,n,a[i]);
  74. }
  75. int cnt1=,cnt2=;
  76. rep(i,,n) if (a[i]>=a[s1[cnt1]]) s1[++cnt1]=i;
  77. a[]=1e9;
  78. dep(i,n,) if (a[i]<=a[s2[cnt2]]) s2[++cnt2]=i;
  79. reverse(s2+,s2+cnt2+);
  80. fz(,cnt1,,cnt2);
  81. cout<<min(ans,ans-sum+)<<endl;
  82. return ;
  83. }

lojround6的更多相关文章

随机推荐

  1. ubuntu 16.04 修正网卡与ifname对应关系

    一台工控机,含有6个网口,但是名称  enp3s0 等等与网口顺序对应不起来. 现在修改脚本 /etc/udev/rules.d/70-persistent-net.rules ,如果文件不存在,可以 ...

  2. datatables日常使用集合

    datatables CDN链接地址: <link rel="stylesheet" type="text/css" href="https:/ ...

  3. Android apk动态加载机制

    参考链接:http://blog.csdn.net/singwhatiwanna/article/details/22597587

  4. 金9银10,分享几个重要的Android面试题

    说一下java多态的理解,以及接继承,和接口的理解 于哥在这里只讲多态,其他自己上网体会 对于多态的定义不同类的对象对统一函数做出不同对的响应或者动作.作用主要是消除类之间的耦合性,灵活性比较强,利于 ...

  5. SQL Server 2016 Failover Cluster + ALwaysOn

    SQL Server 2016 Failover Cluster + ALwaysOn 环境的搭建 近期公司为了提高服务的可用性,就想到了部署AlwaysOn,之前的环境只是部署了SQL Server ...

  6. 电子书转换为PDF格式

    目录 一.mobi 转换 pdf 步骤 二.查看转换后的结果目录 三.将PDF还原文件名且移出至新目录 背景:当我们从网上下载一些电子小说或书籍的时候,一般文件的格式可能是.epub..mobi等.这 ...

  7. jsp 监听器

    Servlet API提供了一系列的事件和事件监听接口. 上层的servlet/JSP应用能够通过调用这些API进行事件 驱动的开发.这里监听的所有事件都继承自 java.util.Event对象.监 ...

  8. PHP实现动态获取函数参数的方法

    1. func_num_args — 返回传入函数的参数总个数 int func_num_args ( void ) 示例 <?php function demo () { $numargs = ...

  9. 广工赛-hdu6468构造十叉树

    是个以前没见过的模板题.. 我用比较复杂度方式过掉了.. 构造一个十叉树(有点trie的味道)来存数字,然后字典序就是先序遍历的结果 #include<bits/stdc++.h> usi ...

  10. 解决Xshell不从22端口连接服务器

    xshell默认是22端口 如果服务器给的ssh端口不是22,会连接失败 需要去指定连接 新建 设置ip和端口,点下面的确定 双击刚创建的会话 输入用户名密码 连接成功