HDU_1754

这个算是我的splay的处女作了,要不是为了练splay真心不想把这个可以用线段树轻松搞定的题敲得这么复杂……努力了一下午+半个晚上终于把splay的基本操作搞懂了。

其实感觉splay的旋转操作和SBT差不多,只不过多了人字旋转和一字旋转,这样要比单一从底向上旋转更能维护splay的树高。

另外对于一个问题说一点自己的看法:splay要写一个rotate_to的函数,就是将某个位置的元素旋转到goal的下方,而为什么是下方而不是恰好旋转到goal呢?因为如果是设定恰好旋转到goal的话,最后一步会把goal旋转跑,就没办法判定是否旋转到位了,所以要写成旋转到goal的下方,这样goal就是固定不动的了。也正是因为这样,根结点T的父节点pre[T]要置为0,这样就能保证splay上的任意一个位置都有其“上方”的一个位置作为goal。

#include<stdio.h>#include<string.h>#define MAXD 200010#define INF 0x3f3f3f3fint N, M, T, node, left[MAXD], right[MAXD], size[MAXD], key[MAXD], max[MAXD], pre[MAXD], a[MAXD];int getmax(int x, int y, int z){int t = x > y ? x : y;return t > z ? t : z;}void update(int x){    size[x] = size[left[x]] + size[right[x]] + 1;    max[x] = getmax(key[x], max[left[x]], max[right[x]]);}void left_rotate(int x){int y = right[x], p = pre[x];    right[x] = left[y];if(right[x])        pre[right[x]] = x;    left[y] = x;    pre[x] = y;    pre[y] = p;if(p != 0)        right[p] == x ? right[p] = y : left[p] = y;else        T = y;    update(x);}void right_rotate(int x){int y = left[x], p = pre[x];    left[x] = right[y];if(left[x])        pre[left[x]] = x;    right[y] = x;    pre[x] = y;    pre[y] = p;if(p != 0)        right[p] == x ? right[p] = y : left[p] = y;else        T = y;    update(x);}void add(int &T, int v){    T = ++ node;    key[T] = max[T] = v;    size[T] = 1;    left[T] = right[T] = 0;}void build(int &T, int x, int y, int fa){int mid = (x + y) / 2;    add(T, a[mid]);    pre[T] = fa;if(x < mid)        build(left[T], x, mid - 1, T);if(mid < y)        build(right[T], mid + 1, y, T);    update(T);}void init(){int i, j, k;    T = node = left[0] = right[0] = size[0] = 0;    max[0] = key[0] = -INF;    add(T, -INF), add(right[T], -INF);    pre[T] = 0, pre[node] = T;    size[T] = 2;for(i = 1; i <= N; i ++)        scanf("%d", &a[i]);    build(left[right[T]], 1, N, right[T]);    update(right[T]), update(T);}void splay(int x, int goal){int y, z;for(;;)    {if((y = pre[x]) == goal)break;if((z = pre[y]) == goal)            right[y] == x ? left_rotate(y) : right_rotate(y);else        {if(right[z] == y)            {if(right[y] == x)                    left_rotate(z), left_rotate(y);else                    right_rotate(y), left_rotate(z);            }else            {if(left[y] == x)                    right_rotate(z), right_rotate(y);else                    left_rotate(y), right_rotate(z);            }        }    }    update(x);}void rotate_to(int k, int goal){int i = T, n;for(;;)    {        n = size[left[i]] + 1;if(n == k)break;if(k < n)            i = left[i];else        {            k -= n;            i = right[i];        }    }    splay(i, goal);}void query(int x, int y){    rotate_to(x, 0), rotate_to(y + 2, T);    printf("%d\n", max[left[right[T]]]);}void refresh(int x, int v){    rotate_to(x + 1, 0);    key[T] = v;    update(T);}void solve(){int i, j, k, x, y;char b[5];for(i = 0; i < M; i ++)    {        scanf("%s%d%d", b, &x, &y);if(b[0] == 'Q')            query(x, y);else            refresh(x, y);    }}int main(){while(scanf("%d%d", &N, &M) == 2)    {        init();        solve();    }return 0;}

HDU 1754 I Hate It相关推荐

  1. 暑期集训5:并查集 线段树 练习题G: HDU - 1754

    2018学校暑期集训第五天--并查集 线段树 练习题G  --   HDU - 1754 I Hate It 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.  这让 ...

  2. 【线段树】【模板】讲解 + 例题1 HDU - 1754 I Hate It (点修改分数)+ 例题二 POJ - 3468 A Simple Problem with Integers(区间加值)

    [线段树][模板]讲解 + 例题1 HDU - 1754 I Hate It (点修改分数)+ 例题二 POJ - 3468 A Simple Problem with Integers(区间加值) ...

  3. hdu 1754/zstu 3121 I Hate It(线段树)

    http://acm.hdu.edu.cn/showproblem.php?pid=1754 http://acm.zstu.edu.cn:8080/JudgeOnline/showproblem?p ...

  4. 题解报告:hdu 1754 I Hate It(线段树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754 Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某 ...

  5. 【HDU - 1754】I Hate It (线段树模板 单点覆盖更新+区间最大值查询)

    题干: 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.  这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当 ...

  6. hdu 1754 I Hate It(线段树之 单点更新+区间最值)

    I Hate It                                                                             Time Limit: 90 ...

  7. I Hate It (HDU 1754)

    Problem 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.  这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的 ...

  8. Hdu 1754 . I Hate It

    Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求, ...

  9. HDU 1754 I Hate It(线段树单点更改、区间查找最大值)

    Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求, ...

最新文章

  1. Putdb WebBuilder 6.5 正式版本发布
  2. js 移动端 滑块验证码插件_VUE技术详解,Vue.js从入门到精通
  3. sweetalert使用随笔
  4. Qt Creator使用补充工具栏
  5. python群发邮箱软件下载_用python群发电子邮件
  6. jq之$(“ul li:first“)
  7. Win7系统浏览器的兼容模式如何设置
  8. keil如何添加h文件_如何给PDF文件添加水印?分享给PDF批量加水印的方法
  9. 【基础】算法时空复杂度【OI缩水版】
  10. HDF5: Python 的h5py与Julia的HDF5库读取效率比较,不差上下
  11. Java关键字protected详解
  12. ros学习-中国大学MOOC---《机器人操作系统入门》课程讲义
  13. 串口与并口有什么区别?
  14. web项目中添加图标(unicode引用方式)
  15. 金士顿100 G3U盘写保护无法格式化的解决方法记录
  16. word中插入题注 表1 图1
  17. eclipse中项目运行时报错之 Compilation error解决方法
  18. 游戏任务剧情布局系统分析
  19. RSA的dp泄露 —— 【WUST-CTF2020】leak
  20. Python绘图一条龙--大小/坐标/标签/多图布局/配色方案等

热门文章

  1. SAP MM PR Release Strategy 配置中Classification数据的维护
  2. (超级详细)numpy与torch用法对比手册
  3. 从复现人类智能到挑战AI大工程,智能计算正经历什么考验?
  4. 为啥辣椒会辣得人嘴巴疼?这个问题竟然和今年诺奖有关
  5. AI不会很快取代作家——但未来可能比你想象的更近
  6. 刚刚,我国智能科学技术最高奖揭晓!
  7. 脑机接口简史——假如这篇推送是你靠意念打开的
  8. 中国科学家发现恐惧情绪的新环路
  9. 拯救顽疾大作战!IDC绘中国医疗AI生态图谱,英伟达献医疗影像新杀器
  10. GPU、FPGA芯片成为增强机器学习能力的“左膀右臂”