2017.3.29 报表统计 思考记录
有生之年第一道浙江省选题(虽然历史久远并且很水)
记录每个位置数列的左端点和右端点
维护两颗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 报表统计 思考记录相关推荐
- 2017.10.29 染色方案 思考记录
这个题数据特别小,于是想到状压多维之流. 状压是比较麻烦的,虽然也能写,但多维dp明显要好写一些 根据15去设计状态是没有前途的,因为按颜色分一定会MLE 这时就考虑根据5分,这样不同颜色就离散了,就 ...
- 2017.10.29 软件安装 思考记录
这个题一开始卡了,,就是树内的必选和可选分不太清 ,其实很好分,对于一个子树,根是必选,子节点是可选 然后递归保证正确性 可选就是把每个花费都看成一个物品往里背包 注: 1.必选<c[o]的要清 ...
- 2017.9.29 数三角形 思考记录
这个题一看就可以离散. 利用容斥,所以可以用组合数算出所有的三点组合,,再减去在一条线上的点的组合 垂直和水平的好算,斜的就比较繁琐 首先我猜了一个错误的结论:所有直线都可以用左上边界和右下边界的点连 ...
- 2017.9.13 序列统计 思考记录
这题.打表找规律成功的典型,分分钟找到组合数 首先列出展开表,然后找组合数: 要注意的就是连加的组合数可以加起来考虑和,不要老想着对一堆组合数找数字规律, 码: #include<iostrea ...
- 2017.3.24 分裂游戏 思考记录
事先说明:这不是好题解,这只是思考记录 同机房的xp都学博弈了.. 感觉还是学学看吧 先来看一下简单的nim: 题目: Alice和Bob放置了N堆不同的石子,编号1..N,第i堆中有A[i]个 ...
- 2017.10.24 上升序列 思考记录
终于有会做的题了... 一开始想用正常的lis ,然后从前往后扫, 由于最优查询区间在序列上是按顺序单调递增的,所以想记录每个点取哪个值跳到哪,这样是n*m logn的 然后发现既然是单调递增的那直接 ...
- 2017.10.13 硬币游戏 思考记录
这个题用特征法可以比较好的找到思路 首先这个题有两个特征:1.正+反=反 反+正=反 正+正=正 反+反=正 应该能很快想到亦或 2.范围1e5 + 上限2^60 应该能很快想到倍 ...
- 2017.10.7 括号序列 思考记录
这个题看起来很简单,但细节比较麻烦.参考完别人的代码后才想出自己的解法的.. 一开始认为已匹配的括号是可以直接消的,所以就只维护了两个变量 但还有区间取反.. 由于和已配对的括号的顺序有关,所以不是很 ...
- 2017.9.28 约数研究 思考记录
这个题一开始可能会想复杂, 然而它需要对答案的贡献进行归类 可以发现,一个约数对其倍数的数贡献是一样的,,所以可以考虑离散 所以直接对于每个数不好求,就可以考虑每个约数的贡献 而每个约数i就有n/i个 ...
最新文章
- Prim算法和Dijkstra算法的异同
- lhgdialog 4.2.0 正式版发布
- 价格走势PHP源码,php多币种区块链交易所源码 存取功能齐全+最新价格走势正常...
- golang常用手册:数组、变量作用域、函数
- 批量导入sql文件。
- 服务器虚拟化win游戏,Win虚拟化之Windows Virtual PC 功能概述
- 同时支持EF+Dapper的混合仓储,助你快速搭建数据访问层
- 【工具大道】UML的点点滴滴
- 凭运气接来的项目,怎样凭本事搞砸?
- 使用WAMP5搭建Apache+MySQL+PHP环境
- python __getattribute__
- 第五十六题(最长公共子串)
- 《HBase权威指南》读书笔记6:第六章 可用客户端
- 【搜索引擎】提高 Solr 性能
- 1197 山区建小学
- 一篇挺有意思的文章(转自CSDN)
- Timingdesigner timing designer 入门 基础 教程
- GridView横向显示 实现图片预览
- 色氨酸代谢与肠内外健康稳态
- 解决java.net.UnknownHostException: XXXX: 未知的名称或服务 at java.net.Inet6AddressI
热门文章
- td外边加div为啥不隐藏_过年炸油饼注意了,秘制配方比例教给你,柔软不吸油,放凉了不硬...
- SpringBoot与Mybatis的集成
- Conversion of Continuous-Valued Deep Networks to Efficient Event-Driven Networks for Image Classific
- 不改变分辨率转换PDF为png图片的方法汇总
- LeetCode-148:排序链表
- MySQL数据库操作步骤---增删改查
- note_maven的概念,作用
- mysql重置所有表_Mysql脚本之清空当前数据库下的所有表中数据,并重置自增id
- 宕机日志怎么看 thread detail_如何快速过滤出一次请求的所有日志?
- selenium 表单提交结果_了解 Selenium 定位方式