- 博客(19)
- 资源 (46)
- 收藏
- 关注
原创 HDU 3974 Assign the task(树 并查集)
题意 公司中有n个员工 除了boss 每个员工都有自己的上司 自己下属的下属也是自己的下属 当给一个员工分配任务时 这个员工会把任务也分配到自己的所有下属 每个员工都只做最后一个被分配的任务 对于每个C x 输出员工x正在做的任务 没有就输出-1 把员工的关系数建成类似并查集的结构 把每个直接分配任务的员工的任务和任务分配时间保存起来 查询时只要找这个员工所有父节点中最
2015-04-22 21:48:27 1397
原创 HDU 1540 Tunnel Warfare(线段树 区间合并 最大连续区间)
题意 有n个连在一起的地道 接下来有m个操作 D x 炸掉x号地道 炸掉后x所在的区间就不连续了 Q x 查询输出包括x的最大连续区间长度 R修复最后一个被炸的地道 注意输入R时可能并没有需要修复的地道 线段树的区间合并问题 线段树要维护3个信息 len 对应区间的最大连续长度 ll 对应区间最左端的一段连续长度 lr 对应区间最右端的一段连续
2015-04-22 14:25:48 1201 1
原创 HDU 4027 Can you answer these queries?(线段树 区间不等更新)
题意 输入n个数 然后有两种操作 输入0时将给定区间所有数都变为自己的开方 输入1输出给定区间所有数的和 虽然是区间更新 但每个点更新的不一样 因此只能对单点进行更新 其实一个点最多被更新7次 2^64开平方7次后就变为1了 如果某个区间的数都变为了1 那么对这个区间的开方就不用考虑了 另外要注意给你的区间可能是反的 #include #define lc p<<
2015-04-19 09:34:08 1701
原创 POJ 2528 Mayor's posters(离散化 线段树 贴海报)
题意 在墙上贴n张海报 输入每张海报的的左右端点坐标 问最后可以看到多少张海报 能看到一点也是能看到 先把线段树初始化为0 输入一张海报 就把那个区间变成这张海报的序号 最后判断墙上有多少个不同的序号就行了 但是海报坐标的端点值高达10000000 直接用线段树会超时 但是注意到海报最多只有10000张 也就是最多有20000个不同的坐标 于是可以利用离散化的知识 把
2015-04-18 19:06:56 2032
原创 Codeforces 535C Tavas and Karafs(二分)
题意 有一个等差数列 从A开始 公差为B 然后n个询问 每个询问给定l,t,m 然后要求如果每次可以最多选择m个数 使这m个数-1 那么在t次操作中可以使l为左端点的最长序列中使所有数为0 输出这个最长序列的右端序号 定理 序列h1,h2,...,hn 可以在t次时间内(每次至多让m个元素减少1) 全部减小为0 当且仅当 max(h1, h2, ...,
2015-04-15 16:26:19 1444
原创 HDU 4006 The kth great number(优先队列·第K大数)
题意 动态查询第K大的数 用小数在前优先队列维护K个数 每要插入一个数时 若这个数小于队首元素那么就不用插入了 否则队首元素出队 这个数入队 每次询问只用输出队首元素就行了 #include #include using namespace std; int main() { int n, a, k; char op[5]; while(~scanf("%d%
2015-04-14 13:05:56 1296
原创 HDU 1166 敌兵布阵 (树状数组·线段树)
题意 中文 动态区间和问题 只会更新点 最基础的树状数组 线段树的应用 树状数组代码 #include using namespace std; const int N = 50005; int c[N], n, m; void add(int p, int x) { while(p <= n) c[p] += x, p += p & -p; } int
2015-04-14 12:54:32 811
原创 Codeforces 534D Handshakes(贪心)
题意 房子里有n个人走进来 编号1~n 每个人走进来时房子里所有空闲的人都会和他招手 空闲的某三个人可以选择一起去打比赛 当然打比赛就变得不空闲了 给你每个人进来时和他招手的人的数量 要求输出一种可能的进房间顺序 没有可能的就输出Impossible 这题放在d就比较简单了 直接贪心就可以 把招手数量为i对应的人都保存到栈s[i]里 第一个进房间的人肯定是s[0]里的 然
2015-04-13 18:22:01 1177
原创 Codeforces 534B Covered Path(贪心)
题意 你在路上走 每秒钟的开始都可以改变自己的速度(改变速度都是瞬间完成的) 知道你开始的速度v1 结束时的速度v2 整个过程所用时间t 以及每秒最多改变的速度d 求这段时间内你最多走了多远 最优的肯定是先把速度从v1升到最大 然后从最大减到v2 使得用的时间不会超多t 因为肯定是足够从v1减为或升到v2的 那么我们只用从两端往中间靠 哪边的速度小 哪边就加上d 知道
2015-04-13 17:29:27 873
原创 hiho一下·41 骨牌覆盖问题·一(矩阵快速幂·费波拉契)
题意 求费波拉契数列第N项 1≤N≤100,000,000 通过矩阵的幂 可以把一维递推的时间复杂度减小到O(logN) 主要就是快速幂的思想 对于m^n 若 n=2^a1+2^a2+...+2^ak 那么 m^n = m^(2^a1) * m^(2^a2) * ... * m^(2^ak) 那么只用看n转换为二进制后哪些位为1就可以快速求出m^n了 #include
2015-04-13 17:09:52 958
原创 POJ 2299 Ultra-QuickSort(归并排序·树状数组·逆序对)
题意 给你一个数组求其中逆序对(ia[j]) 的个数 我们来看一个归并排序的过程: 给定的数组为[2, 4, 5, 3, 1],二分后的数组分别为[2, 4, 5], [1, 3],假设我们已经完成了子过程,现在进行到该数组的“并”操作: a: [2, 4, 5] b: [1, 3] result:[1] 选取b数组的1
2015-04-10 20:27:30 785
原创 Codeforces 230C Shifts(模拟)
题意 有n个m列的转盘 每个转盘的某一列为1或0 你每次可以将某个转盘转动一格 问至少转多少次使得某一列n个转盘上的数都是1 把每个转盘的所有列转为1所需要的最小时间都存起来 可以以某一个1为基点顺时针逆时针各转一圈就可以把每个点需要转的次数算出来 最后看哪一列的和最小就行了 #include using namespace std; const int N = 105, M
2015-04-07 20:05:14 909
原创 HDU 3714 Error Curves(3分)
题意 求分段函数的最低点 每个点函数值为n个 a*x^2 + b*x +c (a>=0, |b| 由于a是不小于0的 所以此分段函数的函数图像只可能是类似'V'形的 可以画图观察出来 那么求最小值就可以用三分来解决了 #include using namespace std; const int N = 10005; const double eps = 1e-9; int a[
2015-04-07 17:56:22 700
原创 UVa 11624 Fire!(BFS 逃离火灾)
题意 n*m的迷宫中有一些着火点 每个着火点上下左右相邻的非墙点下一秒也将成为一个着火点 Joe每秒能向相邻的点移动一步 给你所有着火点的位置和Joe的位置 问Joe逃离这个迷宫所需的最小时间 可以先一遍bfs把每个点的最早着火时间存起来 只有Joe到达该点的时间小于这个时间Joe才能走这个点 只需要对Joe所在的点为起点再来一次bfs就行了 需要注意的是开始可能有多个着
2015-04-03 12:58:31 931
原创 FZU 2150 Fire Game(DFS+BFS)
题意 在n*m个格子组成的草地上 你可以选择两个是草('#')的格子点燃 每个点燃的格子在下一秒其四个相邻的是草的格子也会被点燃 问点燃所有的草至少需要多少秒 DFS和BFS的综合 如果'#‘连通块的数量大于2个是肯定不能点燃所有的 先dfs判断连通块个数 再bfs找出选哪两个格子可以最快把草烧完 #include #include #include using nam
2015-04-03 10:16:31 1236
原创 POJ 3414 Pots(BFS 倒水)
题意 你有两个容积分别为a,b杯子 你每次可以将某个杯子中的水倒满或者倒掉或者倒到另一个杯子 问能否通过这两个杯子量出c容量的水 和上一个倒可乐问题类似 只是这个操作更多了点 将两个杯子中各含有的水作为状态 每出队列一个状态 将所有可能到达的状态入队 直到有一个杯子里面水的体积为c 打印路径直接递归就行了 #include #include #include usin
2015-04-02 17:11:48 1018
原创 POJ 3126 Prime Path(BFS 数字处理)
题意 给你两个4位素数a, b 你每次可以改变a的一位数但要求改变后仍为素数 求a至少改变多少次才能变成b 基础的bfs 注意数的处理就行了 出队一个数 然后入队所有可以由这个素数经过一次改变而来的素数 知道得到b #include #include using namespace std; const int N = 10000; int p[N], v[N], d[N],
2015-04-02 07:48:30 935
原创 POJ 1426 Find The Multiple(BFS 同余模定理)
题意 给你一个数n 输出一个仅由0,1组成的数m使得m是n的倍数 找到一个m 是m%n==0 就行了 初始让m=1 然后bfs扩展m的位数 只有两种情况 m = m * 10 或 m = m*10 + 1; 同余模定理 (a+b) % c = (a%c + b%c) % c, (a*b)%c = (a%c * b%c) % c; 运用同余模定理 可以只记录余数 这
2015-04-01 21:34:24 727
原创 HDU 1495 非常可乐(BFS 倒水问题)
题意 将体积为s的可乐 利用容积分别为n和m的两个杯子平均分为两份 至少需要倒多少次可乐 可以把容器s,n,m中装的可乐量看成一种状态 容器都是没有刻度的 所以每次倒可乐要么把自己倒完 要么把对方倒满 每种状态可以通过一次倒水到达哪些状态 于是可以通过bfs判断到达每种状态需要倒多少次 3个容器中有一个装的可乐为s/2的状态就是答案了 s是奇数时明显不可能平分的 可以
2015-04-01 09:39:11 2509 2
(HDUACM201303版_15)筛选法及预处理(附菜鸟的23个经典错误)
2014-08-25
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人