博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SPOJ 4487 Can you answer these queries VI
阅读量:6892 次
发布时间:2019-06-27

本文共 4449 字,大约阅读时间需要 14 分钟。

SPOJ_4487

    其实这个题目和GSS1是差不多的,只不过由于有增加和删除的操作,这样用线段树就搞不定了,因此可以维护一个splay来实现这些操作。

    但是一开始我写出的程序总是TLE,而和网上一些AC的程序对照之后发现无非有两点很不同的地方,一个是他们都用了结构体,另一个是他们都用了指针。在百思不得其解之际,我把以前的若干个数组仿照一个AC的程序写成了结构体,就像下面这样:

struct Splay{    int left, right, pre, size, sum, mc, key, lc, rc;    #define left(x) sp[x].left    #define right(x) sp[x].right    #define pre(x) sp[x].pre    #define size(x) sp[x].size    #define sum(x) sp[x].sum    #define mc(x) sp[x].mc    #define key(x) sp[x].key    #define lc(x) sp[x].lc    #define rc(x) sp[x].rc}sp[MAXD];

    尼玛……居然AC了……

    不知道这是不是也算底层优化……各位TLE了的同仁不妨试试写成结构体……

#include
#include
#include
#define MAXD 200010#define INF 0x3f3f3f3fint N, T, a[MAXD], node;struct Splay{ int left, right, pre, size, sum, mc, key, lc, rc; #define left(x) sp[x].left #define right(x) sp[x].right #define pre(x) sp[x].pre #define size(x) sp[x].size #define sum(x) sp[x].sum #define mc(x) sp[x].mc #define key(x) sp[x].key #define lc(x) sp[x].lc #define rc(x) sp[x].rc}sp[MAXD];int Max(int x, int y){ return x > y ? x : y;}void newnode(int &cur, int v){ cur = ++ node; size(cur) = 1; key(cur) = sum(cur) = mc(cur) = lc(cur) = rc(cur) = v; left(cur) = right(cur) = 0;}void update(int cur){ int ls = left(cur), rs = right(cur); size(cur) = size(ls) + size(rs) + 1; sum(cur) = sum(ls) + sum(rs) + key(cur); mc(cur) = Max(rc(ls), 0) + key(cur) + Max(lc(rs), 0); mc(cur) = Max(mc(cur), Max(mc(ls), mc(rs))); lc(cur) = Max(lc(ls), sum(ls) + key(cur) + Max(lc(rs), 0)); rc(cur) = Max(rc(rs), sum(rs) + key(cur) + Max(rc(ls), 0));}void leftrotate(int cur){ int k = right(cur), fa = pre(cur); right(cur) = left(k); pre(right(cur)) = cur; left(k) = cur; pre(cur) = k; pre(k) = fa; right(fa) == cur ? right(fa) = k : left(fa) = k; update(cur);}void rightrotate(int cur){ int k = left(cur), fa = pre(cur); left(cur) = right(k); pre(left(cur)) = cur; right(k) = cur; pre(cur) = k; pre(k) = fa; right(fa) == cur ? right(fa) = k : left(fa) = k; update(cur);}void build(int &cur, int x, int y, int fa){ int mid = (x + y) >> 1; newnode(cur, a[mid]); pre(cur) = fa; if(x == y) return ; if(x < mid) build(left(cur), x, mid - 1, cur); if(mid < y) build(right(cur), mid + 1, y, cur); update(cur);}void splay(int x, int goal){ int y, z; for(;;) { if((y = pre(x)) == goal) break; if((z = pre(y)) == goal) right(y) == x ? leftrotate(y) : rightrotate(y); else { if(right(z) == y) right(y) == x ? (leftrotate(z), leftrotate(y)) : (rightrotate(y), leftrotate(z)); else left(y) == x ? (rightrotate(z), rightrotate(y)) : (leftrotate(y), rightrotate(z)); } } if(goal == 0) T = x; update(x);}void rotateto(int k, int goal){ int cur = T, n; for(;;) { n = size(left(cur)) + 1; if(n == k) break; if(k < n) cur = left(cur); else k -= n, cur = right(cur); } splay(cur, goal);}void init(){ int i; for(i = 1; i <= N; i ++) scanf("%d", &a[i]); node = size(0) = sum(0) = 0; mc(0) = lc(0) = rc(0) = -INF; newnode(T, 0), newnode(right(T), 0); pre(right(T)) = T; key(T) = key(right(T)) = 0; if(N) build(left(right(T)), 1, N, right(T)); update(right(T)), update(T);}void Delete(int x){ rotateto(x, 0), rotateto(x + 2, T); left(right(T)) = 0; update(right(T)), update(T);}void Insert(int x, int y){ rotateto(x, 0), rotateto(x + 1, T); newnode(left(right(T)), y); pre(node) = right(T); update(right(T)), update(T);}void Replace(int x, int y){ rotateto(x + 1, 0); key(T) = y; update(T);}void Query(int x, int y){ rotateto(x, 0), rotateto(y + 2, T); printf("%d\n", mc(left(right(T))));}void solve(){ int i, q, x, y; char op[5]; scanf("%d", &q); for(i = 0; i < q; i ++) { scanf("%s", op); if(op[0] == 'D') { scanf("%d", &x); Delete(x); } else { scanf("%d%d", &x, &y); if(op[0] == 'I') Insert(x, y); else if(op[0] == 'R') Replace(x, y); else Query(x, y); } }}int main(){ while(scanf("%d", &N) == 1) { init(); solve(); } return 0;}

转载地址:http://hdhbl.baihongyu.com/

你可能感兴趣的文章
[图] Google 迎来全新 Logo 启用无衬线字体
查看>>
《OSPF和IS-IS详解》一2.5 路径决策过程
查看>>
如何将 Vim 打造成一个成熟的 IDE
查看>>
Jquery动态添加行
查看>>
微软已修复危险异常的 NSA Shadow Brokers 漏洞
查看>>
《Adobe After Effects CS6中文版经典教程》——2.2 使用Adobe Bridge导入素材
查看>>
用 Freemarker 生成 word 文档
查看>>
SpriteBuilder —— 跨平台游戏开发工具
查看>>
python xpath selenium
查看>>
《VMware vSphere 6.0虚拟化架构实战指南》——2.4 全新安装后的必要配置
查看>>
《Oracle SQL疑难解析》——1.15 启用其他排序和比较选项
查看>>
Mysql Connector 5.1 好用的新特性
查看>>
移动App性能测评与优化2.2.4 优化方法四:云省电策略
查看>>
Java中Redis的使用教程
查看>>
从洞穴壁画说起,信息可视化图表发展的迷人历史
查看>>
《Web前端开发精品课 HTML与CSS进阶教程》——2.8 HTML5舍弃的标签
查看>>
4 个你需要了解的容器网络工具
查看>>
利用ModSecurity防御暴力破解
查看>>
《libGDX移动游戏开发从入门到精通》一1.2 搭建libGDX开发环境
查看>>
《游戏大师Chris Crawford谈互动叙事》一9.6 互动小说机理剖析
查看>>