- 博客(18)
- 收藏
- 关注
原创 bzoj3000 Big Number
题目首先,我们都知道,一个数n有几位数的公式就是lg(n)+1(十进制下)。那么k进制下就为logk(n)+1了。 那么这道题就可以即为logk(n!)=log(1)+log(2)+……+log(n)了。 但是这样是O(n)的,做不动。这个时候,就要使用神奇的公式了。当然不会证明啦。但是,这样就可以根据对数运算法则展开了。最后公式就很好推了。#include<bits/stdc++.h>#de
2017-11-30 20:23:27 355
原创 BZOJ 刷题计划
noip2017算是告一段路了吧。 接下来就是省选的准备了。 然而有很多感触呀,初中的同学们好多都蜜汁退役了。 但是,之后的路还是要走下去的,带上一起的梦想。当然,必不可少的就是省选了,然后就当然要刷题了,说一说我的刷题计划吧。只要做上百个题,看上千个题,就可以成为神犇了。很有道理吧。bzoj上的题大多都很有难度,对于这些题。大概是可以看看题解,理解一下,然后必须自己实现一次,这样就能学到一
2017-11-18 13:44:14 1352
原创 noip2017
所以,我最初是在憧憬这什么,现在又在回忆着什么;最初是收获了什么,现在又失去了什么 ——noip2017有感今年就是最后一次noip了,但是不算太愉快吧。 noip2014普及组是我的第一次noip,当时还什么都不会,大概就到多维数组吧,用一个小时写出了第一题,虽说只是一个小小的模拟,但对
2017-11-12 18:01:49 961 2
原创 bzoj1925 [Sdoi2010]地精部落
题目很熟悉的一道题目,很久以前记过一个结论。说到底就是波动数列计数。 运用递推思想。f[i][j]=f[i][j-1]+f[i-1][j-i]但是这道题要卡空间,要开一个滚动数列就好了。#include<bits/stdc++.h>using namespace std;long long n,p,now;long long f[2][4205];int main(){ //f
2017-11-09 14:55:41 240
原创 bzoj3997 [TJOI2015]组合数学
题目emm,首先,记住一个定理一样的东西:最长反链=DAG最小路径覆盖然后,就是比较简单的一个dp问题了。#include<bits/stdc++.h>#define Max(a,b,c) max(a,max(b,c))using namespace std;int n,m,T;int A[1005][1005],f[1005][1005];inline char nc(){
2017-11-09 14:46:24 280
原创 bzoj1669 [Usaco2006 Oct]Hungry Cows饥饿的奶牛
题目最,最,最长上升子序列。可以说是很简单了。唯一需要注意的是要把f数组一开始赋值为1.#include<bits/stdc++.h>#define N 5000using namespace std;int f[N+5],A[N+5],n,mx;inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; retur
2017-11-09 14:39:54 410
原创 bzoj1612 [Usaco2008 Jan]Cow Contest奶牛的比赛
题目要想确定一个奶牛的排名,只要知道比它强的有多少个,比它弱的有多少个,并且加起来为人数减一。之后就只需要知道有多少人比他弱或强就好了。 可以考虑floyd来做,类似最短路:f[i][j]=f[i][j]||(f[i][k]&&f[k][j])要么本来就联通,要么用一个辅助的k。#include<bits/stdc++.h>using namespace std;int n,m,x,y;i
2017-11-09 14:32:12 210
原创 bzoj1614 [Usaco2007 Jan]Telephone Lines架设电话线
题目又是最小最大值问题,这显然是满足二分性质的。二分最大值,把权值比它小的边新权值设为0,比它大的设为1。然后再跑一遍最短路,比较到n的距离与k的大小就好了。#include<bits/stdc++.h>#define N 20000using namespace std;int n,p,k,l,r,mid,mn,x,y,z;int first[N+5],nxt[N+5],to[N+5],v
2017-11-09 14:24:40 250
原创 bzoj1602 [Usaco2008 Oct]牧场行走
题目LCA模板题。在树上求两个点之间的距离,可以用类似差分的方法。设dis[i]表示结点i到根的距离,那么s到t的距离为:dis[s]+dis[t]-2*dis[lca(s,t)];lca(s,t)表示它们的最近公共祖先。#include<bits/stdc++.h>#define N 2000using namespace std;int n,q,x,y,z;int first[N+5]
2017-11-09 14:19:33 232
原创 bzoj3450 Tyvj1952 Easy
题目比较简单的一个期望递推,设当前连续o的期望为tmp,则如果当前为x,tmp=0,对答案没有贡献。 如果当前为o,tmp++,对答案有tmp^2-(tmp-1)^2的贡献 如果当前为?,先对答案有((tmp+1)^2-tmp^2)的贡献,tmp=(tmp+1)/2。按照这个规则,O(n)扫一遍就可以了。#include<bits/stdc++.h>using namespace std;i
2017-11-09 14:14:36 167
原创 bzoj1697 [Usaco2007 Feb]Cow Sorting牛排序
题目首先,我们先学习一下置换的概念,就是两个排列,它们的某个下标相等的子序列的数值循环以后相等。说的好抽(mo)象(hu)呀,举个例子:s = {1 2 3 4 5 6} t = {6 3 4 2 1 5} 然后,t可以写成: t = { {1 6 5},{ 2 3 4 } }大概就是这样吧。我们再看这道题。先求一下置换,对每个置换,分两种考虑: 1.内部解决: 当然用最小的来操作
2017-11-08 23:12:24 195
原创 bzoj4459 [Jsoi2013]丢番图
题目蜜汁“费马大定理”,不过好像没什么关系。1/a+1/b=1/n,这样当然是没有用的,我们来变换一下(没有公式编辑(其实太懒))。(a+b)/ab=n n(a+b)=ab ab-n(a+b)+n^2=n^2 (a-n)*(b-n)=n^2到现在,就很显然了,求n^2的因数个数,考虑a,b其实等价,还要除以2,(向上取整,因为平方数)。之前被一个强行卡常网站卡了一下这个,本机0.83s,交上去
2017-11-08 22:57:19 307
原创 bzoj1583 [Usaco2009 Mar]Moon Mooing 哞哞叫
题目一道类似两个序列合并的东西,通法就是上一个优先队列就好了,但是这道题会超时。但是,仔细观察一下,序列是单增的(a>c),这就很好办了,类似做一个归并就好了。#include<bits/stdc++.h>#define N 5000000using namespace std;int n,a1,b1,c1,a2,b2,c2,C;int cnt,p1,p2;unsigned long lo
2017-11-08 22:47:50 289
原创 bzoj4668 冷战
题目好久没写blog了,可能是因为最近比较忙吧,距离noip2017也就60个小时左右了吧。要开始复习一下模板了。这道题问是否联通,显然要用并查集来做,但是,是否能路径合并呢? 简单想一想,当然不能啦,因为我们每个结点上要记录一个时间标记,然后构成一个像树一样的结构(当然可能有其它做法)。但是,裸的并查集会超时的,如何优化呢?并查集主要优化就两个:路径压缩和按秩合并,前者接近O(n),后者能让高度
2017-11-08 22:43:36 442 1
原创 noip2017 复习计划
哎,终于在考试前一周刷完了noip2013到noip2016,并且bzoj上也刷了200道题了,而且道道都写了博客,还是很有成就感的。虽然有些(da duo)博客很水,但是自己再看一遍还是会从中学会什么的。当然,也希望对更多的OIer有用。还有一周,就是最后一次noip了。先在这立一个复习计划,主要是一些noip模板和一些技巧吧。先占坑,明天填。。。
2017-11-02 22:25:43 494 1
原创 bzoj4917 [Lydsy六月月赛]Hash Killer IV
啊哈,Hash Killer 4,不过,一开始我还以为又是什么字符串神题,没想到啊233。其实可以打表(逃好吧,说正解,我们可以手推几个式子,发现有些位子是固定了的,然后就可以全部确定了,多好,模拟题呀。#include<iostream>#include<cstdio>#include<cstring>#include<bits/stdc++.h>using namespace std;
2017-11-02 22:19:27 259
原创 bzoj2982 combination
题目一句话题意,求解C(n,m)%10007的值。我们知道,10007是一个质数,那么除一个数就相当于乘上它的逆元,这样就可以预处理阶乘O(1)做了。但是,这样有个问题,n大于了10007怎么办?显然都不是0呀。我们有办法(不是我想出来的,Lucas定理就可以用了。C(n,m)=C(n/p,m/p)*C(n%p,m%p)%p然后递归就好了。#include<bits/stdc++.h>#defin
2017-11-02 22:16:36 195
原创 bzoj5085 最大
题目最显然易见的做法就是枚举一条对角线的两个端点,不过,这样是过不了的。然后,就需要一些技巧了。我们先贪心地想一想,如果第一次选最大的两个点算,当然是不行的。。 但我们多做几次,是不是正确率就会变高呢。答案是显然的,我们就取出最大的一些数来算,这样就成O(num^2)了,之后,这个num^2如何选取呢。如果在考场上,就按极限取吧,只要不超时就行。这样如果我们的想法是对的,就会A。选取4*n其实就行
2017-11-02 22:12:27 382
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人