===基础算法===
Loi_a
这个作者很懒,什么都没留下…
展开
-
bzoj 1007 水平可见直线 贪心+初中数学
在xoy直角坐标平面上有n条直线L1,L2,…Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为 可见的,否则Li为被覆盖的. 例如,对于直线: L1:y=x; L2:y=-x; L3:y=0 则L1和L2是可见的,L3是被覆盖的. 给出n条直线,表示成y=Ax+B的形式(|A|,|B|<=500000),且n条直线两两不重合.求出所有可见的直线.对原创 2016-09-13 19:18:11 · 471 阅读 · 0 评论 -
noip2016 愤怒的小鸟 状压搜索
这道题稍微卡了一下精度,浮点数直接判相等是会挂掉的。然后就是搜索,选定当前未选的最小编号,枚举其他的点确定一条抛物线(如果可以),然后把在这条线上的点都选上。确定抛物线推一下就可以。#include<iostream>#include<cstdio>#include<queue>#include<cstdlib>#include<map>#define LL long longusing原创 2016-12-21 20:40:47 · 1079 阅读 · 0 评论 -
noip2011 观光公交 递推+贪心
考虑一个加速器对答案的影响,如果加速后一个人下车了,那么这个人时间缩短了一秒。所以在没有发生车等人的情况下,每当有一人下车,时间就会缩短一秒。然后各个加速器之间是互不影响的。所以可以贪心。 预处理出每个点可以向后拓展,直到发生车等人的长度。再用前缀和维护一段区间下车的人数。#include<iostream>#include<cstdio>#include<cstring>#include<原创 2016-11-07 20:46:46 · 788 阅读 · 0 评论 -
bzoj 3039 玉蟾宫 单调栈
。#include<iostream>#include<cstdio>#include<stack>using namespace std;int mp[1005][1005];char c[2];int h[1005][1005];stack<int> S;int main(){// freopen("jademoon.in","r",stdin);// freopen(原创 2016-09-29 10:04:53 · 762 阅读 · 0 评论 -
noip2011 Mayan游戏 dfs+模拟
代码能力太弱啊,调了一天。首先我bfs挂了,因为状态太多而MLE,好像只能dfs,然后bfs改dfs过程中傻x错误一大堆。这道题主要是模拟比较麻烦,消除块的情况非常复杂。剪枝的话,如果一个块左边有块,就不用搜它向左移的情况,因为左边的块向右移会更优。剪这一个应该就可以。还有总结这几天做题经验,一定谨慎使用STL,删块的时候把要删的坐标加入队列最后一起删,结果用了8s,记录了一下删块,结果不到1s。开原创 2016-10-31 18:50:09 · 698 阅读 · 2 评论 -
noip 2010 引水入城 bfs+剪枝+dp
从第一行每一个点开始bfs,这样可以知道每一个点可以覆盖在最后一行的区间。判一下不能覆盖的情况。然后可以完全覆盖的话,那么最优解中第一行的点所对应最后一行中一定是连续的一段。有两种证明方法:(1、显然法:显然它是对的。2、反证法:反正它是对的。) 假设i#include<iostream>#include<cstdio>#include<queue>#include<stack>#incl原创 2016-10-30 14:41:56 · 628 阅读 · 0 评论 -
虫食算 dfs+剪枝
爆搜加打表,面向数据编程的方法果然强。不知道是剪枝没加全,还是搜索的思路有问题,有一个点会T。#include<iostream>#include<cstdio>#include<ctime>#define LL long longusing namespace std;int n;char s1[30];char s2[30];char s3[30];int a[105];in原创 2016-10-30 10:09:26 · 607 阅读 · 1 评论 -
bzoj 2241 打地鼠 模拟
这个题时间复杂度好迷啊,神一样的n^6模拟也能跑!暴力踩标算,n方过百万。#include<cstdio>#include<iostream>using namespace std;int a[105][105];int b[105][105];int m,n,tot=0;bool del(int i,int j){ for(int i1=1;i1<=m;i1++) f原创 2016-10-29 07:57:22 · 715 阅读 · 1 评论 -
noip2012 开车旅行 set+倍增
因为要快速查找向后跳应该是哪一个点,所以用set,迭代器左右晃一下查找最接近的两个元素(P选手是不是只能用平衡树~)。然后用倍增记录i节点跳2^j步后,A和B分别走的距离。具体的细节和统计答案也需要注意。#include<iostream>#include<cstdio>#include<cmath>#include<set>#include<map>#include<algorithm>原创 2016-11-09 10:21:07 · 723 阅读 · 0 评论 -
bzoj 1024 生日快乐 dfs
非常好理解的搜索,但要注意几个地方的浮点误差,能用整数尽量用整数……#include<cstdio>#include<algorithm>#include<iostream>#include<cmath>using namespace std;double sqr;double dfs(double x,double y,int r){ if(r==1) ret原创 2016-10-28 14:23:23 · 439 阅读 · 0 评论 -
bzoj 1002 轮状病毒 打表
一眼看到数据范围,输入只有1个n,n<100果断打表。然而好像跑表的复杂度不兹磁啊,要跑几年。所以要打表找规律。#include<iostream>//这是小数据打表#include<cstdio>using namespace std;struct E{int f,t;}b[100005];int cnt,n;int use[100005];int fa[100005];int fi原创 2016-10-26 21:25:08 · 510 阅读 · 0 评论 -
bzoj 2002 弹飞绵羊 分块(水)
这道题正解是LCT吗,不理解,用分块水的。#include<iostream>#include<cstdio>#include<cmath>#include<cstdlib>using namespace std;int a[200005];int b[200005];int c[200005];int inf=214748;int ask(int x){ int ans原创 2016-09-22 21:50:24 · 584 阅读 · 0 评论 -
2015noipT3 斗地主 暴力模拟
#include<iostream>#include<cstdio>#include<queue>#include<algorithm>using namespace std;int a[20];struct joker{ int p[20]; int ans; void print() { for(int i=0;i<=14;i++)原创 2016-09-28 17:04:04 · 903 阅读 · 0 评论 -
bzoj2654 tree 最小生成树+二分验证
给你一个无向带权连通图,每条边是黑色或白色。让你求一棵最小权的恰好有need条白色边的生成树。因为随着白色边权值同时增大或同时减小,最小生成树中白色数量也会增大或减小,所以可以二分一个值Mid,白色边同时加上Mid,求生成树中白边数量。然后调整上下界。#include<iostream>#include<cstdio>#include<algorithm>#define maxn 50005原创 2016-12-20 21:25:27 · 660 阅读 · 0 评论