09 2018 档案
摘要:无向图的最小路径覆盖。 找出联通块里所有的奇度点,然后两个两个的点互相连边,构造成所有点都是偶度数。 然后就找联通块里有多少条欧拉回路,如果回路中有新加的边则答案++。 #include <bits/stdc++.h> using namespace std; const int M = 1e5+7
阅读全文
摘要:给一幅图,并且给出图里哪些是好点,哪些是坏点,问你这副图能不能被分成一个好点坏点图不矛盾。 我们先把给定了是好点或者坏点的点进行二分图染色,如果染出来是矛盾的就错误。 然后在把那些和已知点不在同一个联通块里的点随意指定初始颜色染色,染出来是矛盾的就错误。 #include <bits/stdc++.
阅读全文
摘要:让你找一幅图里有多少点集含有三元环或者三个独立点。 由拉姆塞定理可知六个人中必有三个人认识或三个人都不认识,所以超过6的点集都算。 ans = pow(2,n) - C(n,i) i属于[ 0 , 5 ] r然后再暴力计算[ 3 , 5 ]的点集里哪些属于合法的即可。 #include <bits/
阅读全文
摘要:water,给一个数n,问从1...n的数字里最少删去多少数字让剩下的数字必不可能组成三角形。 保留的数字必定是1、2、3、5、8、13、21.....这样的数字。 //#define test #include<bits/stdc++.h> using namespace std; const i
阅读全文
摘要:water //#define test #include<bits/stdc++.h> using namespace std; const int Nmax=1e6+7; typedef long long ll; struct LL { ll a,b; LL(){ } LL(ll aa,ll
阅读全文
摘要:构造一个n个数字的排列,使其作为 sigma( gcd( a[i] , a[i+1] ) ) 中第k小的排列。 因为题目给的 k*2 <= n ,所以可以知道只会询问最小到第 n/2 小,易得最多移动一个数字即可得到答案。 假设原始排列为1 2 3 ... n,如果询问最小直接输出排列,否则询问x且
阅读全文
摘要:给两个数组a , b,并给一个间隔值p。问在间隔值p下b在中有多少个匹配。 比如a数组为1 2 2 4 3,b数组为1 2 3,那么在间隔值为2的情况下有一个匹配。 把a数组中可以作为开头的所有间隔数字比如2可以开头的数字是1或者2,3可以开头的数字是1、2、3取出来。 然后做p次kmp即可。 //
阅读全文
摘要:给一个数字 n ,(1<=n<=1e18)。让你找一些数字加起来和为 n ,数字个数不超过50个而且数字都是回文数字。 每次找到大小最接近这个数的回文数即可。如6745888可以找到6745476,6960242可以找到6950595。 用大数模拟一下即可。 //#define test #incl
阅读全文
摘要:给一棵树,q次询问,每次询问给连续的一个闭区间,问区间所有数的LCA是多少。 做一个dfs序,其中把dfs序最小的点和最大的点做一次LCA求出的点就是答案。 #include <bits/stdc++.h> #define lson l,mid,rt<<1 #define rson mid+1,r,
阅读全文
摘要:给一颗树,其中树中有一些红色的点,每个点到距离它最近的祖先红点的距离称为它的距离。 每次给一个点子集,可以选择把树中任意一个点变为红色,问怎样让子集里的点的距离最大值最小。 当只有两个点时,肯定是先找到他们的 lca 然后先判断将 lca 染红是否可以让最大的距离变小,如果有一个点的祖先红点在 lc
阅读全文
摘要:AC自动机上搞矩阵快速幂。 #include<cstdio> #include<cstring> #include<queue> #include<algorithm> #include<map> using namespace std; const int Nmax=207; const int
阅读全文
摘要:一个背包dp。 //#define test #include<bits/stdc++.h> using namespace std; const int Nmax=1e4+7; const int Vmax=1e4; typedef long long ll; const ll mod=1e9+7
阅读全文
摘要:不知道题意,队友用java大数+二分过了? import java.util.Arrays; import java.util.Scanner; import java.io.*; import java.math.*; public class Main { static boolean chec
阅读全文
摘要:求一个串中出现次数在[L,R]区间里的子串一共有多少个,后缀数组用出现次数>=L的个数减去出现次数>R的个数就是答案。 //#define test #include<bits/stdc++.h> using namespace std; const int Nmax=250007; const i
阅读全文
摘要:water #include <bits/stdc++.h> using namespace std; int n,a,b,c; int main(){ while(~scanf("%d%d%d",&a,&b,&c)){ int ans=a*b*c; if(ans%2==0) printf("Yes
阅读全文
摘要:欧拉降幂求(A^B)%C,其中B超大。 //#define test #include<bits/stdc++.h> using namespace std; const int Nmax=1e6+7; typedef long long ll; const ll mod = 1e9+7; char
阅读全文
摘要:区间k覆盖费用流模板题。 离散化后让每个数字最多可用k次即可,源点向起点连边,终点向汇点连边,第i个点向第i+1个点连边,容量都为k,费用为0。 对于给的左闭右开区间,区间左端点向右端点连边,容量为1,费用为-val。 #include <bits/stdc++.h> using namespace
阅读全文
摘要:区间更新加法与乘法,x取反是2^64-x-1,由于取模所以取反变成-x-1,就区间*-1再-1就可以了,最后区间询问求和。 #include <bits/stdc++.h> #define pb push_back #define mp make_pair #define fi first #def
阅读全文
摘要:dp维护一下最大值与最小值,注意边界情况的判定。 #include <iostream> #include <cstring> using namespace std; const long long inf = (long long)1e18+(long long)9; long long dp[
阅读全文
摘要:water #include <bits/stdc++.h> #include <unordered_set> #include <unordered_map> #define pb push_back #define mp make_pair #define x first #define y s
阅读全文
摘要:给一幅无权无向无环图并给出它的一颗生成树,要求出一个最小割,并且最小割中有且仅有一条树边。 一条从u到v的非树边会让它从树上u到v路径上的边成为最小割的代价+1,所以考虑树链剖分把所有非树边作为更新来更新路径上边的代价。 因为只需要在最后找出最小的那条边,所以直接差分即可。 #include <bi
阅读全文
摘要:区间加一个数以及求区间GCD 由性质gcd(a,b)=gcd(a,b-a)可得区间gcd可变为: gcd( a[l], a[l+1], a[l+2],..., a[r] ) = gcd( a[l], a[l+1] - a[l] , a[l+2] - a[l+1] ,..., a[r] - a[r-1
阅读全文
摘要:给n个数,再给q次询问,每次询问回答区间[l,r]的a[l]%a[l+1]%a[l+2]%a[l+3]....%a[r]的答案。 可以知道只有当一个数遇到一个比它小的数答案才会改变且取模最多log次就会停止,所以用线段树暴力寻找一个数右边第一个比它小的数即可。 #include <bits/stdc
阅读全文
摘要:给n个数,q次询问,每次问区间[l,r]的GCD以及整个区间内有多少个gcd为此的区间。 求区间gcd很好求,而有多少个这样的gcd,可以预处理出区间所有的gcd,因为一个n个数的区间最多有logn种gcd,所有暴力枚举即可。 #include <bits/stdc++.h> #define pb
阅读全文
摘要:带权并查集食物链(模3系),三个物种,给一些关系,同类、被吃、吃。问哪些关系是错的。 同类关系是0,点吃根节点的关系是1,根节点吃点关系是2即可。 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #
阅读全文
摘要:带权并查集模2系,也就是给一些关系 ,这些关系是是否同类。问有多少关系错的。 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const int M = 2
阅读全文
摘要:逆序并查集 #include <bits/stdc++.h> #define pb push_back #define mp make_pair #define x first #define y second #define lson l,mid,rt<<1 #define rson mid+1,
阅读全文
摘要:有一个有300个座位的圆,现在给出n个两个人间的座位信息,问有几个信息是错误的。 当一个信息和前面的信息矛盾被认为是错误的。 一个模300系的带权并查集。势能高的向势能低的树合并,合并时压缩路径并将相对于根节点的势能更新。 #include <bits/stdc++.h> #define pb pu
阅读全文
摘要:给一个数n,要把这个数分成m个数,这m个数的和n,且要求或起来的答案最小。 因为要或,所以易知m个数中最高位最小且尽量均分即可。 均分的时候先确定一个最高位,然后从最高位向低位填数字,如果一位能填则尽量填满即可。 chawa大数模拟一哈就好了。 import java.util.*; import
阅读全文
摘要:给一个大圆,圆内有很多点,问大圆随机缩成一个固定半径的小圆后哪些点在小圆内的概率最大。 可以肯定点距离大圆边界的距离大于2*r那么这些点必然都是概率最大的,如果不存在这样的点,就找出离圆心最近的那些点即可。 #include <bits/stdc++.h> #define pb push_back
阅读全文
摘要:贪心 #include <bits/stdc++.h> #define pb push_back #define mp make_pair #define x first #define y second #define lson l,mid,rt<<1 #define rson mid+1,r,r
阅读全文
摘要:water #include <bits/stdc++.h> #define pb push_back #define mp make_pair #define x first #define y second #define lson l,mid,rt<<1 #define rson mid+1,
阅读全文
摘要:water #include <bits/stdc++.h> #define mem(x) memset(x,0,sizeof(x)) #define LMissher using namespace std; int _,ans,tot,tmp; char s[15]; int flg[15];
阅读全文
摘要:有m个桌子组成的圆环,n个人坐在圆环里。(m>=n) 有q个A题信息,机器人负责给A题的人发气球,但是机器人只能顺时针走。 所有人们会有愤怒值,交题与获得气球的时间差为愤怒值,要求使得愤怒值之和最小。 考虑三点的圆环,发现其实所有的交题信息都可以转化为最多不同的三个状态。因为在一个环上从一点到另一点
阅读全文
摘要:有n个数字,不知道具体是多少,给q个信息。 每个信息给一个区间[l,r]。并告诉这个区间的奇数有多少个,问第一个错误的信息是第几个。 可以把每个区间的左端点-1的根看做右端点的根的根,用并查集维护一个到根点的1的个数是奇数还是偶数即可。 注意得离散化。 #include <cstdio> #incl
阅读全文
摘要:每个信息给一个子区间[l,r]的和,问有多少信息是错误的。 子区间[l,r]的和可以知道是由r的前缀和减去l-1的前缀和。 所以presum[r]-presum[l-1]=sum[l,r]。所有可以把每个数字当成一个节点,两个节点间的势差为sum。 用并查集维护联通块及所有点与根节点的势差,那么如果
阅读全文
摘要:一个城市有一个龙珠,每次两个操作,第一个操作把一个城市的龙珠移到另一个城市。 第二个操作询问第i个龙珠在哪个城市以及那个城市的size以及这个龙珠的转移次数。 用并查集维护一个联通块的size以及一个转换次数cnt。 每次合并联通块的时候把根节点的cnt++,然后在find的时候做压缩路径以及字节点
阅读全文
摘要:初始有n堆东西每堆一个物品,有两个操作,第一个把含有第x个物品的那堆物品放到含有第y个物品的那堆物品上。 第二个询问第x个物品下面有多少物品。 用并查集维护一个联通块的size以及每个节点到根节点的距离。 第一个操作的时候size[root[x]]+=size[root[y]]并且y的根节点的距离更
阅读全文
摘要:water #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <vector> using namespace std; const int M = 1007; int f[M],r
阅读全文
摘要:每个火车头能拉走连续的k个货箱,三个火车头可以拉的最大货箱重量是多少。 dp[i][j]表示i个火车头在前j个火车头里可以拉的最大货箱重量。 dp+记忆化搜索。 #include <cstdio> #include <cstring> #include <cmath> #include <algor
阅读全文
摘要:给定一些字符集,将字符集中的字符从字符串中删除或增加需要一些代价,问构造一个回文串的最小代价。 因为删除与增加本质是相同的,所以只保存代价最小的然后进行字符的删除。 考虑区间转移,然后存下所有区间的最小状态即可。 #include <cstdio> #include <cstring> #inclu
阅读全文
摘要:水题,照着给的式子记忆化搜索即可。 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; typedef long long ll; int i,j,k; ll d
阅读全文
摘要:给一个数,两个人轮流把这个切成k段并把k段加和给下一个人切,谁先无法切谁就失败。 dfs+博弈 具体看代码注释 #include <bits/stdc++.h> #define pb push_back #define mp make_pair #define x first #define y s
阅读全文
摘要:有三种操作,第一种把+v,第二种-v,第三种*-1。现在先手的会让最后的值最大,后手的让最后的值最小。 所有操作后的值在区间[-100,100]内,问最后的值是多少。 因为所有的值只有200种可能性,所有每个操作之后最多可能也只有200种值。 那么记忆化搜索把每个操作之后的状态存下来就避免了暴力搜索
阅读全文
摘要:一只老鼠从(1,1)出发每次最远只能水平或竖直移动不超过k个曼哈顿距离,且能移动到下一个点的条件是下一个点的权值大于现在这个点。 记忆化搜索。搜索状态是(行,列),直接四个方向上的k种移动方式枚举然后取max保存就好。 #include <bits/stdc++.h> #define pb push
阅读全文
摘要:给n个以原点为左下角的矩形,求最后图形右边界和上边界的周长和。 从后向前放矩形,线段树维护每个点左边最近的距离及下面最近的距离即可。 #include <bits/stdc++.h> #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 #def
阅读全文
摘要:求出最大生成树之后求LCA即可。 #pragma comment(linker, "/STACK:1024000000,1024000000") #include <iostream> #include <stdio.h> #include <iomanip> #include <algorithm
阅读全文
摘要:正式比赛线段树第一题。 很裸的线段树,维护一个区间和及答案,答案由左右两边的答案及左边的区间和乘上右边的长度可得。 求答案的时候要线段树合并。 #include <bits/stdc++.h> #include <unordered_set> #include <unordered_map> #de
阅读全文
摘要:维护每个字符出现的次数即可 #include <bits/stdc++.h> #define pb push_back #define mp make_pair #define mem(x) memset(x,0,sizeof(x)) #define mem1(x) memset(x,-1,size
阅读全文
摘要:签到题~ #include <iostream> using namespace std; inline int Abs(int x) { return (x>0?x:(-x)); } int main() { char s[100007]; char ans[300007]; char se,c;
阅读全文
摘要:给一颗树,两种操作,一种把同一层的点权值加上v,另一种求一点下的子树权值和。 按层数中点个数分块,小块直接暴力把所有点用bit更新,大块把层的值存下来。 询问的时候子树权值和为bit中的值以及其下面的点在大块中的值,下面中的点在大块中的值用二分实现。 #include <bits/stdc++.h>
阅读全文
摘要:容斥+状压 #include<bits/stdc++.h> using namespace std; typedef long long ll; const ll MOD = 1e9+7; #include<vector> //const int MAX = 110; const int N = 1
阅读全文
摘要:正解应该是上下界网络流模板题,被队友用贪心水过去了。 #include <bits/stdc++.h> #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 #define up rt,rt<<1,rt<<1|1 #define mem(x) m
阅读全文
摘要:容易想到不存在超过三位的数满足条件,打表找出所有三位及以下的数。 #include <iostream> #include <cmath> #include <cstring> using namespace std; bool IP(int x) { //bool flag=1; for(int
阅读全文
摘要:k短路模板题。 #include <bits/stdc++.h> #define mem(x) memset(x,0,sizeof(x)) #define mem1(x) memset(x,-1,sizeof(x)) using namespace std; const int M = 1005;
阅读全文
摘要:水题,进制转换之后用字典树模拟。 #include <bits/stdc++.h> #define cls(x) memset(x,0,sizeof(x)) #define REP(i,x,y) for(i=x;i<=y;i++) using namespace std; const int M =
阅读全文
摘要:求一个点到另一个点的路径中最大的最小边。和poj2253一模一样。 松弛操作改成if(d[v]<min(d[u],w)) d[v]=min(d[u],w); 即可。 也可以用最大生成树树即可。 最大生成树中两点间的那条路径中的最小值必是所有路径中最大的最小值。
阅读全文
摘要:求一个点到另一个点的路径中最小的最大边。 松弛操作改成if(d[v]>max(d[u],w)) d[v]=max(d[u],w); 即可。
阅读全文
摘要:题意是把一幅图分成n层,在第x层的点可以去x+1层,x+1层的点也可以返回x层,花费为c。 再额外给m条边,问1到n的最短路。 建图的时候新建n个节点,每个节点表示第i层的顶点,顶点向第i层每个点连有向边,边权为0,同时原始点向其下一层和上一层的顶点连有向边,边权为c。表示这一层的点可以通过顶点花费
阅读全文
摘要:拓扑排序找环模题,如果一次排序所有点不能全部删除则有环,因为环的所有点入度为1。 #include <bits/stdc++.h> #include <unordered_set> #include <unordered_map> #define pb push_back #define mp ma
阅读全文
摘要:给一幅图,边从0开始每天多一条边,问每天增加边之后能够有多少人去旅游。 能去旅游的定义是只有当联通的点的度数都大于才能去旅游,否则都不能去旅游。 考虑从后往前遍历删边,当有点的度数小于k时将这个点从图中删去并把它的边删去。 #include <bits/stdc++.h> using namespa
阅读全文
摘要:给一个树上的BFS序列问是否合法,BFS都以1为根节点。 第一种做法比较容易想到,每遇到一个节点查找它后面的size节点是否在子树里在就推入队列,有不在的就不合法。 #include <bits/stdc++.h> #define lson l,mid,rt<<1 #define rson mid+
阅读全文
摘要:和hdu5023一样不过询问不同。 #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <iostream> #define lson l,mid,rt<<1 #define rson
阅读全文
摘要:染色覆盖问题,有q次操作,每次操作可以把一个区间染成一种颜色或者把询问一个区间有多少中颜色。 把一个区间拆分成线段树中的一个一个的小区间,查询的时候也一样,当我们要染的区间是一个大区间的一部分且大区间有颜色时,把大区间的颜色pushdown。 查询时当线段树的区间包含了我们要查询的区间就返回这个区间
阅读全文
摘要:分层图最短路模板题。 #include <bits/stdc++.h> using namespace std; typedef long long ll; const ll inf = 1e18; const int M = 1e5+7; int n,m,cnt,head[M],flag[M][2
阅读全文
摘要:题意是给一幅图可以把k条边权值变为0,求最短路。 分层图裸题,分层图忘完了啊,上次做分层图还是很久以前了,不过套了个板子过了。 分层图就是再开一维数组记录额外的状态,这道题可以把k条边权值变为0,那多开的那一维数组j就表示有j条边权值为0,做个dp就好。 #include <bits/stdc++.
阅读全文
摘要:一道模拟题,每次给一个值只需要找从左到右第一个小于它的值,用线段树维护一个区间最小值即可。 只有当左儿子的最小值大于当前值才去找右儿子。 当时好像我们集体读错题了,但是我的代码依然可以a,不过忘了判断kkk是不是-1是真的真的真的很难受。 #pragma comment(linker, "/STAC
阅读全文

浙公网安备 33010602011771号