
刷题总结
wanherun
今天会有好事发生吗
展开
-
bzoj3713 [PA2014]Iloczyn
这里写链接内容第一眼看题,哇,smg,难道是高级的什么什么吗。。。后来发现,枚举就好了,因为10^9以内的斐波那契数很少,只有45个左右,这样就成水题了。没有代码。附: 话说这道题让我想起了很早以前的一道题: 大概题意是给你10^5个数(int范围内),让你选出3个,使其能构成三角形,字典序最小。当时怎么想都只会O(n^2),之后某dalao告诉我,直接排序后枚举前50个就好了,原因也是如此。如原创 2017-08-28 20:45:48 · 415 阅读 · 0 评论 -
bzoj1045 [HAOI2008] 糖果传递
题目这又又又是一道普及组题,和某heoi题很像啊。。。。#include<cstdio>#include<iostream>#include<algorithm>#define N 10000000using namespace std;int n,A[N+2],ave;int C[N+2],mid;long long sum,Ans;void read(int &x){原创 2017-09-07 14:23:34 · 237 阅读 · 0 评论 -
bzoj2222 [Cqoi2006]猜数游戏
题目无话可说的编号与题,貌似网上都没有正解,都是打的表233。 我也来一发。#include<iostream>#include<cstdio>using namespace std;int n;int main(){ scanf("%d",&n); if (n==296) {printf("13\n"); return 0;} if (n==6) {prin原创 2017-09-07 14:24:10 · 995 阅读 · 0 评论 -
bzoj2299 [HAOI2011]向量
题目浓浓的数学气息。参考裴蜀定理。百度百科#include<bits/stdc++.h>using namespace std;long long T,a,b,x,y,d;inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000原创 2017-09-24 20:35:21 · 286 阅读 · 0 评论 -
bzoj1000 A+B Problem
题目震惊,为什么A+B problem 会有题解,但是,它就有(强迫症伤不起啊)#include<cstdio>main(){ int a,b; scanf("%d%d",&a,&b); printf("%d",a+b);}呀哈哈哈哈哈哈原创 2017-09-10 19:32:19 · 230 阅读 · 0 评论 -
bzoj1083 [SCOI2005]繁忙的都市
题目一道最小生成树的裸题233。贴个版子#include<bits/stdc++.h>using namespace std;int f[301];int n,m,num;int Ans;struct edge{ int x; int y; int w; void read(){ scanf("%d%d%d",&x,&y,&w); }原创 2017-09-02 20:52:00 · 352 阅读 · 0 评论 -
bzoj1087 [SCOI2005]互不侵犯King
题目状压dp的一道题,还是比较简单的。一遍自己AC,可以的。#include<bits/stdc++.h>#define LL long longusing namespace std;int n,k;int way[500],size;int lar[500];bool kx[500][500];LL dp[10][500][100];LL Ans;void write(int原创 2017-09-02 20:52:21 · 323 阅读 · 0 评论 -
noip2015 游记+总结+题解
2015年,感觉离现在是那么近,但好像又那么远,当时做梦都想不到的事,现在却身在其中。那一年,我初中毕业了。好了,不扯怎么多了,进入正题吧。地点当然是清水河校区了。还在初三,第一次参加提高组,还是比较紧张的。D1T1:当然是水题,模拟填一个幻方就好了,是openoj上的原题。 D1T2:现在来看,又是水题,直接tarjan缩点就好了,但当时并没有想出来,写的是最裸最裸的搜索,当然过不了了,要是这道原创 2017-10-22 17:11:59 · 390 阅读 · 2 评论 -
poj3683 Priest John's Busiest Day
题目2-sat问题,要求要输出方案。先考虑建模,把每个婚礼都拆成两个部分。对于两个婚礼,A,B,用A,B表示开始,A’,B’表示结束,如果A与B,B’都冲突的话,A就不能选,连向A’,否则只有一个冲突的话,A连B’,A’连B。这样图就建好了,那么如何输出方案呢,一般tarjan后跑一个拓扑序就好了,但是有更好的方案,tarjan相当于就是一个拓扑了,最后只要A与A’谁的强连通分量编号小就选谁就好了。原创 2018-01-27 08:56:07 · 231 阅读 · 0 评论 -
loj6157 A^B Problem
题目树上一条路径上边权的异或,显然相当于两个到根的异或再异或起来。 这样,相当于我们每次都知道到根的异或值。这样我们就可以并查集处理了,记录到根的异或值,每次判断一下就好了。#include<bits/stdc++.h>#define N 500000 using namespace std;int T,n,m,x,y,f[N+5],w[N+5],z,flg;int u[N+5],v[N+原创 2018-01-27 08:38:18 · 393 阅读 · 0 评论 -
bzoj1467 Pku3243 clever Y
题目扩展BSGS,模数改成任意数了,本质和一般的还是一样的,只是需要把X与K推一推公式让他们互质就好了。具体细节在代码中有体现。#include<bits/stdc++.h>#define ll long longusing namespace std;ll a,b,p;ll gcd(ll a,ll b){ return b?gcd(b,a%b):a;}ll BSGS(ll a原创 2018-01-27 08:24:48 · 736 阅读 · 0 评论 -
bzoj3331 [BeiJing2013]压力
题目显然,如果两个点之间要有一个必须到达的点,这个点必须是割点。只要我们求出点双联通分量,然后对图重构,在新得到的树上做就好了。我们在树上就可以差分了,最后求一个子树和就好了。#include<bits/stdc++.h>#define N 500000 using namespace std;int first[N+5],nxt[N+5],to[N+5],siz;int First[N+5原创 2018-01-27 08:17:12 · 549 阅读 · 0 评论 -
bzoj3028 食物
题目母函数,数学题,大概就是推公式吧。承德汉堡:1+x2+x4+⋯=11−x21+x^2+x^4+\dots=\frac{1}{1-x^2} 可乐:1+x1+x 鸡腿:1+x+x21+x+x^2 蜜桃多:x+x3+x5+⋯=x1−x2x+x^3+x^5+\dots=\frac{x}{1-x^2} 鸡块:1+x4+x8+⋯=11−x41+x^4+x^8+\dots=\frac{1}{1-x^4原创 2018-01-23 14:01:52 · 359 阅读 · 0 评论 -
bzoj3969 [WF2013]Low Power
题目看见最大值最小,明显可以看出这是一道二分答案的题。如何判断呢。首先,我们先对原数组排序,这样每次的差最小一定会在两个相邻的数之间。所以排好序之后,判断的时候,只要从前往后扫,只要相邻两个数的差小于二分的答案x,就把它们放入一个电池,然后把剩下的电池依次放入,判断每个时刻是否可行就好了。#include<bits/stdc++.h>#define N 1000005using namespac原创 2018-01-22 07:53:00 · 408 阅读 · 0 评论 -
codeforces438 D The Child and Sequence
题目一句话题意:支持区间取模,单点修改,区间求和的数据结构。后两个操作都是可以线段树操作的,但是第一个貌似就特别麻烦了。貌似不可做的样子呀,但是,我们可以发现一个性质如果x>yx>y那么xmody≤x2x\mod y\leq \frac{x}{2}的,这样的话,我们可以维护一下区间最大值,如果小于模数,就直接return,不然暴力做就好了。复杂度可以用势能分析得出是对的,我也不太会,就不多说了//区原创 2018-01-19 11:09:00 · 215 阅读 · 0 评论 -
bzoj4320 ShangHai2006 Homework
题目学习了一种新知识,根号分治,也叫bigsmall。其主旨思想就是把每个问题分成大于n √ \sqrt{n}与小于n √ \sqrt{n}的来考虑。对于这道题,我们可以对Y分类。记m=n √ m=\sqrt{n} 1.如果Y≤m Y\leq m,可以用一个数组g[i],表示当前集合中%i最小的数,每次询问是O(1)的,修改是O(m)的。 2.如果Y>m Y>m,我们原创 2018-01-19 10:28:50 · 303 阅读 · 0 评论 -
hdu1542 Atlantis
题目矩形面积并基础题。考虑把每一个矩形按照边界分成小矩形,用扫描线就好了,然后就是统计另一个方向上的长度,这个用线段树维护一下就好了。比如这张图,大概就是这样分割的,对于x轴的一段,对应了y轴上的一部分。这样,就可以x轴扫面线,然后y轴线段树区间修改就好了。这个线段树也比较好写,不需要pushdown操作,因为每次我们只需要整个的长度。还有一点,这道题的坐标都是double类型的,就先离散化一下,至原创 2018-01-19 10:15:37 · 191 阅读 · 0 评论 -
hdu6031 Innumerable Ancestors
题目答案明显满足二分性质,所以我们可以先二分出答案的深度,然后判断的话,把A集合用倍增跳到那个深度,再对B集合做同样的操作,判断两个祖先集合的交是否为空集,只要用map就可以呢。还有另外一个解法,就是深度最大的LCA在DFS序中与它们两点距离最近,然后贪一贪就好了。#include<bits/stdc++.h>#define N 500000using namespace std;int n,原创 2018-01-17 22:27:45 · 424 阅读 · 1 评论 -
hdu 5927 Auxiliary Set
题目首先,我们先发现一下性质,先按照深度从大到小排序,对于每一个结点,只用考虑它的儿子结点为重要的点的个数,如果大于等于两个,那么这个点就是;等于一的话,对答案没有贡献,但是对于它的父亲可能会有贡献;为0的话,对父亲完全没有贡献,这就需要把父亲结点的儿子个数减一就好了。#include<bits/stdc++.h>#define N 500000using namespace std;int原创 2018-01-17 22:05:30 · 196 阅读 · 0 评论 -
bzoj2480 Spoj3105 Mod
题目扩展BSGS,当时调了我很久,原因竟是p可以等于1,233。太惨了,这个可得好好注意一下呀。大致思路和一般BSGS差不多,就是要多推几步,然后就一样了。//ex_BSGS#include<bits/stdc++.h>#define ll long longusing namespace std;ll a,b,p;ll gcd(ll a,ll b){ return b?gcd(原创 2018-01-17 20:26:15 · 315 阅读 · 0 评论 -
hdu5929 Basic Data Structure
题目咋一看是很毒瘤的数据结构,但是仔细观察一下nand这个运算,可以得到一个结论:答案只和末尾的1的个数的奇偶性有关,这样的话,就可以随便做了。我写的是二分加树状数组,可能比较慢。实现的细节很多,比如处理只有一个数的情况,还有连续一段1后面还有几个数之类的,反正特别麻烦,练习码力吧。#include<bits/stdc++.h>#define N 1000000using namespace s原创 2018-01-17 20:40:09 · 441 阅读 · 1 评论 -
bzoj3239 Discrete Logging
题目离散对数裸题,这道题中p是素数,所以用一般BSGS就好了,这个东西十分巧妙呀。ax≡b(mod p)a^x\equiv b(mod\ p)我们可以设x=Ap√+Bx=A\sqrt{p}+B,其中,0≤A≤p√0\leq A\leq \sqrt{p},0≤Bp√ 0 \leq B。 那么,我们可以得到aAp√≡ba−B(mod p)a^{A\sqrt{p}} \equiv ba^{-B原创 2018-01-17 20:11:14 · 288 阅读 · 0 评论 -
bzoj1823 [JSOI2010]满汉全席
题目2-sat裸题,最近刚刚学了这个东西,毕竟NOI考过呀。建边就是考虑限制条件如果x选什么,y就一定选什么之类的,然后跑一遍tarjan缩点,如果存在一个点和它的相反点在一个强连通分量中,那么就没解,否则一定有解。至于输出一个解,只要看mark的大小就好了,选小的就好了。#include<bits/stdc++.h>#define N 100000using namespace std;in原创 2018-01-15 21:46:31 · 489 阅读 · 0 评论 -
bzoj5090 组题
题目好久好久没有更新博客了,现在开始要好好学了。分数规划第一题吧,第一次听说这个东西是在冬令营,现在算是做过一道题了吧。二分最后的答案,之后把原数组每个数都减去这个答案,如果这个解成立的话,必须有一段区间和为正数,这样的话,我们把它转化为前缀和,只要找一个sum[j]>=sum[i]sum[j]>=sum[i]就好了。但是,这道题有一个问题,就是答案要求是分数,这样我们只能求出一个小数。我们就要在判原创 2018-01-15 20:11:53 · 370 阅读 · 0 评论 -
bzoj3406 [Usaco2009 Oct]Invasion of the Milkweed 乳草的入侵
题目BFS经典例题吧。从起点开始入队,就好了。值得注意的是,可以向八个方向拓展。。#include<cstdio>struct sb{ int x,y,day};const int dx[8]={1,0,-1,0,1,-1,-1,1};const int dy[8]={0,1,0,-1,1,-1,1,-1};int n,m,mx,my;int r,c;sb hs[20000];原创 2017-12-10 09:49:23 · 636 阅读 · 0 评论 -
bzoj2764 [JLOI2011]基因补全
题目大概又是一道dp题吧,把碱基先处理一下,就成为匹配方案数了,就是简单dp。f[i]表示前j个的方案数。转移就是:f[j]=f[j]+f[j−1](A[i]==B[j])f[j]=f[j]+f[j-1](A[i]==B[j])注意枚举顺序,m要从后面开始。比较麻烦的是,要用高精度才能过去。#include<bits/stdc++.h>using namespace std;struct big原创 2017-12-10 09:44:16 · 374 阅读 · 0 评论 -
bzoj3411 [Usaco2009 Dec]Bobsledding 高山滑雪
题目贪心题目。。如果知道一段路程的起始速度和终点的限制速度,那么最大速度就可以很轻松的求出来。但是,有一点值得注意,每一个点的速度限制可能是假的,因为如果到了最大速度,到下一个点速度可能降不下去。所以,就要先从后往前扫一遍来重新算速度。之后就是分类讨论了。#include<bits/stdc++.h>#define N 100000using namespace std;int n,L,v,a原创 2017-12-10 09:28:20 · 407 阅读 · 0 评论 -
bzoj3018 [Usaco2012 Nov]Distant Pastures
题目一开始还被吓了一跳,但是,仔细想想也很简单。题目翻译有毒。。 D(S,T)是S到T的最短距离。。这样,我们只需要枚举起点,然后跑一边最短路,求一下最大值就好了。#include<bits/stdc++.h>using namespace std;int n,A,B,id[35][35],ans,dis[1005],vis[1005];char mp[35][35];int first[原创 2017-12-10 09:18:57 · 414 阅读 · 0 评论 -
bzoj4742 [Usaco2016 Dec]Team Building
题目一眼dp题,对吧,然后就是考虑状态的表示与转移了。有两个数组,f[i][j]是肯定要有的,然后选k个,最终状态就为f[i][j][k]就好了。表示a中前i个与b中前j个,选出了k个的方案数。(当然顺序对于这道题没有影响,但是要先排一个序。)转移:f[i][j][k]=f[i−1][j][k]+f[i][j−1][k]−f[i−1][j−1][k]f[i][j][k]=f[i-1][j][k]+f原创 2017-12-10 09:08:30 · 349 阅读 · 0 评论 -
bzoj2760 [JLOI2011]小A的烦恼
题目大模拟题,这种题就是要细心才行,比如noip2017的d1t2就是这样的,没什么难度。对于这道题,可以用STL来优化,这也不失为一种好办法来加快代码速度。STL就是要多练。#include<bits/stdc++.h>#define N 1000using namespace std;int total,m;string ans[N+5],name;int cnt[N+5];int原创 2017-12-08 11:34:59 · 555 阅读 · 0 评论 -
bzoj3438 小M的作物
题目一眼最小割,其实和大多模型是一样的。也比较套路,就是用总价值减去最小割就好了,对于这道题。源点连向耕地再连向汇点,对于每一个额外收益,然后拆成两个点,之后的连法也就差不多了。#include<bits/stdc++.h>#define inf 100000000#define N 4100010 using namespace std;int dis[N+5],first[N+5],n原创 2017-12-03 19:37:24 · 300 阅读 · 0 评论 -
bzoj3994 [SDOI2015]约数个数和
题目反演的经典套路题目。对于这种题,套路无非就是先用狄利克雷卷积一下,然后交换求和顺序,最后就能化为一个 n√\sqrt n的求和了。对于交换顺序这个事,只要注意一下各个变量的依赖关系就好了。对于这道题来说:∑ni=1∑mj=1d(i,j)=∑ni=1∑mj=1[ni][mj][gcd(i,j)==1]\sum_{i=1}^n \sum_{j=1}^md(i,j)=\sum_{i=1}^n \sum原创 2017-12-03 19:27:53 · 446 阅读 · 0 评论 -
[poj2369]Permutations
一句话题意:求一个排列的所有循环的最小公倍数。正好前几天因为牛排序而知道了这个东西,做一做模板题练一练手。其主要思想就是两个数组互相迭代,可以用简单的例子来模拟一下也是可以的。#include<cstdio>#include<cstdlib>#include<cmath>#include<algorithm>#include<string>#include<cstring>#includ原创 2017-12-03 18:58:23 · 302 阅读 · 0 评论 -
[hdu1599]find the mincost route
一句话题意:求无向图的最小环的长度。emm,这应该算是模板题或者叫floyd的经典应用吧。#include<bits/stdc++.h>#define inf 100000000using namespace std;int n,m,x,y,z;int f[105][105],g[105][105];inline void floyd(){ int mini=inf; f原创 2017-12-03 18:54:52 · 325 阅读 · 0 评论 -
[Usaco]麦香牛块
说实话,我也不知道这道题我到底对不对,反正各个网站的数据都过了,但是还是有些虚。我们首先知道,对于a,b两个数,设d=gcd(a,b),那么对于任意c>=ab且d|c,一定存在正整数x,y,使得ax+by=c成立。对于这道题,我们先考虑无限的情况,我目前就想到一种,这n个数的最大公因数为d不为1,那么它们对于非d的倍数都无法构成。再根据今年noipd1td1得(233),最大的应该不超过最大数的平方原创 2017-12-03 18:51:42 · 686 阅读 · 0 评论 -
bzoj2134 单选错位
题目博客要开始更新了。毕竟noip也算过去了。这差不多又是一道数学题,我们这样考虑:对于一道答案有a种情况,会选b种可能的题,两两排一下,一共有ab种情况,而符合条件的只有min(a,b)种,那么,期望为(1/ab)*min(a,b),也就是1/max(a,b)。之后就是O(n)累加就好了。#include<bits/stdc++.h>#define N 10000000using namesp原创 2017-12-03 18:43:07 · 291 阅读 · 0 评论 -
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 · 407 阅读 · 0 评论 -
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 · 262 阅读 · 0 评论 -
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 · 300 阅读 · 0 评论 -
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 · 433 阅读 · 0 评论