自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(98)
  • 收藏
  • 关注

原创 Codeforces Round #686 (E,F)

E 一直一颗基环树,问有多少种简单路径。先找到这个环,然后环上每个点为根连接的环外的点会构成一个树,这棵树内两两构成一条路径,与每个树外节点都构成两条路径(分别走环的两端)。#include<iostream>#include<cstring>#include<cstdio> using namespace std;typedef long long ll;const int N=200010; int n,m,t;int h[N],e[N<&

2020-11-27 17:53:52 1

原创 AtCoder Beginner Contest 184

C - Super Ryuma每个点可以到的区域可以分为两种情况:方式1.以起点为原点直线 y=x 和 直线 y=-x 上的点;方式2.与起点曼哈顿距离小于等于3的点,任意两点之间至多需要移动三次,过起点做斜率为1的直线,以重点做斜率为-1的直线(交换一下也可以),一定有交点,如果交点坐标都为整数,则两次就可以,否则就要三次(偏移一个单位即可移动两次)。#include<iostream>#include<cstdio>#include<cstring>

2020-11-23 21:51:40 38

原创 P3380 【模板】二逼平衡树(树套树)

排名,修改,前驱和后继通过平衡树都很好实现,查询排名为k的值不是很好实现,因为这个区间可能在线段树的多个区间内,就需要在多棵平衡树中找,合并也不太现实,换个思路:二分值,找到排名小于k的最大值,然后在对它求一个后继就好了。#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#include<cstdlib>using namespace std;

2020-11-17 19:33:08 601

原创 Tree Requests [CodeForces - 570D]

传送门dsu on tree 的经典题能组成回文串的前提是至多有一种字符是奇数个,统计同一深度下各种字符个数即可。启发式合并即可优雅的暴力统计。ps:一直wa41,也找不到错误,看了样例才发现输入中多了一个空行,我是单个字符读入的。又发现一个新的wa题方法。。。#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<vector>

2020-11-11 17:32:05 41

原创 2020 ccpc长春 F Strange Memory (树上启发式合并)

直接暴力每颗子树复杂度是O(n2n^2n2)的,树上启发式算法是可以将复杂度优化到O(nlogn)的。启发式算法是基于人类的经验和直观感觉,对一些算法的优化。举个栗子:并查集的按秩合并,合并时将秩(集合的高度)小的集合合并到秩大集合上去。对于树来说也是可以的,不过合并树的话就不能看高度了,而要看树的节点数量,沿用树链剖分的轻重儿子的概念,就是将轻儿子的子树的贡献合并到重儿子的子树上去。#include<iostream>#include<cstdio>#include&.

2020-11-11 10:54:13 183

原创 区间的连续段 (倍增)

