有生之年第一道浙江省选题(虽然历史久远并且很水

记录每个位置数列的左端点和右端点

维护两颗splay   一颗维护全局最小差值,一颗维护相邻最小差值

对于全局splay:每次插入时记录路径取差值min即可

对于相邻最小差值splay:删除当前位置右端点和下一个位置左端点的差值,,再插入当前值和当前位置右端点差值   和    当前值和下一个位置左端点差值

当我写完200行的程序调到崩溃 后看到了hzwer的程序只有80行时

我是震惊的、、、

看来stl是很好的东西。。

惨不忍睹的代码:

#include<iostream>
#include<cstdio>
using  namespace std;
#include<cmath>
int min1=1e9,min2=1e9,n,m,i,x,y,do12;
string str;
struct la
{int l,r;
}a[900000];
struct tree
{int zhi,cnt;tree *ch[2],*fu;int getwh(){return fu->ch[0]==this?0:1;}void set(int wh,tree *child);
}p[5000000],*null,*root1,*root2;void tree::set(int wh,tree *child)
{ch[wh]=child;if(child!=null)child->fu=this;
} int tot;
tree *xin(int k)
{tree *now=p+ ++tot;now->zhi=k;now->cnt=1;now->ch[0]=now->ch[1]=now->fu=null;return now;
}inline void rotate(tree *&now)
{
tree *fu=now->fu;
tree *ye=now->fu->fu;int wh=now->getwh();
fu->set(wh,now->ch[wh^1]);
now->set(wh^1,fu);now->fu=ye;if(ye!=null)ye->ch[ye->ch[0]==fu?0:1]=now;
}
inline void splay(tree *now,tree *tar)
{
for(;now->fu!=tar;rotate(now))if(now->fu->fu!=tar)
now->getwh()==now->fu->getwh()?rotate(now->fu):rotate(now);if(tar==null)do12==0?root1=now:root2=now;
}
void ins(int k)
{//cout<<k;tree *now=do12==0?root1:root2,*last=null,*newone=xin(k);while(now!=null){last=now;if(do12==0)min1=min(now->zhi-k>0?now->zhi-k:k-now->zhi,min1);
//  cout<<now->zhi<<"  ";
if(now->zhi==k)
{now->cnt++;splay(now,null);return;
}if(k>now->zhi)now=now->ch[1];else now=now->ch[0];}if(last==null)do12==0?root1=newone:root2=newone;if(last->zhi>k)last->set(0,newone);if(last->zhi<k)last->set(1,newone);splay(newone,null);
}inline tree *find(int zhi)
{
tree *now=root2;
while(now!=null)
{  if(now->zhi==zhi)break;if(now->zhi>zhi)now=now->ch[0];else now=now->ch[1];
}
if(now!=null)splay(now,null);return now;
}void del(int value)
{
tree *now = find(value);
if (now == null) return;
if (now->cnt > 1)
{
now->cnt--;
return;
}if (now->ch[0] == null && now->ch[1] == null)
root2 = null;
else if (now->ch[1] == null)
{
now->ch[0]->fu = null;
root2 = now->ch[0];
}
else if (now->ch[0] == null)
{
now->ch[1]->fu = null;
root2 = now->ch[1];
}
else
{
tree *_ = now->ch[0];
while (_->ch[1] != null) _ = _->ch[1];
splay(_, now);
_->set(1, now->ch[1]);
_->fu = null;
root2 = _;
}
}int main()
{
//  freopen("form.in","r",stdin);
//  freopen("form.out","w",stdout);null=p;root1=root2=null;null->ch[0]=null->ch[1]=null->fu=null;null->zhi=0;    scanf("%d%d",&n,&m);for(i=1;i<=n;i++){scanf("%d",&x);do12=0;ins(x);//   cout<<x;a[i].r=a[i].l=x;if(i>1){do12=1;ins(x-a[i-1].l>0?x-a[i-1].l:a[i-1].l-x);//cout<<a[i-1].l-x<<"oo  ";     }   }//cout<<root->ch[1]->zhi;for(i=1;i<=m;i++){cin>>str;if(str=="INSERT"){scanf("%d%d",&x,&y);do12=0;ins(y);do12=1;ins(a[x].r-y>0?a[x].r-y:y-a[x].r);if(x<n){del(a[x].r-a[x+1].l>0?a[x].r-a[x+1].l:a[x+1].l-a[x].r);//    cout<<a[x].r-a[x+1].l<<" p ";ins(a[x+1].l-y>0?a[x+1].l-y:y-a[x+1].l);}   a[x].r=y;}else if(str=="MIN_SORT_GAP"){printf("%d\n",min1);        }else{ tree *now=root2,*last=null;while(now!=null)last=now,now=now->ch[0];printf("%d\n",last->zhi);            }}
}

