uva 11990 块状链表

想了想树套树比较难写,于是块链试一下,2秒左右过了。

  1 #include <algorithm>
  2 #include <iostream>
  3 #include <cstring>
  4 #include <cstdio>
  5 #include <cmath>
  6 using namespace std;
  7
  8 typedef long long ll;
  9 const int INF = 9999999;
 10 const int N = 200001;
 11 const int M = 1000;
 12 int b[M][M];
 13 int sz[M];
 14 int a[N];
 15 int d[N];
 16 int n, m, ps, k;
 17
 18 void remove( int num )
 19 {
 20     int pos = d[num];
 21     int cur = pos / ps;
 22     int w = lower_bound( b[cur], b[cur] + sz[cur], num ) - b[cur];
 23     for ( int i = w; i < sz[cur] - 1; i++ )
 24     {
 25         b[cur][i] = b[cur][i + 1];
 26     }
 27     sz[cur]--;
 28     a[d[num]] = INF;
 29 }
 30
 31 int query( int num )
 32 {
 33     int pos = d[num];
 34     int cur = pos / ps;
 35     int s = 0, c = 0;
 36     for ( int i = 0; i < cur; i++ )
 37     {
 38         if ( sz[i] )
 39         {
 40             s += sz[i];
 41             c += upper_bound( b[i], b[i] + sz[i], num ) - b[i];
 42         }
 43     }
 44     for ( int i = cur * ps; i < pos; i++ )
 45     {
 46         if ( a[i] != INF )
 47         {
 48             s++;
 49             if ( a[i] < num ) c++;
 50         }
 51     }
 52     s -= c;
 53     for ( int i = cur + 1; i < k; i++ )
 54     {
 55         if ( sz[i] )
 56         {
 57             s += upper_bound( b[i], b[i] + sz[i], num ) - b[i];
 58         }
 59     }
 60     int bound = min( n, ( cur + 1 ) * ps );
 61     for ( int i = pos + 1; i < bound; i++ )
 62     {
 63         if ( a[i] < num )
 64         {
 65             s++;
 66         }
 67     }
 68     return s;
 69 }
 70
 71 int main ()
 72 {
 73     while ( scanf("%d%d", &n, &m) != EOF )
 74     {
 75         ps = 800;
 76         for ( int i = 0; i < n; i++ )
 77         {
 78             scanf("%d", &a[i]);
 79             b[i / ps][i % ps] = a[i];
 80             d[a[i]] = i;
 81         }
 82         k = ( n + ps - 1 ) / ps;
 83         for ( int i = 0; i < k - 1; i++ )
 84         {
 85             sz[i] = ps;
 86             sort( b[i], b[i] + sz[i] );
 87         }
 88         sz[k - 1] = n - ( k - 1 ) * ps;
 89         sort( b[k - 1], b[k - 1] + sz[k - 1] );
 90         ll ans = 0;
 91         for ( int i = 1; i <= n; i++ )
 92         {
 93             ans += query(i);
 94         }
 95         ans = ans / 2;
 96         for ( int i = 0; i < m; i++ )
 97         {
 98             printf("%lld\n", ans);
 99             int tmp;
100             scanf("%d", &tmp);
101             ans -= query(tmp);
102             remove(tmp);
103         }
104     }
105     return 0;
106 }
时间: 2024-10-06 00:12:42

uva 11990 块状链表的相关文章

uva 11988 块状链表

其实链表就可以搞定,不过分析一下感觉块链也可以过,就套模板试了一下,果然没有让我失望,看来我写的块链还是不错的,哈哈. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 6 const int M = 100001; 7 const int N = 500; 8 char text[M]; 9 char b[N][N]; 10 int sz[N]

uva 12003 块状链表

先分块.对于查询,块内排好序二分,对于修改,直接暴力,注意需要维护原来的有序性,不断和块内相邻元素交换即可. 1 #include <algorithm> 2 #include <iostream> 3 #include <cstring> 4 #include <cstdio> 5 #include <cmath> 6 using namespace std; 7 8 const int N = 300000; 9 const int M =

【BZOJ2741】【块状链表+可持久化trie】FOTILE模拟赛L

Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 ... xor Aj),其中l<=i<=j<=r. 为了体现在线操作,对于一个询问(x,y): l = min ( ((x+lastans) mod N)+1 , ((y+lastans) mod N)+1 ).r = max ( ((x+lastans) mod N)+1 , ((y+last

【POJ2887】【块状链表】Big String

Description You are given a string and supposed to do some string manipulations. Input The first line of the input contains the initial string. You can assume that it is non-empty and its length does not exceed 1,000,000. The second line contains the

c++之路进阶——块状链表(弹飞绵羊)

2333 弹飞绵羊 2010年省队选拔赛湖南 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题解 题目描述 Description Lostmonkey发明了一种超级反弹装置.为了在绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿一条直线摆放 n个反弹装置,并按从前往后的方式将反弹装置依次编号为 0 到 n-1,对 0≤i≤n-1,为第 i 个反弹装置设定了初始弹力系数 ki,当绵羊落到第 i 个反弹装置上时,它将被往后

c++之路——块状链表(教主的魔法)

F.A.Qs Home Discuss ProblemSet Status Ranklist Contest ModifyUser  gryz2016 Logout 捐赠本站 Notice:由于本OJ建立在Linux平台下,而许多题的数据在Windows下制作,请注意输入.输出语句及数据类型及范围,避免无谓的RE出现. 3343: 教主的魔法 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 711  Solved: 309[Submit][Stat

UVA 11990 ``Dynamic&#39;&#39; Inversion

26天以前做过的一道题,之前的做法是分治预处理,树套树在线修改,复杂度为O(nlogn+m*logn*logn),代码量较大. 本来想学习一下cdq分治的,看到论文上的凸包.斜率就暂时放一边了,只知道和一般的分治的不同是左子问题可以用来解决右边的子问题. 今天下午YY了一个离线的分治做法. 对于每一个数字,构成逆序对除了val大小还和被删除的时间del有关,这实际上是一个三维偏序的问题. 一个元素是一个三元组e(pos,val,del),e1和e2对答案有贡献当且仅当e1.pos < e1.po

hdu 1754 块状链表 单点修改+单点查询

经典的线段树题目,也可以用块状链表做. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cmath> 5 using namespace std; 6 7 const int N = 200000; 8 const int M = 800; 9 int n, m, tot; 10 11 int max( int a, int b ) 12 { 13 retu

poj 2887 块状链表

块状链表第一题,懒得写成链表形式的,所以写成了静态链表. 思想还是很简单的,就是进行分块查找和插入,和建立索引有点像,复杂度是根号的,实现起来比较容易,由于这个题插入操作不多,所以没有写split函数, 因为没有删除操作,所以也没有写union函数,随后有空再补上吧. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cmath> 5 using namesp