splay/fhq-treap 问卷调查反馈—— [JSOI2008]火星人prefix(splay),Strange Queries(fhq-treap)

文章目录

  • [JSOI2008]火星人prefix
  • Strange Queries

[JSOI2008]火星人prefix

BZOJ1014
思路很好想,哈希字符串即可

只是平衡树的码量大

注意因为splay加入哨兵的原因,每个点在平衡树内的排名比真实排名大111(有极小值的占位)

考虑的时候就只在询问的时候考虑,修改的时候忘了就挂了

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define maxn 100005
#define ull unsigned long long
struct node {int son[2], f, val, siz;ull hash;
}t[maxn];
int root, n, Q;
ull mi[maxn];
int val[maxn];
char s[maxn];void read( int &x ) {x = 0; char c = getchar();while( c < '0' or c > '9' ) c = getchar();while( '0' <= c and c <= '9' ) { x = ( x << 1 ) + ( x << 3 ) + ( c ^ 48 ); c = getchar(); }
}void pushup( int x ) {if( ! x ) return;t[x].siz = 1;if( t[x].son[0] ) t[x].siz += t[t[x].son[0]].siz;if( t[x].son[1] ) t[x].siz += t[t[x].son[1]].siz;t[x].hash = mi[t[t[x].son[0]].siz] * t[x].val + t[t[x].son[0]].hash + t[t[x].son[1]].hash * mi[t[t[x].son[0]].siz + 1];
}void rotate( int x ) {int fa = t[x].f;int Gfa = t[fa].f;int k = t[fa].son[1] == x;t[Gfa].son[t[Gfa].son[1] == fa] = x;t[x].f = Gfa;t[fa].son[k] = t[x].son[k ^ 1];if( t[x].son[k ^ 1] ) t[t[x].son[k ^ 1]].f = fa;t[x].son[k ^ 1] = fa;t[fa].f = x;pushup( fa );pushup( x );
}void splay( int x, int goal ) {while( t[x].f ^ goal ) {int fa = t[x].f, Gfa = t[fa].f;if( Gfa ^ goal )	( t[Gfa].son[0] == fa ) ^ ( t[fa].son[0] == x ) ? rotate( x ) : rotate( fa );rotate( x );}if( ! goal ) root = x;
}int build( int now, int l, int r ) {if( l > r ) return 0;int mid = ( l + r ) >> 1;t[mid].hash = val[mid];t[mid].val = val[mid];t[mid].siz = 1;t[mid].f = now;if( l == r ) return l;t[mid].son[0] = build( mid, l, mid - 1 );t[mid].son[1] = build( mid, mid + 1, r );pushup( mid );return mid;
}int find( int x ) {int now = root;while( 1 ) {if( t[t[now].son[0]].siz >= x ) now = t[now].son[0];else if( t[t[now].son[0]].siz + 1 == x ) return now;else x -= t[t[now].son[0]].siz + 1, now = t[now].son[1];}
}int Hash( int x, int y ) {int l = find( x - 1 );int r = find( y + 1 );splay( l, 0 );splay( r, l );return t[t[r].son[0]].hash;
}int main() {mi[0] = 1;for( int i = 1;i < maxn;i ++ ) mi[i] = mi[i - 1] * 27ull;scanf( "%s", s ); read( Q ); val[++ n] = 0;int len = strlen( s );for( int i = 0;i < len;i ++ )val[++ n] = s[i] - 'a' + 1;val[++ n] = 0;root = build( root, 1, n );char opt[5], ch[5]; int x, y;while( Q -- ) {scanf( "%s", opt ); read( x ); x ++;switch( opt[0] ) {case 'Q' : {read( y ); y ++;if( x > y ) swap( x, y );int ans = 0, l = 1, r = n - y;while( l <= r ) {int mid = ( l + r ) >> 1;if( Hash( x, x + mid - 1 ) == Hash( y, y + mid - 1 ) )ans = mid, l = mid + 1;elser = mid - 1;}printf( "%d\n", ans );break;}case 'R' : {scanf( "%s", ch );splay( find( x ), 0 );t[root].val = ch[0] - 'a' + 1;pushup( root );break;}case 'I' : {scanf( "%s", ch );int l = find( x );int r = find( x + 1 );splay( l, 0 );splay( r, l );t[r].son[0] = ++ n;t[n].hash = ch[0] - 'a' + 1;t[n].val = ch[0] - 'a' + 1;t[n].siz = 1;t[n].f = r;splay( n, 0 );break;}}}return 0;
}

Strange Queries