2017.3.29 报表统计 思考记录相关推荐

  1. 2017.10.29 染色方案 思考记录

    这个题数据特别小,于是想到状压多维之流. 状压是比较麻烦的,虽然也能写,但多维dp明显要好写一些 根据15去设计状态是没有前途的,因为按颜色分一定会MLE 这时就考虑根据5分,这样不同颜色就离散了,就 ...

  2. 2017.10.29 软件安装 思考记录

    这个题一开始卡了,,就是树内的必选和可选分不太清 ,其实很好分,对于一个子树,根是必选,子节点是可选 然后递归保证正确性 可选就是把每个花费都看成一个物品往里背包 注: 1.必选<c[o]的要清 ...

  3. 2017.9.29 数三角形 思考记录

    这个题一看就可以离散. 利用容斥,所以可以用组合数算出所有的三点组合,,再减去在一条线上的点的组合 垂直和水平的好算,斜的就比较繁琐 首先我猜了一个错误的结论:所有直线都可以用左上边界和右下边界的点连 ...

  4. 2017.9.13 序列统计 思考记录

    这题.打表找规律成功的典型,分分钟找到组合数 首先列出展开表,然后找组合数: 要注意的就是连加的组合数可以加起来考虑和,不要老想着对一堆组合数找数字规律, 码: #include<iostrea ...

  5. 2017.3.24 分裂游戏 思考记录

    事先说明:这不是好题解,这只是思考记录 同机房的xp都学博弈了..    感觉还是学学看吧 先来看一下简单的nim: 题目: Alice和Bob放置了N堆不同的石子,编号1..N,第i堆中有A[i]个 ...

  6. 2017.10.24 上升序列 思考记录

    终于有会做的题了... 一开始想用正常的lis ,然后从前往后扫, 由于最优查询区间在序列上是按顺序单调递增的,所以想记录每个点取哪个值跳到哪,这样是n*m logn的 然后发现既然是单调递增的那直接 ...

  7. 2017.10.13 硬币游戏 思考记录

    这个题用特征法可以比较好的找到思路 首先这个题有两个特征:1.正+反=反   反+正=反  正+正=正  反+反=正   应该能很快想到亦或 2.范围1e5  +  上限2^60   应该能很快想到倍 ...

  8. 2017.10.7 括号序列 思考记录

    这个题看起来很简单,但细节比较麻烦.参考完别人的代码后才想出自己的解法的.. 一开始认为已匹配的括号是可以直接消的,所以就只维护了两个变量 但还有区间取反.. 由于和已配对的括号的顺序有关,所以不是很 ...

  9. 2017.9.28 约数研究 思考记录

    这个题一开始可能会想复杂, 然而它需要对答案的贡献进行归类 可以发现,一个约数对其倍数的数贡献是一样的,,所以可以考虑离散 所以直接对于每个数不好求,就可以考虑每个约数的贡献 而每个约数i就有n/i个 ...

最新文章

  1. Prim算法和Dijkstra算法的异同
  2. lhgdialog 4.2.0 正式版发布
  3. 价格走势PHP源码,php多币种区块链交易所源码 存取功能齐全+最新价格走势正常...
  4. golang常用手册:数组、变量作用域、函数
  5. 批量导入sql文件。
  6. 服务器虚拟化win游戏,Win虚拟化之Windows Virtual PC 功能概述
  7. 同时支持EF+Dapper的混合仓储,助你快速搭建数据访问层
  8. 【工具大道】UML的点点滴滴
  9. 凭运气接来的项目,怎样凭本事搞砸?
  10. 使用WAMP5搭建Apache+MySQL+PHP环境
  11. python __getattribute__
  12. 第五十六题(最长公共子串)
  13. 《HBase权威指南》读书笔记6:第六章 可用客户端
  14. 【搜索引擎】提高 Solr 性能
  15. 1197 山区建小学
  16. 一篇挺有意思的文章(转自CSDN)
  17. Timingdesigner timing designer 入门 基础 教程
  18. GridView横向显示 实现图片预览
  19. 色氨酸代谢与肠内外健康稳态
  20. 解决java.net.UnknownHostException: XXXX: 未知的名称或服务 at java.net.Inet6AddressI

热门文章

  1. td外边加div为啥不隐藏_过年炸油饼注意了,秘制配方比例教给你,柔软不吸油,放凉了不硬...
  2. SpringBoot与Mybatis的集成
  3. Conversion of Continuous-Valued Deep Networks to Efficient Event-Driven Networks for Image Classific
  4. 不改变分辨率转换PDF为png图片的方法汇总
  5. LeetCode-148:排序链表
  6. MySQL数据库操作步骤---增删改查
  7. note_maven的概念,作用
  8. mysql重置所有表_Mysql脚本之清空当前数据库下的所有表中数据,并重置自增id
  9. 宕机日志怎么看 thread detail_如何快速过滤出一次请求的所有日志?
  10. selenium 表单提交结果_了解 Selenium 定位方式