- 博客(21)
- 收藏
- 关注
原创 这可能是我在CSDN的最后一篇文章了...
本人已搬家到博客园 http://www.cnblogs.com/SiriusRen/小伙伴们都在博客园…我会定时来CSDN转一转的~~~
2017-03-10 18:48:03 879 1
原创 BZOJ 1537 cdq分治
思路: 我只是想写一下cdq…… 二维偏序 一维排序 一维cdq分治 (我忘了归并排序怎么写了,,,) 写了个sort… 复杂度是O(nlog^2n)//By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N=100050;#defi
2017-03-08 21:26:01 1055
原创 BZOJ 2794 DP
思路: 考虑把询问离线 按照m排序 物品按照a排序 f[i]表示c[j]的和到i b的最大值 背包就好 O(nk)竟然能过……//By SiriusRen#include <cstdio>#include <algorithm>using namespace std;const int N=1005;struct Ask{int m,k,s,id;}ask[N*N];stru
2017-03-08 21:24:20 504
原创 BZOJ 2729 高精度+组合数学
思路: 考虑 把男生排成一排 女生和老师往里插 分成两种情况. 1. 女生中间夹着老师 2. 女生中间没有夹着老师求一下组合* 阶乘就好了 先放Python代码 简洁易懂def fact(n): temp=1 for i in range(1,n+1): temp*=i return tempdef C(n,m): if(n<m): re
2017-03-08 21:20:15 424
原创 BZOJ 4033 树形DP
http://blog.csdn.net/mirrorgray/article/details/51123741 安利队长blog… 树形dp吧,状态挺显然的,dp[x][j]表示以x为根的子树中,选择了j个黑点的答案,但注意这个答案是整棵树的答案。 我们只需要对于每个儿子背包一遍,在最后更新一下dp[x][j]即可,具体可以看一眼程序。 非常重要的是,这个复杂度是n^2的,需
2017-03-08 21:16:26 535
原创 BZOJ 1196 二分+Kruskal
思路: 二分答案 判一下能不能加//By SirisuRen#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N=40050;int n,m,k,xx,yy,aa,bb,ans,f[N],top;struct Node{ int from,to,type,
2017-03-04 21:12:37 420
原创 BZOJ 1116 并查集
思路: 如果 每个联通块 边数>=点数 就OK 用并查集搞//By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N=100050;int n,m,xx,yy,sizep[N],sizee[N],f[N];int find(int x){re
2017-03-04 21:09:18 323
原创 BZOJ 3522 DFS+DP
思路: f[]表示选1个点的 g[]表示选2个点的 dp一下 ans+=(ll)g[k]*deep[k]; g[k]+=(ll)f[k]*deep[k]; f[k]+=deep[k];//By SiriusRen#include <cstdio>#include <cstring>using namespace st
2017-03-04 21:04:47 368
原创 BZOJ 2929 网络流
题意是啥……. 思路: 不是与1或n连起来的边 边权是1 否则是inf 跑网络流//By SiriusRen#include <queue>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N=66666,inf=0x3f3f3f3f;queue<int>q
2017-03-04 21:03:01 309
原创 BZOJ 1507 splay
写完维修数列 这不是水题嘛233333//By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N=5000050;int n,pos=1,ch[N][2],fa[N],size[N],root,xx,cnt;char op[15],ins[N],
2017-03-04 21:01:14 306
原创 BZOJ 1061费用流
思路: 我们可以列出几个不等式 用y0带进去变成等式 下-上 可以消好多东西我们发现 等式左边的加起来=0 可以把每个方程看成一个点正->负 连边 跑费用流即可//By SiriusRen#include <queue>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#de
2017-03-04 20:59:43 311
原创 BZOJ 3991 set维护dfs序
思路: set按照dfn排序 两点之间的距离可以O(logn)算出来 加一个点-> now ans+=dis(pre,now)+dis(now,next)-dis(pre-next); 删一个点同理 最后加上dis(begin,end)即可//By SiriusRen#include <set>#include <cstdio>#include <cstring>#include
2017-03-04 20:56:53 415
原创 BZOJ 4547 矩阵快速幂
思路: 肯定每回只加最大值和次大值如果 一开始的最大值>0且次大值<0 那就一直加 加到次大值>0搞一个矩阵 推斐波那契数列 求和 就好…//By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int mod=10000007,N=100050;#de
2017-03-04 20:53:42 338
原创 BZOJ 1500 splay终结版...
GSS系列有一丝丝像… 只不过那个是线段树 这个是splay 翻转 插入 删除啥的就是普通的splay 合在一起了而已//By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using namespace std;struct Tree{ int v,rev,sum,lmax,rmax,ma
2017-03-03 00:37:20 343
原创 BZOJ 2957 分块
思路: 记录每栋楼楼顶与原点连线的斜率 那么一栋楼可见当且仅当前面所有楼的斜率都小于这栋楼 将n栋楼分为√(0.5*n*logn)块 每一块内维护一个单调上升子序列(注意不是LCS) 比如说4 1 2 3 5 那么维护的序列就是4 5 修改的时候块内暴力重建 然后查询顺着块撸一遍 每次记录当前的最大值 然后去下一个块中二分找到第一个比这个最大值大的值 然后统计答案&&更新最大值 from p
2017-03-03 00:30:03 328
原创 BZOJ 2141 分块 线段树
思路: a[i]//By SiriusRen#include <cmath>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N=20050;int n,m,cpy[N],h[N],u,Block,block[N],xx,yy,ans;struct BIT{
2017-03-03 00:23:48 282
原创 BZOJ 4241 分块
思路: 考虑分块 f[i][j]表示从第i块开头到j的最大值 cnt[i][j]表示从第i块开始到序列末尾j出现了多少次 边角余料处理一下就好啦~//By SiriusRen#include <cmath>#include <cstdio>#include <algorithm>using namespace std;const int N=100050;int n,q,Bloc
2017-03-03 00:18:16 437
原创 BZOJ 4129 树上带修莫队+线段树
思路: 可以先做做BZOJ3585 是序列上的mex 考虑莫队的转移 如果当前数字出现过 线段树上把它置成1 对于询问 二分ans 线段树上查 0到ans的和 是不是ans+1 本题就是把它搞到了序列上 带了个修改… 麻烦一点 本质上是一样的//By SiriusRen#include <cmath>#include <cstdio>#include <cstring>#
2017-03-03 00:13:49 484
原创 BZOJ 4028 分块
zrt当年是怎么想到的……. 思路: 考虑把序列分块 对于每块 存xor[i] 表示从本块开头到i的前缀异或和 把它扔进set里 存gcd[i]表示从本块开头到i的前缀gcd. 如果这一块的GCD和整个的gcd的gcd是一样的 从set里找ans 否则暴力.. GCD最多log种 所以是复杂度是O(nsqrt(n)logn)的//By SiriusRen#include
2017-03-03 00:08:25 332
原创 BZOJ 3238 后缀数组+单调栈
单调栈跑两遍求出来 ht[i]为最小值的那段区间//By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N=500050;int n,cntA[N],cntB[N],A[N],B[N],sa[N],tsa[N],rk[N],ht[N],stka[N
2017-03-03 00:03:01 345
原创 BZOJ 3323 splay维护序列
就第三个操作比较新颖 转化成 在l前插一个点 把r和r+1合并//By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn=100005,mod=20130426;typedef long long ll;struct Tree{
2017-03-02 23:59:52 523
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人