题意很明确,也非常经典:

一个支持查询 区间中比k大的数的个数 并且支持单点修改的序列

——因为题意可以转化为:查询这两个数中比后者大的个数、比后者小的个数、比前者大的个数、比前者小的个数(根据这4个就能算出增加/减少了多少对逆序对)并且把两个数修改掉

于是就出现了

——来自百度

一个二分就能解决套个卵蛋woc身为一个蒟蒻,表示没有一个写得出的

于是我就想了一个好写(Rank100+几乎T掉)的方法:

首先复制一份原数据,把一份分块,并且保证每一块中的单调(也就是调用sqrt(n)次排序)

然后在查询时对于单块暴力处理,对于整块二分查找;修改时冒泡(呵呵,不要吐槽)

——一听复杂度就好大,那就算一算吧

首先要排序O(sqrt(n)*sqrt(n)*lg sqrt(n))              //sqrt(n)次的排序,每次nlgn(这里的n为原题的sqrt(n))

其次是查询O(m*(sqrt(n)+sqrt(n)*lg sqrt(n)))      //总共有m次,每次零散的有sqrt(n)个,整块的有sqrt(n)块,每块费时lg sqrt(n)

最后是修改O(m*(sqrt(n)+sqrt(n)))                       //冒个泡应该不用解释,每次收尾都需要冒一遍,一遍最多sqrt(n)次移动

然后愉快地堆起来变成预处理O(n*lg sqrt(n))主体O(m*sqrt(n)*lgn)

介于数据弱(如果按套来套去的结构算好像还可以加大一点数据,但是蒟蒻表示受不了,这么个简单思路我调了一下午),我还是过掉了

