bzoj 1012 BST 支持插入,区间最大

水。。。

  1 /**************************************************************
  2     Problem: 1012
  3     User: idy002
  4     Language: C++
  5     Result: Accepted
  6     Time:1372 ms
  7     Memory:5960 kb
  8 ****************************************************************/
  9
 10 #include <cstdio>
 11 #include <iostream>
 12 #define fprintf(...)
 13 #define oo 0x3f3f3f3f
 14 #define maxn 200010
 15 using namespace std;
 16
 17 namespace S {
 18     int pre[maxn], son[maxn][2], siz[maxn], val[maxn], mv[maxn], root, ntot;
 19
 20     void update( int nd ) {
 21         siz[nd] = siz[son[nd][0]]+siz[son[nd][1]]+1;
 22         mv[nd] = max( val[nd], max( mv[son[nd][0]], mv[son[nd][1]] ) );
 23     }
 24     void rotate( int nd, int d ) {
 25         int p = pre[nd];
 26         int s = son[nd][!d];
 27         int ss = son[s][d];
 28
 29         son[nd][!d] = ss;
 30         son[s][d] = nd;
 31         if( p ) son[p][ nd==son[p][1] ] = s;
 32         else root = s;
 33
 34         pre[s] = p;
 35         pre[nd] = s;
 36         if( ss ) pre[ss] = nd;
 37
 38         update( nd );
 39         update( s );
 40     }
 41     void splay( int nd, int top=0 ) {
 42         while( pre[nd]!=top ) {
 43             int p = pre[nd];
 44             int nl = nd==son[p][0];
 45             if( pre[p]==top ) {
 46                 rotate( p, nl );
 47             } else {
 48                 int pp = pre[p];
 49                 int pl = p==son[pp][0];
 50                 if( nl==pl ) {
 51                     rotate( pp, pl );
 52                     rotate( p, nl );
 53                 } else {
 54                     rotate( p, nl );
 55                     rotate( pp, pl );
 56                 }
 57             }
 58         }
 59     }
 60     int newnode( int p, int v ) {
 61         int nd = ++ntot;
 62         pre[nd] = p;
 63         son[nd][0] = son[nd][1] = 0;
 64         siz[nd] = 1;
 65         mv[nd] = val[nd] = v;
 66         return nd;
 67     }
 68     int find( int pos ) {
 69         int nd = root;
 70         while( 1 ) {
 71             int ls = siz[son[nd][0]];
 72             if( pos<=ls ) {
 73                 nd = son[nd][0];
 74             } else if( pos>=ls+2 ) {
 75                 nd = son[nd][1];
 76                 pos -= ls+1;
 77             } else return nd;
 78         }
 79     }
 80     void init() {
 81         root = ntot = 0;
 82         val[0] = mv[0] = -oo;
 83     }
 84     void add_val( int v ) {
 85         fprintf( stderr, "add_val( %d )\n", v );
 86         if( !root ) {
 87             root = newnode( 0, v );
 88             return;
 89         }
 90         int nd = root;
 91         while( son[nd][1] ) nd=son[nd][1];
 92         son[nd][1] = newnode( nd, v );
 93         splay( son[nd][1] );
 94     }
 95     int qu_max( int pos ) {
 96         fprintf( stderr, "qu_max( %d )\n", pos );
 97         int nd = find(pos);
 98         splay( nd );
 99         return max( val[nd], mv[son[nd][1]] );
100     }
101 };
102
103 int main() {
104     int T, mod;
105     int lastans = 0;
106
107     scanf( "%d%d", &T, &mod );
108     S::init();
109     while( T-- ) {
110         char opt[10];
111         int v;
112         scanf( "%s%d", opt, &v );
113         if( opt[0]==‘A‘ ) {
114             v += lastans;
115             v %= mod;
116             S::add_val( v );
117         } else {
118             printf( "%d\n", lastans=S::qu_max( S::siz[S::root]-v+1 ) );
119         }
120     }
121 }

时间: 2024-11-06 20:04:46

bzoj 1012 BST 支持插入,区间最大的相关文章

【BZOJ】3065: 带插入区间K小值

题意:带插入.修改的区间k小值在线查询.(原序列n<=35000, 询问<=175000) #include <bits/stdc++.h> using namespace std; const int nTr=1000005, nSg=15000005, alphaA=4, alphaB=5; int STop; struct Seg *Snull; struct Seg { Seg *l, *r; int s, cnt; }Sg[nSg], *iSg=Sg, *bin[nSg]

