Cards Sorting

思路:

  线段树;

代码:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. using namespace std;
  6. #define maxn 100005
  7. #define INF 0x3f3f3f3f
  8. #define maxtree maxn<<2
  9. int n,ai[maxn],val[maxtree],L[maxtree],R[maxtree],Min[maxtree];
  10. int P[maxtree],mid[maxtree];
  11. inline void in(int &now)
  12. {
  13. char Cget=getchar();now=;
  14. while(Cget>''||Cget<'') Cget=getchar();
  15. while(Cget>=''&&Cget<='')
  16. {
  17. now=now*+Cget-'';
  18. Cget=getchar();
  19. }
  20. }
  21. void updata(int now)
  22. {
  23. val[now]=val[now<<]+val[now<<|];
  24. Min[now]=min(Min[now<<],Min[now<<|]);
  25. if(Min[now]==Min[now<<|]) P[now]=P[now<<|];
  26. else P[now]=P[now<<];
  27. }
  28. void build(int now,int l,int r)
  29. {
  30. L[now]=l,R[now]=r;
  31. if(l==r)
  32. {
  33. Min[now]=ai[l],P[now]=l,val[now]=;
  34. return;
  35. }
  36. mid[now]=l+r>>;
  37. build(now<<,l,mid[now]);
  38. build(now<<|,mid[now]+,r);
  39. updata(now);
  40. }
  41. void change(int now,int to)
  42. {
  43. if(L[now]==R[now])
  44. {
  45. val[now]=,Min[now]=INF,P[now]=;
  46. return;
  47. }
  48. if(to<=mid[now]) change(now<<,to);
  49. else change(now<<|,to);
  50. updata(now);
  51. }
  52. int query(int now,int l,int r)
  53. {
  54. if(L[now]>=l&&R[now]<=r) return val[now];
  55. int res=;
  56. if(l<=mid[now]) res+=query(now<<,l,r);
  57. if(r>mid[now]) res+=query(now<<|,l,r);
  58. return res;
  59. }
  60. int get(int now,int l,int r)
  61. {
  62. if(L[now]>=l&&R[now]<=r) return P[now];
  63. int tmp1=,tmp2=;
  64. if(l<=mid[now]) tmp1=get(now<<,l,r);
  65. if(r>mid[now]) tmp2=get(now<<|,l,r);
  66. if(tmp2&&tmp1)
  67. {
  68. if(ai[tmp1]<ai[tmp2]) return tmp1;
  69. else return tmp2;
  70. }
  71. if(tmp2) return tmp2;
  72. if(tmp1) return tmp1;
  73. return ;
  74. }
  75. int main()
  76. {
  77. in(n);
  78. for(int i=;i<=n;i++) in(ai[i]);
  79. int l=,r=n;while(l<r) swap(ai[l],ai[r]),l++,r--;
  80. build(,,n);
  81. int now=n,tmp1,tmp2,tmp;
  82. long long ans=;
  83. for(int i=;i<=n;i++)
  84. {
  85. tmp1=,tmp2=,tmp1=get(,,now);
  86. if(now<n) tmp2=get(,now+,n);
  87. if(tmp1&&tmp2)
  88. {
  89. if(ai[tmp2]<ai[tmp1]) tmp=tmp2;
  90. else tmp=tmp1;
  91. }
  92. else if(tmp1) tmp=tmp1;
  93. else tmp=tmp2;
  94. if(tmp<=now) ans+=query(,tmp,now);
  95. else ans+=query(,,now)+query(,tmp,n);
  96. change(,tmp),now=tmp;
  97. }
  98. cout<<ans;
  99. return ;
  100. }