代码风格属于臭婆娘的擦脚布,不喜勿喷

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. int n,m,x,y,N;
  7. int a[],b[];//未排序数据和已排序数据
  8. int l[],r[];//分块两端
  9. //处理重复数据真TM的累,find和Find带_的是找小于给定关键字的数的个数的,不带的是找大于的个数的
  10. int Find(int o,int x)//在一块中二分查找x
  11. {
  12. int L=l[o],R=r[o];
  13. while(L<R-)
  14. {
  15. int mid=(L+R)/;
  16. if(b[mid]<=x)//这边一开始缺个等号导致我调一下午
  17. L=mid;
  18. else
  19. R=mid;
  20. }
  21. if(b[R]<=x)
  22. return r[o]-R;
  23. else
  24. if(x<b[L])
  25. return r[o]-L+;
  26. else
  27. return r[o]-L;
  28. }
  29. int find(int x,int y,int z)//查询,分成三段分别求解
  30. {
  31. int sum=;
  32. for(int i=;i<=N;i++)
  33. if((x<=l[i])&&(r[i]<=y))
  34. sum+=Find(i,z);
  35. else
  36. if((x>=l[i])&&(y<=r[i]))
  37. {
  38. for(int j=x;j<=y;j++)
  39. sum+=a[j]>z;
  40. return sum;
  41. }
  42. else
  43. if(x>=l[i] && x<=r[i])
  44. for(int j=x;j<=r[i];j++)
  45. sum+=a[j]>z;
  46. else
  47. if(l[i]<=y && y<=r[i])
  48. {
  49. for(int j=l[i];j<=y;j++)
  50. sum+=a[j]>z;
  51. return sum;
  52. }
  53. return sum;
  54. }
  55. int _Find(int o,int x)//在一块中二分查找x
  56. {
  57. int L=l[o],R=r[o];
  58. while(L<R-)
  59. {
  60. int mid=(L+R)/;
  61. if(b[mid]<x)//这边不能有等号,非常神奇,建议想一想为什么
  62. L=mid;
  63. else
  64. R=mid;
  65. }
  66. if(b[R]<x)
  67. return R-l[o]+;
  68. else
  69. if(x<=b[L])
  70. return L-l[o];
  71. else
  72. return R-l[o];
  73. }
  74. int _find(int x,int y,int z)//查询,分成三段分别求解
  75. {
  76. int sum=;
  77. for(int i=;i<=N;i++)
  78. if((x<=l[i])&&(r[i]<=y))
  79. sum+=_Find(i,z);
  80. else
  81. if((x>=l[i])&&(y<=r[i]))
  82. {
  83. for(int j=x;j<=y;j++)
  84. sum+=a[j]<z;
  85. return sum;
  86. }
  87. else
  88. if(x>=l[i] && x<=r[i])
  89. for(int j=x;j<=r[i];j++)
  90. sum+=a[j]<z;
  91. else
  92. if(l[i]<=y && y<=r[i])
  93. {
  94. for(int j=l[i];j<=y;j++)
  95. sum+=a[j]<z;
  96. return sum;
  97. }
  98. return sum;
  99. }
  100. void change(int x,int y)//把位于x的数改成y,冒个泡
  101. {
  102. int i,j;
  103. for(i=;r[i]<x;i++);
  104. for(j=l[i];b[j]!=a[x];j++);
  105. b[j]=y;
  106. while((j<r[i])&&(b[j]>b[j+]))
  107. {
  108. swap(b[j],b[j+]);
  109. j++;
  110. }
  111. while((j>l[i])&&(b[j]<b[j-]))
  112. {
  113. swap(b[j],b[j-]);
  114. j--;
  115. }
  116. a[x]=y;
  117. }
  118. int init()//预处理,分块+排序
  119. {
  120. int sq=(int)sqrt(n);
  121. for(int i=;i<=sq;i++)
  122. {
  123. l[i]=sq*(i-)+;
  124. r[i]=sq*i;
  125. }
  126. if(sq*sq<n)
  127. {
  128. l[sq+]=sq*sq+;
  129. r[++sq]=n;
  130. }
  131. memcpy(b,a,sizeof(a));
  132. for(int i=;i<=sq;i++)
  133. sort(b+l[i],b+r[i]+);
  134. return sq;
  135. }
  136. int main()
  137. {
  138. scanf("%d",&n);
  139. for(int i=;i<=n;i++)
  140. scanf("%d",&a[i]);
  141. N=init();
  142. int ans=;
  143. for(int i=;i<n;i++)
  144. ans+=_find(i+,n,a[i]);
  145. printf("%d\n",ans);
  146. scanf("%d",&m);
  147. for(int i=;i<=m;i++)
  148. {
  149. scanf("%d%d",&x,&y);
  150. if(x>y)
  151. swap(x,y);
  152. ans-=find(x,y-,a[y]);
  153. ans+=_find(x,y-,a[y]);
  154. if(y-x>)
  155. {
  156. ans+=find(x+,y-,a[x]);
  157. ans-=_find(x+,y-,a[x]);
  158. }
  159. printf("%d\n",ans);
  160. int t=a[x];
  161. change(x,a[y]);
  162. change(y,t);
  163. }
  164. return ;
  165. }

据说一个函数不能太长,否则难看,于是就瞎写成了这副德行%还是不习惯啊

