AC题目简解-数据结构
A - Japan POJ 3067
要两条路有交叉,(x1,y1)(x2,y2)那么需要满足:(x1-x2)*(y1-y2)<0判断出这是求逆序的问题
树状数组求逆序,先通过自定义的比较器实现按照一种元素排序,然后再逐次查询和add来获取结果
B - Ping pong POJ 3928
分析裁判的位置,则可判断求逆序问题。对每个点的裁判,他能举办的比赛场数为左弱*右强+左强*右弱,通过正序和倒序两次插入和查询累加得最终结果
C - Balanced Lineup POJ 3274
用线段树A的==
D - Mobile phones POJ 1195
二维树状数组,理解了一维的,二维的也很好理解。一维是前面线上的和,二维的是前面矩形的和。算目标范围也很明确,就是减掉两个矩形的加上多减的一个正方形,维护跟一维的也基本一样
E - MooFest POJ 1990
首先,最重要的是理解好题意:1.两头牛只要通讯一次就行。每次的耗费是distance*max(v[i],v[j])2.按power还是按position排序。我选的是power,因为position没有重复值。排序这个想法跟Japan那道题是一样的。
说下思路:
按照power的升序排好后,依次加入树状数组,每加一次,就查一次,累计一次ans。这个是标准的数组数组的解法。
但是,树状数组的索引值是牛的坐标的索引值,这就意味着,能力比当前低的牛可能会排到其后面,而且,它们的距离值是需要的。
这就要求,既能记录到前面有多少头牛,又能记录他们的距离和,后面有多少头牛,和他们的距离和。
而想到,加点的时候,有一个i来控制,也就是说,在i前面 有 a头牛的话,后面有i-a头,顺着这个想法,那也可以统计坐标和啊。前面加了i头牛,总共的坐标和distance可以累加出来,而在i的坐标前面有(这里的有和加是两回事)的牛的坐标和为sum(data[i].position-1).dist,那么坐标在第i个的后面,而且power比第i个的小的坐标和就是distance-sum(data[i].position-1).dist
因为是按照power排的序,所以在i前面加的power都比第i个小,也就是说,如果之前加的和第i个通讯的话,取的power指肯定是第i个的
公式:
这里的sum(data[i].position).num表示坐标在data[i].position前面的牛的个数
sum(data[i].position-1).dist i的坐标前面有(这里的有和加是两回事)的牛的坐标和
ans+=(sum(data[i]-1).num*data[i].position - sum(data[i].position-1).dist + (distance-sum(data[i].position-1).dist - (i-1-sum(data[i]-1).num)*data[i].position ))*data[i].power
可以化简为
int x1=sum(data[i]-1).num,x2=sum(data[i].position-1).dist;
ans+=(data[i].position*(x1*2-i+1) - x2*2 + distance)*data[i].power;
然后distance累加再把当前点add进树状数组就ok了
A-敌兵布阵 hdu 1166
标准的线段树 小细节:a*2+1 = a<<1|1
开空间的时候,要开MAX<<2
switch(x){
case 1: ... break;
}
B - I Hate It HDU 1754
基本和A没有很大的区别,只是和变成了最大值
C - A Simple Problem with Integers HDU 3468
线段树区间更新,模板
lazy标记
注意:pushup()出现在:build()的最后,updata()的最后
D - Count Color POJ 2777
线段树的灵活应用和位运算的技巧
很容易想到用key来存染的颜色,存的技巧:位运算(学习笔记)
区间点的key则可以通过左右孩子的或运算来获得。注意,按照二进制的方法传进颜色的时候,传的是处理过的color
E - Hotel POJ 3667
询问区间中满足条件的连续最长区间,所以PushUp的时候需要对左右儿子的区间进行合并
查询的时候:
if(左儿子的center >= 要查询的长度)return 在左儿子查询
else
if(左儿子的右+右儿子的左 >=要查询的长度)return 左儿子的左的起始坐标
else return 在右儿子查询
pushup的时候:
如果左儿子是空的,那么节点的左=左儿子+右儿子的左
如果右儿子是空的,那么节点的右=右儿子+左儿子的右
节点的center=max(左右儿子的center,左儿子的右加上右儿子的左)
其他就是一些细节问题了,不要把自己搞混就好
F - Holedox Eating HDU 4302
小虫子吃蛋糕,注意几个要点:1.虫子会采取就近原则,如果等距就按原来的方向2可能会没有蛋糕
线段树版:
左右来存此区间最左端和最右端的蛋糕的坐标,pushup的时候有以下情况:1左右儿子都空,那就都空2左儿子空,右儿子非空,3左儿子非空,右儿子空和非空 共四种
查询的时候:1左右儿子有一个空,那就再另一个里查找,都空的情况在query以前就判断2距左儿子的右 与 距右儿子的左 ,跟谁近就query哪个,等距就按原方向
一些细节:从0开始的,可以把题目中的坐标都+1
TreeSet版:
一个set存有蛋糕的坐标,利用higher和lower方法来找到左右值,然后比较之。
总结:
线段树问题:单点更新、区间更新、区间查询、区间染色、吃蛋糕问题、区间连续长度查询
A - Language of FatMouse ZOJ1109
TreeMap的应用,映射,左边是key,右边是value,一般情况下以key为主
TreeMap<String, String> map=new TreeMap<String,String>();这里记得第二个<>也要填好
containsKey、get、put 和 remove 操作提供受保证的 log(n) 时间开销
B - For Fans of Statistics URAL 1613
二叉查找树,由于一个key可能有多个value,所以TreeMap<Integer, TreeSet<Integer>> map = new TreeMap<Integer, TreeSet<Integer>>();查找的时候注意一些小的优化if (x != null && x.ceiling(l) != null && x.ceiling(l) <= r)
快速io的使用,见学习笔记。
C - Hardwood Species POJ 2418
words statistics TreeMap的简单应用,TreeMap会自动去重,新的会覆盖旧的映射。主要是遍历的方法。见学习笔记。
输出时,java中也有printf,类似C++,格式基本一样。"%.4f"保留四位小数
D - Station
TreeSet的技巧应用
add 和del 都只涉及左右的点,从这里出发,考虑存点,用TreeSet。而在del时暴力遍历一遍找最小的距离。
E - Web Navigation ZOJ 1061
模拟浏览器的操作,关键是题目信息提取的准确性。当前的页面和在back栈顶的页面不一回事。还有forward.clear
F - Argus ZOJ 2212
这题直接交的以前的代码==
不过还挺重要的。要自己写PriorityQueue的Comparator。这个在学习笔记里。
优先级队列,已经封装好的add等,主要思路就是每个period都自己累加,加进队列以后又能是有序的。
G - Plug-in
字符串去重,栈即可。只是在最后的时候,pop的速度非常慢,直接
for (char x : stack)
System.out.print(x);
AC题目简解-数据结构的更多相关文章
- AC题目简解-线段树
线段树: http://www.notonlysuccess.com/index.php/segment-tree-complete/鉴于notonlysuccess大牛的博客对于题目的思路写的很简陋 ...
- AC题目简解-dp
dp类:A - Bridging signals ZOJ 3627 POJ1631 HDU1950给出一个从1-n的数字排列,求最长上升子序列长度.直接说解法吧.新开一个数组d,d[i]表示的是能构成 ...
- AC题目简解-数论
反素数: HDU2521定义对于任何正整数x,其约数的个数记做g(x).例如g(1)=1,g(6)=4.如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x ...
- [转] AC自动机详解
转载自:http://hi.baidu.com/nialv7/item/ce1ce015d44a6ba7feded52d AC自动机详解 AC自动机是用来处理多串匹配问题的,即给你很多串,再给你一篇文 ...
- python ConfigParser、shutil、subprocess、ElementTree模块简解
ConfigParser 模块 一.ConfigParser简介ConfigParser 是用来读取配置文件的包.配置文件的格式如下:中括号“[ ]”内包含的为section.section 下面为类 ...
- RHCE脚本题目详解
目录 RHCE脚本题目详解 题目一 shell脚本之if语句实现: shell脚本之case语句实现: 题目二 实现 测试 解析 写在后面 RHCE脚本题目详解 题目一 在system1上创建一个名为 ...
- (lintcode全部题目解答之)九章算法之算法班题目全解(附容易犯的错误)
--------------------------------------------------------------- 本文使用方法:所有题目,只需要把标题输入lintcode就能找到.主要是 ...
- 继续node爬虫 — 百行代码自制自动AC机器人日解千题攻占HDOJ
前言 不说话,先猛戳 Ranklist 看我排名. 这是用 node 自动刷题大概半天的 "战绩",本文就来为大家简单讲解下如何用 node 做一个 "自动AC机&quo ...
- 算法设计与分析 - AC 题目 - 第 5 弹(重复第 2 弹)
PTA-算法设计与分析-AC原题 - 最大子列和问题 (20分) 给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+, ..., Nj },其中 ≤i ...
随机推荐
- 如何禁止KnockoutJs在VS2012的智能格式化
http://blogs.msdn.com/b/webdev/archive/2013/03/04/disabling-knockout-intellisense.aspx 我升级了一下VS2012, ...
- Projected Coordinate Systems
Coordinate Systems Projected Coordinate Systems This is an archive of a previous version of the ArcG ...
- STM32F10XXX 启动设置
在STMF103XXX 里,可以通过Boot[1:0]引脚选择3种不同的启动模式: 启动模式选择引脚 启动模式 说明 BOOT1 BOOT ...
- html 模板 swig 预编译插件 grunt-swig-precompile
GitHub grunt-swig-precompile NPM grunt-swig-precompile 在书写前端静态页面的时候,每个页面总在书写很多重复的标签. 为了提高效率,结合 swig. ...
- NodeJS + Socket.io聊天服务器连接数达到1024后就连不上了
如果是亚马逊的Engine Yard服务器,解决办法为: 1.查看端口占用情况,找到nodejs进程号,例如我这里是8000端口 lsof -i:8000 找到pid 例如为 8213 2.设置no ...
- YII框架源码分析(百度PHP大牛创作-原版-无广告无水印)
YII 框架源码分析 百度联盟事业部——黄银锋 目 录 1. 引言 3 1.1.Yii 简介 3 1.2.本文内容与结构 3 2.组件化与模块化 4 2.1.框架加载和运行流程 4 ...
- 深入理解php的MySQL连接类
php的MySQL连接类. 后面几个show_databases和show_tables....等方法都用了一堆echo,好像一直不喜欢在类的方法里直接用输出语句,不过这也只是列举数据库和表名,构造 ...
- 拥抱ARM妹子 序章!ARM妹子~~ 哥我来啦!
一个负心汉即将移情别恋,从51转到ARM妹子啦?其实8是的,俺准备开后宫.哇——咔~咔~~.考虑功耗和成本等问题,只有51肯定是不够的,所以嘛~~(一脸坏笑)嘿嘿~~,ARM妹子俺追定了.出于对ARM ...
- Asp.Net MVC结合ExtJs gridPanel 分页和高度自适应
Ext.onReady(function () { gridPanel(); var panel = Ext.getCmp('gridPanel'); window.onresize = functi ...
- hdu 4712 Hamming Distance(随机函数暴力)
http://acm.hdu.edu.cn/showproblem.php?pid=4712 Hamming Distance Time Limit: 6000/3000 MS (Java/Other ...