AC日记——Cards Sorting codeforces 830B的更多相关文章

  1. AC日记——Card Game codeforces 808f

    F - Card Game 思路: 题意: 有n张卡片,每张卡片三个值,pi,ci,li: 要求选出几张卡片使得pi之和大于等于给定值: 同时,任意两两ci之和不得为素数: 求选出的li的最小值,如果 ...

  2. AC日记——Success Rate codeforces 807c

    Success Rate 思路: 水题: 代码: #include <cstdio> #include <cstring> #include <iostream> ...

  3. AC日记——T-Shirt Hunt codeforces 807b

    T-Shirt Hunt 思路: 水题: 代码: #include <cstdio> #include <cstring> #include <iostream> ...

  4. AC日记——Magazine Ad codeforces 803d

    803D - Magazine Ad 思路: 二分答案+贪心: 代码: #include <cstdio> #include <cstring> #include <io ...

  5. AC日记——Broken BST codeforces 797d

    D - Broken BST 思路: 二叉搜索树: 它时间很优是因为每次都能把区间缩减为原来的一半: 所以,我们每次都缩减权值区间. 然后判断dis[now]是否在区间中: 代码: #include ...

  6. AC日记——Array Queries codeforces 797e

    797E - Array Queries 思路: 分段处理: 当k小于根号n时记忆化搜索: 否则暴力: 来,上代码: #include <cmath> #include <cstdi ...

  7. AC日记——Maximal GCD codeforces 803c

    803C - Maximal GCD 思路: 最大的公约数是n的因数: 然后看范围k<=10^10; 单是答案都会超时: 但是,仔细读题会发现,n必须不小于k*(k+1)/2: 所以,当k不小于 ...

  8. AC日记——Vicious Keyboard codeforces 801a

    801A - Vicious Keyboard 思路: 水题: 来,上代码: #include <cstdio> #include <cstring> #include < ...

  9. AC日记——Valued Keys codeforces 801B

    801B - Valued Keys 思路: 水题... 来,上代码: #include <cstdio> #include <cstring> #include <io ...

随机推荐

  1. MySQL 语句中执行优先级——and比or高

    转: MySQL 语句中执行优先级——and比or高 2017年04月20日 13:33:03 十步行 阅读数:7381   版权声明:本文为博主原创文章,未经博主允许不得转载. https://bl ...

  2. makefile使用笔记(二)变量

    By francis_hao    Oct 30,2017   makefile中可以使用变量,变量有多种类型,下面分别介绍 简单变量 简单变量的命名规则和c语言一致. 给变量赋值就表示创建了这个变量 ...

  3. Codeforces Round #338 (Div. 2) D 数学

    D. Multipliers time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  4. Codeforces Round #405 (rated, Div. 2, based on VK Cup 2017 Round 1)A B C 水 并查集 思路

    A. Bear and Big Brother time limit per test 1 second memory limit per test 256 megabytes input stand ...

  5. 阿里云 centos7 tomcat 启动巨慢的解决方法(几分钟)

    方法一: 通过修改Tomcat启动文件-Djava.security.egd=file:/dev/urandom 通过修改JRE中的java.security文件securerandom.source ...

  6. python学习(九) 网络编程学习--简易网站服务器

    python `网络编程`和其他语言都是一样的,服务器这块步骤为:`1. 创建套接字``2. 绑定地址``3. 监听该描述符的所有请求``4. 有新的请求到了调用accept处理请求` Python ...

  7. 8.Android_UiAutomator 报告查看

    一.Android UiAutomator报告查看 1.错误类型 1)断言错误:就是断言这个用例的成功或者失败(AssrtionFailedError) 2)脚本错误:UiObjectNotFound ...

  8. IOS性能调优系列:使用Time Profiler发现性能瓶颈

    硬广:<IOS性能调优系列>第五篇,预计会有二十多篇,持续更新,欢迎关注. 之前四篇都是关注于内存方面,分析了内存泄漏.僵尸对象.内存分配,本篇介绍Time Profiler工具的使用,开 ...

  9. Java BLOB 数据的插入与读取 操作

    package com.lw.database; import java.io.FileInputStream; import java.io.FileOutputStream; import jav ...

  10. bluebird -1 New Promise方法

    new Promise new Promise(function(function resolve, function reject) resolver) -> Promise 创建一个Prom ...