bzoj2141排队(辣鸡但是好写的方法)的更多相关文章

  1. 7.29 NOIP模拟测试10 辣鸡(ljh)+模板(ac)+大佬(kat)

    T1 辣鸡(ljh) 就是一道分类讨论的暴搜,外加一丢丢的减枝,然而我挂了,为啥呢,分类讨论变量名打错,大于小于号打反,能对才怪,写了sort为了调试就注释了,后来忘了解开,小减枝也没打.但是这道题做 ...

  2. JVM 辣鸡回收

    垃圾回收算法 标记清除法 先标记出需要回收的对象,然后一次性回收.缺点:会产生内存碎片,并且效率也不高. 标记压缩法 先标记出需要回收的对象,然后让存活对象向一端移动,移动的过程中进行回收辣鸡.避免了 ...

  3. [CSP-S模拟测试]:辣鸡(ljh) (暴力)

    题目描述 辣鸡$ljh\ NOI$之后就退役了,然后就滚去学文化课了.然而在上化学课的时候,数学和化学都不好的$ljh$却被一道简单题难住了,受到了大佬的嘲笑.题目描述是这样的:在一个二维平面上有一层 ...

  4. noip模拟6[辣鸡·模板·大佬·宝藏]

    这怕不是学长出的题吧 这题就很迷 这第一题吧,正解竟然是O(n2)的,我这是快气死了,考场上一直觉得aaaaa n2过不了过不了, 我就去枚举边了,然后调了两个小时,愣是没调出来,然后交了个暴力,就走 ...

  5. NOIP模拟测试10「大佬·辣鸡·模板」

    大佬 显然假期望 我奇思妙想出了一个式子$f[i]=f[i-1]+\sum\limits_{j=1}^{j<=m} C_{k \times j}^{k}\times w[j]$ 然后一想不对得容 ...

  6. [改善Java代码]不推荐覆写start方法

    多线程比较简单的方式是继承Thread类,然后覆写run()方法,在客户端程序中通过调用对象的start方法即可启动一个线程,这个是多线程程序的标准写法. 错误代码: public class Cli ...

  7. [改善Java代码]覆写equals方法必须覆写hashCode方法

    覆写equals方法必须覆写hashCode方法,这条规则基本上每个Javaer都知道,这也是JDK API上反复说明的,不过为什么要这样做呢?这两个方法之间有什么关系呢?本建议就来解释该问题,我们先 ...

  8. [改善Java代码]覆写equals方法时不要识别不出自己

    建议45: 覆写equals方法时不要识别不出自己 我们在写一个JavaBean时,经常会覆写equals方法,其目的是根据业务规则判断两个对象是否相等,比如我们写一个Person类,然后根据姓名判断 ...

  9. [改善Java代码]推荐覆写toString方法

    建议49: 推荐覆写toString方法 为什么要覆写toString方法,这个问题很简单,因为Java提供的默认toString方法不友好,打印出来看不懂,不覆写不行,看这样一段代码: public ...

随机推荐

  1. 【转】Java enum的用法详解

    用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. p ...

  2. gzip的使用

    经常会有文件过大,给文件的传输和增添了很多的麻烦,早先得知apach有个base64貌似可以用来压缩文件,但是测试没有什么效果,反而增大了文件的大小.今天了解了java自带的gzip包,如获至宝,超级 ...

  3. 今天在学习NTP时发现了2个网站

    NTP 调整系统时间 一个网站是:http://chrony.tuxfamily.org/doc/1.31/manual.html  这个是专门介绍chrony的,做的很详细. 另外一个是:http: ...

  4. silverlight_容器

    Canvas絕對佈局 定位Canvas.Top.Canvas.Left ZIndex屬性 若制定2個控制項重疊,那麼後聲明控制項會覆蓋先聲明的控制項.此時可以使用Canvas.ZIndex屬性來改變它 ...

  5. linux常用命令-帮助命令man,whatis,apropos,info,help

    man 命令 man 配置文件,注意这里只需要写文件名称就可以了,不能写文件的绝对路径 man既可以查看命令的帮助信息也可以查看配置文件的帮助信息,如果内容太多,可以输入"/内容" ...

  6. socket的IO多路复用

    IO 多路复用 I/O多路复用指:通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作. Linux Linux中的 select,poll, ...

  7. Linux压缩和解压汇总

    各种后缀的压缩包压缩方法和解压方法 压缩包 压缩 解压 .tar.gz和.tgz tar -czf jpg.tar.gz *.jpg tar -xzvf filename -C path .tar.b ...

  8. 在VS中建立.aspx,.cs,.designer.cs之间的级联关系

    <Compile Include="..\Admin\Actions.aspx.cs"> <DependentUpon>Actions.aspx</D ...

  9. node01-创建服务器

    node学习笔记目录:node01-创建服务器 node02-util node03-events node04-buffer node05-fs node06-path node07-http no ...

  10. 在新机器部署Qt+mysql程序

    1.一般情况下需要将Qt5Core.dll,Qt5Gui.dll,Qt5Sql.dll,Qt5Widgets.dll,platforms\qwindows.dll msvcp120.dll,msvcp ...