10 2012 档案

摘要:题意: 给出一些集合和原来的集合进行多种运算,输出运算后的结果.. 输入: T a b 表示是原集合与该集合进行T操作~ 一开始集合为空.. 最后输出结果~如果是空集合就输出empty set思路: 这道题巧妙的地方是根据集合操作的特点把运算改成了成段的数据更新.. 线段树延迟标记延迟了更新的结果.. 根据集合操作的特点.. 可以看出: U:把区间[l,r]覆盖成1 I:把[-∞,l)(r,∞]覆盖成0 D:把区间[l,r]覆盖成0 C:把[-∞,l)(r,∞]覆盖成0 , 且[l,r]区间0/1互换 S:[l,r]区间0/1互换 其中如果... 阅读全文
posted @ 2012-10-28 20:46 Griselda. 阅读(217) 评论(0) 推荐(0)
摘要:题意: 给出了n份海报的贴在board上的起始位置和结束位置 问最后可以看到多少份海报 输入: n表示有n份海报 接下来n行 每行 a b 表示海报占据了a~b的位置..思路: 线段树成段更新 用树的结点value表示控制范围内的海报编号.. 因为不用更新到底+查询到每一个叶子节点..所以提高了查询和更新效率.. 其中因为海报长度给的很大.. 所以可以使用离散化来减少空间的消耗以及查询和更新时的递归次数..Tips: 因为给出的a b 表示的是在a~b内贴了海报.. 所以a b给的是值..但是表示的是一段范围.. 如果用正常的离散化..就可能出现 最底下一层贴了一张海... 阅读全文
posted @ 2012-10-26 07:42 Griselda. 阅读(310) 评论(0) 推荐(0)
摘要:题意: 给出一些值 然后给出你一些命令 按照命令输出 命令: C a b c 表示更新a ~ b的值加上 c Q a b 表示查询a~b的和输入: n m 表示有n个数 m 个操作 接下来 m 行为命令行思路: 就是简单的线段树成段更新求和 Tips: ※ 询问的时候要 pushdown ※ 注意范围问题吖~Code: View Code 1 #include <stdio.h> 2 #include <cstring> 3 using namespace std; 4 #define LL long long 5 6 const int MAXN = 100010;. 阅读全文
posted @ 2012-10-17 21:37 Griselda. 阅读(322) 评论(0) 推荐(0)
摘要:题意: 一群小孩顺时针坐然后在玩约瑟夫环的游戏.. 从第k个小孩开始..每个被选中的孩子扔出手中的纸牌.. 然后按着纸牌上面的数找下一个被选中的小孩.. 如果牌中的数是正数就顺时针数.. 如果是负数就逆时针数.. 其中第 i 个被选中的小孩会得到f( i )颗糖.. f( i )表示 i 的正因子个数.. 要求是找出得到糖最多的孩子个数.. 输入: n k 表示有n个小孩..从第k个开始 接下来 n 行有n个小孩的名字和他手上的牌的编号..思路: 一开始想的是暴力找出这个小孩.. 但是会很麻烦.. 然后这里就用到了反素数了.. 反素数:<http://ac... 阅读全文
posted @ 2012-10-16 12:48 Griselda. 阅读(385) 评论(0) 推荐(0)
摘要:题意: 动态更新一段区间的值.. 最后输出总区间的和..思路: 其实就是线段树的成段更新.. 用到了lazy[] 表示懒惰标志.. 懒惰标记: 就是每次更新不更新到最后..而是更新到包含了区间的最大的节点.. 然后如果下次更新的时候更新到了上次已经更新到的节点.. 那先把上次更新暂停的节点往下更新..直到这次更新的区间最大的节点没有被标记.. 这样就省时间了..Tips: pushdown节点就是用来向下更新的.. 要注意的是modify函数..即每次更新的时候 把根节点标记为要更新的数 x 然后顺便求出最大值sum[rt].. ... 阅读全文
posted @ 2012-10-12 11:21 Griselda. 阅读(1842) 评论(0) 推荐(0)
摘要:题意: 给出一些人要求插入队列的位置和他们的身高 输出最后队列的每个人身高输入: 给出n 表示有n个人 给出每个人要插进的队列的位置和该人的身高思路: sum 数组保存该区间的空位 a 数组保存该位置的人的身高 pushup函数用来自下向上更新区间空位 modify函数用来根据sum值找出空位并插入..Tips: 比较的时候..如果比左节点的sum值大就往右子树插位置.. 所以比较函数写的应该是..if(p <= sum[rt<<1]) 往右子树插的时候传入的参数也应该相应减少..即p - sum[rt<<1]Code:View Code 1 //模拟链表 数据量 阅读全文
posted @ 2012-10-11 20:49 Griselda. 阅读(274) 评论(0) 推荐(0)
摘要:题意: 一个board的面积是h*w..在上面贴一些announcement.. 给出告示的宽度ww..可知告示的面积为1*ww.. 问告示是否可以贴上去..可以就输出在board的第几行..不可以就输出-1思路: 以min(h, n)为长度建一棵树.. 然后每一个的叶子的长度为w.. 找出所有叶子中最大的那个..把announcement贴上去.. 用ma数组存当前区间最大值..Tips: 查询和更新可以一起写..但是我分开写了.. 然后还有一个要注意的是..树的最大宽度为min(h, n) 比较的时候是和左右节点大小比.. ※ 所以modify的时候判断条件也应该是i... 阅读全文
posted @ 2012-10-11 13:03 Griselda. 阅读(557) 评论(0) 推荐(0)
摘要:题意: 给出n个数..问循环排序后的最小逆序数思路: 根据出现次序..用线段树的sum记录某一区间出现次数.. 把出现的数值a[i] 更新到 sum[a[i]].. 根据题意..当每一次更新的之前..都对当前位置到最后位置出现的数进行查询.. 即可得到出现比该值早而又比该值大的数的个数..即满足逆序数对的定义.. 所以求和就可得到逆序数对的值.. 当每一次把队头的值移到队尾.. 逆序数对就减少了当前值(a[i]-1)<逆序数对包含该值的都没有了..>.. 但是还有一些逆序数对增加了..(加入到队尾时可与该数组成逆序数对的..)即n-a[i]对.. 所以每一次循环后存在的逆序数... 阅读全文
posted @ 2012-10-10 22:02 Griselda. 阅读(571) 评论(0) 推荐(0)
摘要:[1166 敌兵布阵]题意: 给出一些命令..要求可以: 随时增加或减少某个位置上的数 随时查询某段区间上的和.. 输入: 一个T 表示有T组样例 每组样例一个n 表示有n个位置 输入命令: Add a b 表示在 a 位置上增加 b Sub a b 表示在 a 位置上减少 b Query a b 表示求 a 到 b 的和思路: 因为数据量很大..所以无法靠暴力来遍历求和.. 所以用线段树..Tips: 更新的时候注意sum数组开到节点的4倍Code:View Code 1 #include <stdio.h> 2 #include <cstri... 阅读全文
posted @ 2012-10-09 21:12 Griselda. 阅读(334) 评论(0) 推荐(0)
摘要:题意: 有一个牧师要给好几对新婚夫妇准备婚礼.. 已知每对新婚夫妇的有空的时间以及婚礼持续时间.. 问是否可以让每对新婚夫妇都得到该牧师的祝福~ 如果可以就输出YES以及可行解 不可以就输出NO输入: 一个n 表示有n对新婚夫妇 接下来n行每行a b c 表示在a~b这段时间有空..以及婚礼会持续 c.. P.S.时间只可以选在a开始或者b结束.. eg:08:00 09:00 30 可以在8:00~8:30举行婚礼或者8:30~9:00举行婚礼思路: 2-sat 以在前一段时间举行婚礼或者后一段时间举行婚礼为2个可选方案 然后每对新婚夫妇婚礼时间冲突了就给和另外一个方案连... 阅读全文
posted @ 2012-10-09 13:40 Griselda. 阅读(533) 评论(0) 推荐(0)
摘要:题意: panda和ikki.玩游戏.. 给出m个点对关系..这些点都在圆上.. 给点对连线..如果可以不交叉(可以在圆内或圆外连线)则panda赢..否则ikki.赢 输入: 给出n m 表示有n个点 m个点对 接下来m行 有a b 表示点a 和 点b 之间有一条线思路: 2-sat..用来解决2个集合的冲突问题.. 这道题..冲突在于是在圆内和在圆外.. 把边看成点.. 然后看所有边连起来之后会不会出现冲突..即在圆外的边和在圆内的边同时出现在一个强连通分量里了.. 所以求出强连通分量.. 看交叉的两条边..用tarjan染色.. 如果冲突出现了(在圆... 阅读全文
posted @ 2012-10-05 19:26 Griselda. 阅读(255) 评论(0) 推荐(0)
摘要:题意: 某个公园要修路..这将导致两个景点无法连通 输入: 给出n m 表示有n个景点 m条路 接下来m行每行有a b 表示a景点和b景点相连.. 问加几条边可以使任意两个景点都相连..思路: 先用tarjan算法求出每个连通分量 然后对无向图来说..变成双连通分量的方法就是(入度为1的点+1)/ 2Tips: 无视POJ的simple输入输出 都是坑人的..T0T 还有就是现在这样tarjan算法第一次调用的时候就是tarjan(1, 1)Code: View Code 1 #include <stdio.h> 2 #include <cstring> 3 #incl 阅读全文
posted @ 2012-10-05 12:09 Griselda. 阅读(191) 评论(0) 推荐(0)
摘要:题意: 很久很久以前.. 有一个国王.. 他有好几个儿子.. 这些王子都喜欢上了邻国的公主.. 他们准备迎娶自己喜欢的公主中的一个.. 国王就让宰相给列一个清单.. 宰相就给了国王一个清单..上面写明了哪个王子将迎娶哪个邻国的公主.. 但是调皮的国王不太满意~~ 他还想知道他的儿子分别可以迎娶哪几个公主中的一个而不会让他的兄弟因此而吃醋.. 所以宰相又得重新写清单了.. 噢..对了~邻国的公主和王子人数一样多~<这是一个奇怪的国家..> 输入: 一个n表示有n个王子.. 接下来n行每行有一个m表示第i个王子喜欢m个公主.. 然后给出m个公主的序号.. 最后一... 阅读全文
posted @ 2012-10-05 07:54 Griselda. 阅读(186) 评论(0) 推荐(1)
摘要:题意: 给出n个点和他们之间的一些关系.. 问加多少条边可以使所有的点变成强连通分量..思路: 根据题意就可以知道有这个推理: 原图缩点后的有向无环图.. 出度为0的点和入度为0的点中个数少的那些点向个数多的那些点连线.. 可以使森林变成强连通分量..Tips: 注意如果缩点后变成一个点了.. 则入度为0和出度为0的点的个数都是1 但是实际上已经是强连通分量..不需要连线了.. 所以答案应该是0Code:View Code 1 #include <stdio.h> 2 #include <cstring> 3 #include <algorithm> 4.. 阅读全文
posted @ 2012-10-04 21:42 Griselda. 阅读(224) 评论(0) 推荐(0)
摘要:题意: 给出n个学校的兄弟学校..<单方面认为> 如果给了一个软件给某个学校..他就会把这个软件给他的兄弟学校.. 然后求两个解: 1st: 至少准备多少个软件..可以使所有的学校都有这个软件.. 2nd:至少加多少条边..可以使只给一个软件..就能让所有学校都得到这个软件..输入: 一个n 代表有n个学校.. 接下来n行.. 第i行 给出第i个学校的兄弟学校(单方面认为)的列表..以0结束.. 输出两个解的结果..思路:缩点之后把原图变成一个有向无环图.. 两个解可以看成是: 1st:把该有向无环图看成一个森林..求的就是有多少棵树..<即入度为0的根节点的个数... 阅读全文
posted @ 2012-10-04 21:09 Griselda. 阅读(197) 评论(0) 推荐(0)
摘要:题意: 给出一些房间之间的关系 问任意两个房间是否存在一条互通的路径..即单相连通.. 输入: 给出T表示有T组数据 每组数据给出n m 表示n个房间 m个关系 接下来m行..每行给出a b 表示a房间 和 b房间之间是连通的.. 如果任意两个房间之间存在单相连通..则输出yes 否则 no思路: 先用tarjan算法求出每个强连通分量..然后对每一个进行染色.. 然后建图..拓扑排序.. 如果排序不唯一..就是有超过两个点是有0个初度的.. 这代表其中有两个房间是不相连的..Tips: 点太多或者边太多的情况下.. 就要用前向星建图了..Code:View Code... 阅读全文
posted @ 2012-10-03 21:33 Griselda. 阅读(193) 评论(0) 推荐(0)
摘要:题意:给出一些 两个门连通的关系问是否所有房间都连通输入: n m 表示n个房间 m个关系 接下来m行a b 表示房间a和房间b 相连如果房间是互通的 输出yes 否则 no思路: 用tarjan求强连通分量 <强连通分量:有向图中任意两个点存在互通的道路..>Tips: 强连通分量tarjan算法讲解:http://www.byvoid.com/blog/scc-tarjan/zh-hant/Code:View Code 1 #include <stdio.h> 2 #include <cstring> 3 #include <algorithm&g 阅读全文
posted @ 2012-10-03 15:23 Griselda. 阅读(218) 评论(0) 推荐(0)
摘要:题意:给出一个每一格带值的矩阵每一次只可以从左上角走到右下角问走过k次后最多能得到多少值P.S 走过的格子值会变成0输入: 给出一个n 和 k 给出n*n 矩阵思路: 因为求的是最大值 所以应该求最长距离..把最小路径改成求最大路径 <相应改变的就是松弛操作 和 dis的初始状态> 为了保证每个点只取一次值 并且 可以经过多次 就进行拆点 然后对应点之间加两条边 ①. 容量为1 费用为该点的值 ②. 容量为INF 费用为0 ①边保证了该点走过后变为0值 ②边保证该点可以经过多次 还有超级源点跟每个点之间连边 容量为k 费用为0 超级汇点和每个拆点之间连边 容量为k 费用... 阅读全文
posted @ 2012-10-02 20:54 Griselda. 阅读(238) 评论(0) 推荐(0)
摘要:题意:有一种奇怪的小鱼..他会攻击他认为是女的鱼..<如果她自己也是女的呢?不懂..果然是奇怪的小鱼..>然后生下来的孩子的值等于父母值的异或结果..<更奇怪了..囧~>问最可能得到的孩子值最大是多少~输入: 一个n代表有n条鱼 接下来1行有n个数表示第i条鱼的值 然后n*n行~表示第i行的鱼认为第j行的鱼是女的鱼思路: 根据给出的n*n矩阵~ 得出第i个点对应第j个点..即ij连边的值wij.. 然后转化为求最佳匹配<最大边权匹配>Tips: 读入数据的时候要以字符串的形式.. 坦白说我到现在都没理解一个一个字符读的话为什么会wa.. 求解.. 传说.. 阅读全文
posted @ 2012-10-02 13:26 Griselda. 阅读(280) 评论(0) 推荐(0)
摘要:题意:给出m个路径的起点和终点还有长度找出一条路径可以从1到n然后回到1..并保证找到的路径是不重复而且是最短的..思路:容量控制经过只有1次费用控制长度在建完图后求最小费用最大流..就可以找出最短距离..而且没有重复路径..Tips:※ 0点作为超级源点和1相连 n+1作为超级汇点和n相连 然后容量为2费用为0 保证一进一出※ 建图的时候..相邻的正反边要紧挨着写.. 因为更改图中的容量的时候.. edge[load[u]].c -= mn; edge[load[u]^1].c += mn; 位运算表示的是反向边..所以加的时候应该紧挨着加..... 阅读全文
posted @ 2012-10-01 23:45 Griselda. 阅读(307) 评论(0) 推荐(0)
摘要:题意:给出供应商供应的商品量和商家需要的商品量以及某个商品在供应商和商家之间的消耗量问商家是否能得到想要的商品量如果可以那怎么安排才是最少花费输入: 给出 n m k 表示有n个商家 m个供应商 k个商品 接下来n行有k个数值表示 第 ni 个商家需要的第k个商品的商品量为ki 接下来m行有k个数值表示 第 mi 个商家需要的第k个商品的商品量为ki 接下来的k个n*m矩阵表示第 ki 个商品 又第 mi 个供应商给第 ni 个商家的消耗 思路: 很明显的最小费用最大流.. 但是建图很特别.. 先求出每个商品的最小花费 然后加起来 固定了超级源点和每个供应商之间的边(容量为供应... 阅读全文
posted @ 2012-10-01 11:22 Griselda. 阅读(241) 评论(0) 推荐(0)