codeforces #136 div1

codeforces #136 div1
A
   一个有序数组A交换两个数之后, 变成数组B, 现在给出数组B, 问它是否可能由一个A变化而来.

算法分析:
   
   送分题, 将B排序之后比较错误的位置, 我这个NC居然YY了一个奇葩方法然后WA掉了.
代码:  http://codeforces.com/contest/220/submission/2085314

B
   给一个长度为n(n<100,000)的序列, m(m<100,000)次询问, 每次询问区间[l,r]内有多少个数X出现了X次.

算法分析:
   
   这样的数不超过sqrt(n)个, 所以离线求出所有这样的数, 然后去更新所有的询问.

代码:  http://codeforces.com/contest/220/submission/2076753
C
   有两个n-排列(n<100,000){a},{b}, 定义f(a,b) = min(abs(i,j)) when ai == bj. 求{b}所有的循环与a的距离.

算法分析:
   
   维护两个优先级队列A,B, A中存放的是所有(ai == bj && j >= i)的abs(i,j)值, B反之.
   所以A是不断变大的, B是不断变小的, 有两种情况需要改变优先级队列的结构:
      B中元素减少到0 , 小case ~~
      循环的时候, 末尾的元素更新
   这样涉及到元素的删除, 我们肯定不能真的删除, 而是选择弹出"废物"节点.
   于是维护一个数组, 存放每个元素的当前位置就可以了.

代码:  http://codeforces.com/contest/220/submission/2085278

D
   询问在4000*4000的网格中, 面积是整数的三角形有多少个?

算法分析:
   不妨判断面积乘以2等于偶数的三角形有的多少, 根据叉积推导面积, 发现至于三个顶点坐标的奇偶性有关.
   我们可以想像一个1*1的格子的四个点一定代表了四个种类的格子, 那么三个不同种类的格子肯定是不能构成三角形了.
   然后暴力找规律发现有两个奇偶性相同的格子一定能构成面积是整数的三角形.

   于是组合数求出一个数, 减去退化的情况.
   我们可以对共线的三点的最外两点进行统计, 枚举底和高, 4000*4000.
   然后乘以起点和中间点, 中间点的数量就是底和高的gcd了.

代码:  http://codeforces.com/contest/220/submission/2100456

E
   给一个长度为n的序列,(n<100,000). 问存在多少对l,r使得a1...l cons ar ...n-1的逆序数不超过k(k<long long)

算法分析:
   维护l和r两个值, 随着l的增加, r单调不上升. 在这个过程中维护三个值:
      pl 1...l 的逆序数
      pr r...n-1的逆序数   
      pz 1...l中比r大的数
   随着r的不断增加我们可以用线段树维护这三个值.

代码:  http://codeforces.com/contest/220/submission/2087403

你可能感兴趣的:(codeforces #136 div1)