CODECHEF

显然每个点只会与其左右相邻点连边

这种区间内合并的问题,是非常常见的类似线段树维护区间最大子段和的感觉

但是这是动态维护,所以用平衡树就行

具体而言,对于每一段区间

  • 维护区间左端点还没有连线的最小值l_
  • 右端点还没有连线的最小值_r
  • 左右端点都没有连线的最小值l__r
  • 区间每个点都至少有一条连线的最小值ans
  • 维护区间左右端点的权值val_l val_r

考虑两个区间的合并

  • ans

    • 两个区间的答案相加

    • 左区间的右端点和右区间的左端点都没连线,此时在两点之间连线

      花费为右区间左端点的权值与左区间右端点的权值差

  • l_

    • 左区间仍只有左端点没连线l_,右区间均连线ans
    • 左区间两端都没连线l__r,右区间左端点没连线l_,同样两区间可以连线
  • _r

    • 右区间只有右端点没连线_r,左区间均连线ans
    • 右区间两端都没连线l__r,左区间右端点没连线_r,两区间连线
  • l__r

    • 左区间只有左端点没连线l_,右区间只有右端点没连线_r
    • 左区间和右区间两端都没连线l__r,此时左区间右端点和右区间左端点连线

fhq-treap维护即可

#include <cstdio>
#include <algorithm>
using namespace std;
#define int long long
#define maxn 200005
#define inf 1e9
struct node {int key, lson, rson, val, val_l, val_r, l_, _r, l__r, ans;node(){}node( int v ) {ans = inf;key = rand();val = val_l = val_r = v;lson = rson = l_ = _r = l__r = 0;}
}t[maxn];
int T, n, Q, root, cnt;
int a[maxn];void pushup( node lst, node nxt, int &ans, int &l_, int &_r, int &l__r ) {if( lst.val_l <= -inf and lst.val_r >= inf ) {ans = nxt.ans;l_ = nxt.l_;_r = nxt._r;l__r = nxt.l__r;return;}if( nxt.val_l <= -inf and nxt.val_r >= inf ) {ans = lst.ans;l_ = lst.l_;_r = lst._r;l__r = lst.l__r;return;}int w = nxt.val_l - lst.val_r;ans = min( lst.ans + nxt.ans, lst._r + nxt.l_ + w );l_ = min( lst.l_ + nxt.ans, lst.l__r + nxt.l_ + w );_r = min( nxt._r + lst.ans, nxt.l__r + lst._r + w );l__r = min( lst.l_ + nxt._r, lst.l__r + nxt.l__r + w );
}void pushup( int x ) {t[x].val_l = t[x].val_r = t[x].val;t[x].l_ = t[x]._r = t[x].l__r = 0;t[x].ans = inf;if( t[x].lson ) {pushup( t[t[x].lson], t[x], t[x].ans, t[x].l_, t[x]._r, t[x].l__r );t[x].val_l = t[t[x].lson].val_l;}if( t[x].rson ) {pushup( t[x], t[t[x].rson], t[x].ans, t[x].l_, t[x]._r, t[x].l__r );t[x].val_r = t[t[x].rson].val_r;}
}void split( int now, int val, int &x, int &y ) {if( ! now ) x = y = 0;else {if( t[now].val <= val ) {x = now;split( t[now].rson, val, t[now].rson, y );pushup( x );}else {y = now;split( t[now].lson, val, x, t[now].lson );pushup( y );}}
}int merge( int x, int y ) {if( ! x or ! y ) return x + y;if( t[x].key < t[y].key ) {t[x].rson = merge( t[x].rson, y );pushup( x );return x;}else {t[y].lson = merge( x, t[y].lson );pushup( y );return y;}
}signed main() {t[0].val_l = -inf, t[0].val_r = inf;scanf( "%lld", &T );while( T -- ) {scanf( "%lld %lld", &n, &Q );root = 0;for( int i = 1;i <= n;i ++ ) scanf( "%lld", &a[i] );sort( a + 1, a + n + 1 );for( int i = 1;i <= n;i ++ ) {t[i] = node( a[i] );root = merge( root, i );}cnt = n;int opt, x, l, r, L, R;while( Q -- ) {scanf( "%lld %lld", &opt, &x );if( opt & 1 ) {split( root, x, l, r );t[++ cnt] = node( x );root = merge( l, merge( cnt, r ) );}else {split( root, x, l, r );split( l, x - 1, L, R );root = merge( L, r );}printf( "%lld\n", t[root].ans >= inf ? 0 : t[root].ans );}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317137.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AcWing 1091. 理想的正方形

AcWing 1091. 理想的正方形 题意&#xff1a; 有一个 ab 的整数组成的矩阵&#xff0c;现请你从中找出一个 nn 的正方形区域&#xff0c;使得该区域所有数中的最大值和最小值的差最小。 题解&#xff1a; 前置知识&#xff1a;已经学会了一维的单调队列优化dp 在本题中要求…

美好生活从撸好代码开始

楔子 昨天晚上做了个梦&#xff0c;梦到老板对我说了一番道理&#xff0c;他说对家庭要用爱心&#xff0c;做人对社会要有包容心&#xff0c;对工作要有责任心&#xff0c;对老板要有同理心。 我深以为然。现在的老板确实太不容易了&#xff0c;尤其是作为一家承载梦想&#xf…

模板:莫比乌斯反演(数论)

文章目录前言整除分块代码积性函数线性筛狄利克雷卷积莫比乌斯反演trick所谓莫比乌斯反演&#xff0c;就是莫比乌斯进行的反演 &#xff08;逃&#xff09; 前言 在一些需要整除的式子和 gcd⁡,lcm⁡\gcd,\operatorname{lcm}gcd,lcm 等问题中发挥作用。 整除分块 整除分块是…

[TJOI2013]拯救小矮人(反悔贪心证明),「ICPC World Finals 2019」Hobson 的火车(基环树,差分)

2021-09-07 test[TJOI2013]拯救小矮人「ICPC World Finals 2019」Hobson 的火车[TJOI2013]拯救小矮人 luogu4823 考试题目的数据加强为2e5&#xff0c;所以此题做法应为O(nlog⁡n)O(n\log n)O(nlogn)的反悔贪心 这种有多元属性&#xff0c;选择最优的问题 如果发现简单的贪心…

Dotnet全平台下APM-Trace探索

随着支撑的内部业务系统越来越多&#xff0c;向着服务化架构进化&#xff0c;在整个迭代过程中&#xff0c;会逐渐暴露出以下问题。传统依赖于应用服务器日志等手段的排除故障原因的复杂度越来越高&#xff0c;传统的监控服务已经无法满足需求。终端--> Nginx --> IIS --…

生成函数全家桶

文章目录有用的式子1.&#xff08;牛顿二项式定理&#xff09;2.普通生成函数&#xff08;OGF&#xff09;常见封闭形式&#xff1a;1.2.3.4.指数生成函数&#xff08;EGF&#xff09;排列与圆排列有用的式子 1.&#xff08;牛顿二项式定理&#xff09; 我们把组合数的定义推…

2020年牛客多校第五场C题-easy(纯组合计数不要生成函数的做法)

文章目录descriptionsolutioncodedescription 有TTT组测试数据 对于两个长度为KKK的数列{a}\{a\}{a}和{b}\{b\}{b}&#xff0c;满足∑i1KaiN,∑i1KbiM\sum_{i1}^Ka_iN,\sum_{i1}^Kb_iM∑i1K​ai​N,∑i1K​bi​M 对于这两个数列&#xff0c;定义权值为P∏i1Kmin⁡(ai,bi)P\p…

部署Chart应用并使用.net core读取Kubernetes中的configMap

上一篇文章讲了 k8s使用helm打包chart并上传到腾讯云TencentHub&#xff0c;今天就讲一下使用Helm部署应用并使用configMap代替asp.net core 中的appsettings.json文件。把Chart上传到TencentHub之后&#xff0c;我们就可以通过腾讯云的容器服务&#xff0c;直接部署Helm应用了…

Vases and Flowers HDU - 4614

Vases and Flowers HDU - 4614 题意: 一排空瓶子放花&#xff0c;操作1&#xff1a;从第x个瓶子开始放花&#xff0c;放y朵花&#xff0c;每个瓶子就一朵花&#xff0c;如果碰到已经有花的瓶子跳过这个瓶子&#xff0c;看下一个&#xff0c;当花没了&#xff0c;或者瓶子不够…

洛谷P3327:[SDOI2015]约数个数和(莫比乌斯反演)

枚举倍数的一种灵活的变形&#xff1a;g(d)∑d∣inf(i)∑i1⌊nd⌋f(i⋅d)g(d)\sum_{d|i}^nf(i)\sum_{i1}^{\lfloor\frac{n}{d}\rfloor}f(i\cdot d)g(d)∑d∣in​f(i)∑i1⌊dn​⌋​f(i⋅d) 很显然&#xff0c;但有时能发挥大作用。 其实本质还是要理解西格玛究竟是在算什么 解析…

EFCore Lazy Loading + Inheritance = 干净的数据表 (一)

前言α角 与 β角关于α角 与 β角的介绍&#xff0c;请见上文 如何用EFCore Lazy Loading实现Entity Split。本篇会继续有关于β角的彩蛋在等着大家去发掘。/斜眼笑其他本篇的程序&#xff0c;可以在 https://github.com/kentliu2007/EFCoreDemo/tree/master/InheritanceWithE…

专题突破之反悔贪心——建筑抢修,Cow Coupons G, Voting (Hard Version),Cardboard Box

文章目录[JSOI2007]建筑抢修[USACO12FEB]Cow Coupons GCF1251E2 Voting (Hard Version)CF436E Cardboard Box[JSOI2007]建筑抢修 luogu4053 将建筑按照结束时间从小到大排序 然后记录一下已经修理的建筑总共的花费时间 如果花费时间加上现在这个建筑的修建时间超过了这个建…

Max Sum Plus Plus HDU - 1024

Max Sum Plus Plus HDU - 1024 题意&#xff1a; 给你n个数&#xff0c;选m个子段&#xff0c;各个子段连续且不相交&#xff0c;长度可以为1&#xff0c;设maxn为各个子区间的和&#xff0c;求最大的maxn。 题解&#xff1a; 设dp[i][j]表示前j个数分成i段的最大值 对于第…

模板:杜教筛(莫比乌斯反演、数论)

所谓杜教筛&#xff0c;就是dms教给我们的筛 &#xff08;逃&#xff09; 前言 与其说算法&#xff0c;不如说是技巧。 可以在低于线性的时间复杂度&#xff08;准确的说是 O(n23)O(n^{\frac{2}{3}})O(n32​)&#xff09;内完成对积性函数的前缀和计算。 解析 考虑求函数 f…

程序员过关斩将--快速迁移10亿级数据

菜菜呀&#xff0c;咱们业务BJKJ有个表数据需要做迁移程序员主力 Y总现在有多少数据&#xff1f;菜菜大约21亿吧&#xff0c;2017年以前的数据没有业务意义了&#xff0c;给你半天时间把这个事搞定&#xff0c;绩效给你A程序员主力 Y总有绩效奖金吗&#xff1f;菜菜钱的事你去问…

[2021-09-09 T2] 就差⼀点——冒泡排序和反序表之间不为人知的秘密

就差一点解题报告descriptionsolutioncodedescription 题目描述 冒泡排序是⼀个简单的排序算法&#xff0c;其时间复杂度为O(n2)O(n^2)O(n2) 有⼀个大小为nnn的排列p1,...,pnp_1,...,p_np1​,...,pn​&#xff0c;⼩明想对这个排列进⾏冒泡排序&#xff0c;于是写了下⾯这份…

CodeForces - 76E Points

CodeForces - 76E Points 题意&#xff1a; 给你n个点的坐标&#xff0c;求所有一对点之间的距离的平方和 n<100000 题解&#xff1a; 直接暴力n2肯定不行&#xff0c;我们把这个的式子列出来&#xff1a; 代码&#xff1a; #include<bits/stdc.h> #define deb…

模板:Miller-RabinPollard-Rho(数论)

所谓 pollard-rho&#xff0c;就是泼辣的肉 &#xff08;逃&#xff09; 前言 许多题解都把这两个算法放在了一起。 那我也这样办吧&#xff01; miller-rabin可以在优秀的时间复杂度内完成对一个数的素性检测。 而pollard-rho则是立足于Miler-rabin之上&#xff0c;可以在 …

Asp.NetCore轻松学-部署到 Linux 进行托管

前言上一篇文章介绍了如何将开发好的 Asp.Net Core 应用程序部署到 IIS&#xff0c;且学习了进程内托管和进程外托管的区别&#xff1b;接下来就要说说应用 Asp.Net Core 的特性&#xff08;跨平台&#xff09;&#xff0c;将 .NetCore 部署到 Linux 中&#xff0c;主流的 Linu…

DevC++ 用C语言的多线程 实现简单的客户端和服务器

知识来源一&#xff1a; 使用Dev-C实现简单的客户端和服务器-CSDN博客 此先生的博客使用的是win32 SDK来创建多线程&#xff0c;然后鄙人对这个版本的多线程细节不明。于是又重新用C语言的线程替代win32API,以此继续学习服务器代码。 知识来源二&#xff1a;DevC 多线程创建…