f[i][j]表示:以i为起点跳过2j2^j2j个区间后最远能跳到的点(该点不在区间)。j>0时 f[i][j]=f[f[i][j-1][j-1];j=0时就得令外找了,双指针扫一遍就好。最终要找区间[l,r]的值,从l出发一直向后跳,最后一个区间不一定最大,所以一直跳到离r最近的点即可。#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#incl.

2020-11-06 10:37:14 17

原创 P1503 鬼子进村(平衡树)

传送门第一次写fhq平衡树,写个博客纪念一下,附全部模板#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#include<cstdlib>using namespace std;typedef long long ll;const int N=500010;int n,m,cnt,root;struct node{ int l,r,

2020-10-22 16:59:30 23

原创 SP10707 COT2 - Count on a tree II (树上莫队)

传送门普通莫队是对一段一维的序列上操作的算法,即使带修莫队也是增加一个时间轴修改的序列也是一维的,如果对于一个树能否操作呢?可以将对树处理成一个欧拉序来实现,欧拉序是在dfs序的基础上在绕回每个点时将这个点填进去的序列。举个例子:dfs序:12345678欧拉序:1233445526778861定义:s[i]表示节点i入栈的时间戳,t[i]表示节点i出栈的时间戳。所以欧拉序的长度是2n的,对树上两点u和v之间的路径有两种情况(假设u的深度比v小):u是v的祖先:那么s[u]到s[v]之间的点(

2020-10-21 22:37:48 22

原创 P2051 [AHOI2009]中国象棋 (dp)

传送门n和m太大了,状压dp不行。换一种方式:定义f[i][j][k]为前i行中有就 j 列放了一个,k列放了2个的方案数。总共有m列,什么也没放的有 s=m-j-k 列。第 i 行有三种选择不放,放一个(放s或j中,k已经放不下了),放两个(全放s,一个s一个j,两个j),需要注意一直保持 s+j+k=m。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=110;const

2020-10-10 23:08:13 20

原创 2019 蓝桥杯省赛 B 组模拟赛(一)

传送门D. 结果填空:马的管辖爆搜,总的状态只有2252^{25}225个,判断每个状态是否成立。#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef long long ll;#define rint register int const int N=200010;#define fi first

2020-10-10 22:25:31 34

原创 P1505 [国家集训队]旅游 (树链剖分)

传送门很明显是树链剖分,因为是边权,所以将每个边权给深度大的那个点可以了,根节点不用赋值,要求最大值和最小值,所以线段树不包含根节点。因为点是从0编号的,所以父节点和重儿子数组要初始化。#include<iostream>#include<cstring>#include<cstdio>using namespace std;const int N=200010,inf=0x3f3f3f3f;int n,m,a[N],b[N],c[N],h[N],e[N&l

2020-10-09 23:54:54 1897

原创 P3293 [SCOI2016]美味 (主席树)

传送门要求最大的异或值,最先想到的就是tire树了,又有区间的限制,就试了试可持久化tire树,然后发现+x没办法处理,遂自闭。题解的思路真是妙啊,还是借助tire的思想,假设 b 的第 i 位是0,那么就找 a[j]+x是否存在第 i 位是1 的数,反之亦然,要保证异或值最大嘛。怎么去找呢,定义一个变量num表示第 i 位之前使异或值最大的那个数(仅考虑第i位之前的 a[j]+x),第 i 位如果是0,a[j]+x的第 i 位就尽量填1,就是a[j]+x要属于区间 [ 2i2^i2i,2i+1−12^

2020-10-09 10:48:53 30

原创 SUM OF SUB RECTANGLE AREAS (矩阵快速幂+高精度+压位)

题目链接打表可以发现ans[n]是完全平方数,令f[n]=sqrt(ans[n])可以求得 f]n]=3 * f[n-1] - 3 * f[n-2] + f[n-3] + 1;所以可以用矩阵快速幂求得,答案爆ll,还得套高精度模板,如果高精度每一位都存个位数还是会超时,所以还得压位。#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#include<

2020-10-02 21:32:47 28

原创 数颜色

题目链接查询某种颜色c在区间[l,r]有几个,可以直接把每种颜色出现的位置保存并递增排列,然后计算有几个位置是在区间[l,r]内的,二分就可以了。如果a[x]==a[x+1]那么就不用交换,否则 对颜色a[x]来说,下一个同颜色的位置一定大于x+1,所以可以直接用交换后的位置x+1覆盖交换之前的位置x;颜色a[x+1]同理。所以交换操作就处理好了。#include<bits/stdc++.h>using namespace std;typedef long long ll;const

2020-09-24 23:22:14 27

原创 HH的项链

题目链接既然要统计区间[l,r]内不同的数字,那么相同的数字只保存最后一个,对最后一个数字赋值1,其余数字赋值0,这样可以通过前缀和求得区间[1,r]内的不同数字,那么区间[1,l-1]内赋为1数字是什么意思呢?这些数字最后一个位置在[1,l-1]内,就是说区间[l,r]内没有这些数字,所以两个区间前缀和的差即为[l,r]的答案。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=100

2020-09-24 22:48:02 21

原创 第K小数 (主席树)

第k小数主席树本名可持久化线段树,也就是说,主席树是基于线段树发展而来的一种数据结构。其前缀"可持久化"意在给线段树增加一些历史点来维护历史数据,构成多个版本的主席树,使得我们能在较短时间内查询历史数据可以对于每个点i都建一棵权值线段树,维护1~i这些数,每个不同的数出现的个数(权值线段树以值域作为区间)对于第i个点a[i],将它属于的权值线段树添加进主席树,该权值线段树相比于前i-1个点构成的第i-1版本的主席树只有log(n)个点是不同的,其余的点都是相同的,将不同的这些点新建一个分支并与主席树链

2020-09-23 23:19:39 27

原创 Codeforces Round #671 (Div. 2)

A 如果n是奇数 最终剩下的一定是奇数位的值,判断奇数位是否有奇数即可;如果n是偶数最终剩下的一定是偶数位的值,判断偶数位是否有偶数即可。ps:&运算比 == 优先级低!!! 因为这个被hack了。哭辽。。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=200010;typedef pair<int,int> pii;#define fi first#de

2020-09-20 20:01:20 90

原创 Candies POJ - 3159 (差分约束)

题目链接题意:已知n个点和m条关系,每条关系包含a,b,c三个整数,表示:d[b]-d[a]<=c,求d[n]-d[1]的最大值。如若一个系统由n个变量和m个不等式组成,并且这m个不等式对应的系数矩阵中每一行有且仅有一个1和-1,其它的都为0,这样的系统称为差分约束系统。说人话:关系式都是 d[i]-d[j]<=a[k]的形式。令 w(j,i)=a[k],再移项可以得到 d[j]+w(j,i)>=d[i],是不是感觉似曾相识,迪杰斯特拉算法的松弛操作:if(d[u]+w(u,v

2020-09-06 17:33:31 19

原创 2020 杭电多校第6场

1009 Divisibility题意:十进制下判断一个数n能否被3整除的方法是 判断n的各位数的和能否被3整除,现给你一个b和x,判断再b进制下能否用这种方法判断所有数能否整除x。打表可以找规律。#include<bits/stdc++.h>using namespace std;typedef long long ll;int t;ll b,x;int main(){ cin>>t; while(t--) { cin&g

2020-08-09 16:27:59 27

原创 2020杭电多校第5场

1001 Tetrahedron直角三棱锥有一个性质:底面面积的平方等于三个侧面面积的平方和。然后根据体积可以算出来h,1/(h^2)= (a ^ 2 * b ^ 2+a ^ 2 * c ^ 2+b ^ 2 * c ^2) / ( a ^ 2 * b ^ 2 * c ^ 2)再往下化简就可以得到 1/(h^2)= 1/( a ^ 2 )+ 1/(b ^ 2 )+1/(c ^ 2)根据 E(x+y)= E (x)+ E(y) 可得 E(1/(h ^ 2))=3*E(1/(a ^ 2))所以求1到n

2020-08-09 11:13:32 70

原创 2020 杭电多校4 1007 Go Running

题目链接以x与t为轴建立直角坐标系,可以发现向右跑的同一个人在 x=t+b这条直线上,向左跑的同一个人在x=-t+b这条直线线上,肯定是让同一条直线上人算做一个人才会最少,但是直线的交点怎么算是个问题。当时还真想不到怎么建图跑网络流太菜了。对于每个点都会有一个 xi+ti 和一个 xi-ti,在他们之间连一条有向边,最终就会建成一个二分图,问题就变成了求最小点覆盖。对于有向图最小点覆盖等于最大匹配,对于无向图还要除以二。再建造一个超级源点和一个超级汇点可以跑网络流了。xi和ti的值太大还要离散化一下。

2020-07-31 21:20:53 48

原创 2020杭电多校第三场

1004 Tokitsukaze and Multiple思路:合并尽量多的p的倍数,假设[l,r]的和模p等0,就可以合并这个区间,需要得到尽量多,对于每一个r选择最近的l,想要快速寻找这个 l 可以借助前缀和的性质,如果[l,r]的和模p等0,那么sum[r]%p==sum[l]%p,所以记录前缀和的模数的位置即可。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=100010;

2020-07-29 10:33:31 72

原创 2020 杭电多校第二场

1010 Lead of Wisdom剪枝:预处理每一行每个位置最大值,搜到第i行时如果后面几行全部取最大值(这种情况都不一定存在)的结果还是比ans小就没必要再搜了。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=55;int t,n,k,s[N][N][5],sz[N];int suf[N][5],m[N][5];ll ans;void dfs(int x,int a,i

2020-07-27 08:45:38 68 4

原创 2020杭电多校第一场

Problem DescriptionThe Fibonacci numbers are defined as below:Given three integers N, C and K, calculate the following summation:Since the answer can be huge, output it modulo 1000000009 (109+9).InputThe first line contains an integer T (1≤T≤200), d

2020-07-23 09:38:13 97

原创 最小割边与最小割点

最小割边思路:将1到n的所有最短路都切断,求最小代价。先跑一遍迪杰斯特拉,然后再在最短路径上重新建图,就变成了在新图上将1到n的所有路径全部切断的最小代价,也就是最小割(边)。根据最大流最小割定理:最大流等于最小割,所以求最大流即可。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=200500;const ll inf=0x3f3f3f3f3f3f3f3f;#define fi

2020-07-15 13:14:29 54

原创 P2055 [ZJOI2009]假期的宿舍(匈牙利算法或者最大流)

题目链接题意:学校放假了,一部分学生回家一部分留校,然后有一些外校生来找他们的朋友玩。怎么安排住宿是个问题,他们所有人都有一个毛病只想睡朋友或者自己的床。问是否有一个合理的住宿方案?看到这个很容易会想到二分图最大匹配,先将整个图分成两部分:人和床,求人和床的最大匹配。首先是本校生他才会有床,床的编号就是他的编号,然后对于每一个外校生找最大匹配。对于留校的本校生先让他睡他自己的床,还需要给他与他的床之间连一条边,刚开始想着留校生已经匹配好床了就没连结果wa了一个点,可能会存在留校生先把床让给了朋友,然后

2020-07-11 11:33:34 35

原创 多重背包(单调队列优化)

题目链接算法的详细证明在这单调队列适用于求一定区间长度情况下,所有区间的最值。#include<bits/stdc++.h>using namespace std;const int N =20010;int n,m,v,w,s,f[N];int q[N],num[N];//q:队列,num:保存队列中元素所在的位置,方便维护区间长度int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i+

2020-07-08 15:22:48 45

原创 分层图最短路

飞行路线题目描述Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司。该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一定的价格。Alice和Bob现在要从一个城市沿着航线到达另一个城市,途中可以进行转机。航空公司对他们这次旅行也推出优惠,他们可以免费在最多k种航线上搭乘飞机。那么Alice和Bob这次出行最少花费多少?输入描述:数据的第一行有三个整数,n,m,k,分别表示城市数,航线数和免费乘坐次数。第二行有两个

2020-06-02 16:42:46 59

原创 UCF Local Programming Contest 2014

A#include<bits/stdc++.h>using namespace std;string s;int n;bool st[300];int check(string s){ int cnt=0; for(int i=0;i<s.size();i++) cnt+=st[s[i]]; return cnt>s.size()-cnt;}int main(){ st['a']=st['e']=st['i']=st['o']=st['u']=1;

2020-05-31 17:26:50 265

原创 Codeforces Round #645 (Div. 2)

A#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=200010;int t,n,m;int main(){ cin>>t; while(t--) { cin>>n>>m; int ans=n/2*m; ans+=(n&1)*(m+1)/2; cout<<ans<<endl; } re

2020-05-27 11:08:18 62

原创 Codeforces Round #644 (Div. 3)

A#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=200010;int t,a,b;int main(){ cin>>t; while(t--) { cin>>a>>b; if(a<b) swap(a,b); int res=max(a,b*2); cout<<res*res<<endl;

2020-05-25 09:28:41 48

原创 Codeforces Round #641 (Div. 2)

A n是奇数,f(n)一定是奇数;n是偶数,f(n)一定是2;#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=200010;int t;ll n,k;bool pr[N];int main(){ cin>>t; while(t--) { cin>>n>>k; if((n&1)&&k) { bo

2020-05-13 15:49:18 50

原创 AtCoder Beginner Contest 167

A 这点判断字符串就可以了,字符串是可以比较大小的。#include<bits/stdc++.h>using namespace std;typedef long long ll;int main(){ string a,b; cin>>a>>b; if(a==b.substr(0,b.size()-1)) puts("Yes"); else puts("No"); return 0;}B 直接计算就好了。#include<bits/

2020-05-11 13:12:17 55

原创 Codeforces Round #640 (Div. 4)

A#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=200010;int t,n,m;int main(){ cin>>t; while(t--) { cin>>n; vector<int> ve; int cnt=0; while(n) { if(n%10) ve.push_back((n%10)*pow(10,

2020-05-10 17:37:12 45

原创 Codeforces Round #639 (Div. 2)

这场比赛打的真糟心,幸亏不计分了,美滋滋的溜了。。。A 只有一行或者只有一列是一定可以的,其他情况只有两行两列可以(首尾相连排一圈)。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=200010;int t,n,m;int main(){ cin>>t;...

2020-05-07 22:08:01 40

原创 Prime Path POJ - 3126 (最短路)

hh学长酷爱素数,他经常自娱自乐,随机挑选两个四位的素数a,b。游戏规则是:a可以通过改变某一位上的数字使其变成c,但只有当c也是四位的素数时才能进行这种改变。hh学长可以很轻松的算出a最少经过多少次变化使其变为b,所以他相信你也可以。例如:1033 -> 81791033173337333739377987798179最少变换了6次。Input第一行输入整数T,表...

2020-05-06 17:06:17 58

原创 2020年西北工业大学“编程之星”程序设计挑战赛

群里有人发比赛密码就去打了打,题目质量真不错。传送门两道水题就不贴了。A 先给数组排序,再求前缀和,然后对于每次询问的x,y保持x<y,先找到最后一个小于x的下标 l ,那么前l个员工到x的距离最短等于l*x-前缀和;第一个大于y的下标 r ,那么r之后的员工到y的距离最短用前缀和也可以求,然后看x和y之间的,当x+y是奇数时(x+y)/2到x最近,当x+y是偶数时(x+y)/2到...

2020-05-03 09:26:37 79

原创 Codeforces Round #638 (Div. 2)

A 选择前n/2 - 1个最小的和一个最大的。ps:2^31爆有符号int,位运算的优先级很小。#include<bits/stdc++.h>using namespace std;typedef long long ll;#define pii pair<int,int>;const int N=200010;int t,n,m;ll ans;int m...

2020-05-03 08:54:10 43

原创 Heavy Transportation POJ - 1797 (最短路变形,最小边最大化)

N个点,M条边,每条边有权值。求一条1号点到N号点的路径,要求使得路径中的边权最小值最大。Input多组输入,第一行给一个T。每一组第一行给两个数n和m。(1 <= n <= 1000)接下来m行,每行三个数u,v,w代表路径的两个端点与边权。(1 <= u,v <= n , 0< w <= 1e6)保证两点间只有一条边,该图为无向图。Output...

2020-05-01 17:15:22 72

原创 Cow Contest (POJ - 3660)

FJ的N(1 <= N <= 100)头奶牛们最近参加了场程序设计竞赛:)。在赛场上,奶牛们按1…N依次编号。每头奶牛的编程能力不尽相同,并且没有哪两头奶牛的水平不相上下,也就是说,奶牛们的编程能力有明确的排名。 整个比赛被分成了若干轮,每一轮是两头指定编号的奶牛的对决。如果编号为A的奶牛的编程能力强于编号为B的奶牛(1 <= A <= N; 1 <= B <=...

2020-05-01 16:53:48 35

空空如也

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人 TA的粉丝

提示
确定要删除当前文章?
取消 删除