bzoj 3065: 带插入区间K小值 替罪羊树 &amp;&amp; AC300

3065: 带插入区间K小值 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 1062  Solved: 253[Submit][Status] Description 从 前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理性愉悦一 下,查询区间k小值.他每次向它的随从伏特提出这样的问题: 从左往右第x个到第y个跳蚤中,a[i]第k小的值是多少. 这可难不倒伏特,

BZOJ 1901: Zju2112 Dynamic Rankings 区间k大 带修改 在线 线段树套平衡树

之前写线段树套splay数组版..写了6.2k..然后弃疗了.现在发现还是很水的..嘎嘎.. zju过不了,超时. upd:才发现zju是多组数据..TLE一版才发现.然后改了,MLE...手写内存池..尼玛终于过了..附zju2112代码于后. bzoj倒是过了,1A的感觉还是很爽的..可是时间不好看..这就是所谓\(O(nlog^3n)\)的复杂度的可怜之处么? 写挂的地方: insert一定要是传地址指针进去. delete时先把地址指针delete掉,最后把是地址指针指向左儿子or右儿子

【bzoj3065】带插入区间K小值 替罪羊树套权值线段树

题目描述 从前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理性愉悦一下,查询区间k小值.他每次向它的随从伏特提出这样的问题: 从左往右第x个到第y个跳蚤中,a[i]第k小的值是多少.这可难不倒伏特,他在脑袋里使用函数式线段树前缀和的方法水掉了跳蚤国王的询问.这时伏特发现有些跳蚤跳久了弹跳力会有变化,有的会增大,有的会减少.这可难不倒伏特,他在脑袋里使用树状数组套线段树的方法水掉了跳蚤国王的询问.(orz 主席

BZOJ 1012 [JSOI2008]最大数maxnumber

怎么做都可以题..可以用线段树..可以用平衡树..反正有不少方法 个人比较滋磁单调队列+二分查找的写法,常数小代码少易理解. 具体思路就是维护一个单调不上升的单调队列,然后查询就在这个单调队列中二分查找就好啦~ //这道题,可以算是单调队列的一个妙用了 //当然,做法有很多,可以用线段树.平衡树.树状数组等,其中单调队列最巧妙且最简单 //为什么这道题可以使用单调队列呢? //(即队列中存储的序列必定是下标单调并且数值单调) //如果每个结点没有下标优势(早点入队)也没有数值优势(更大),那么显

[BZOJ3065]带插入区间K小值 解题报告 替罪羊树+值域线段树

刚了一天的题终于切掉了,数据结构题的代码真**难调,这是我做过的第一道树套树题,做完后感觉对树套树都有阴影了......下面写一下做题记录. Portal Gun:[BZOJ3065]带插入区间k小值. 这道题的题面其实都提醒怎么做了,维护区间k小值用值域线段树,但要维护一个插入操作,树状数组套主席树也用不了,那么这道题还剩下平衡树可以搞,那就上平衡树吧. 我这里的做法,因为要维护序列的顺序,所以我这里用到替罪羊树套值域线段树:我们在替罪羊树的每个节点都套一颗值域线段树,记录以该节点为根的子树的

插入区间

给出一个无重叠的按照区间起始端点排序的区间列表. 在列表中插入一个新的区间,你要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间). 样例 插入区间[2, 5] 到 [[1,2], [5,9]],我们得到 [[1,9]]. 插入区间[3, 4] 到 [[1,2], [5,9]],我们得到 [[1,2], [3,4], [5,9]]. 1 /** 2 * Definition of Interval: 3 * public classs Interval { 4 * int star

BZOJ 1090 字符串折叠(区间DP)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1090 题意:字符串AAAAAAAAAABABABCCD的最短折叠为9(A)3(AB)CCD,注意数字的长度和圆括号都算最后长度.求一种折叠方式使得总长度最小. 思路:f[L][R]=min(R-L+1,f[L][i]+f[i+1][R]),另外若[L,R]能由[i+1,R]重复若干次,则也可用折叠后的长度更新f[L][R]. char s[N]; int f[N][N],n; int

【LeetCode-面试算法经典-Java实现】【057-Insert Interval(插入区间)】

[057-Insert Interval(插入区间)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary). You may assume that the intervals were initially sorted according to their star