自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 每日训练题解

T1046 判断闰年:https://nanti.jisuanke.com/t/T1046//思路:闰年的判断分三个点,一个是400,一个是100,一个是4,如果一个数可以被400整除那么就是闰年,如果一个数是100的倍数但是不是400的倍数,比如1900,那么不是闰年,如果一个数不是100的倍数但是可以被4整除那么是闰年,比如2016,如果一个数不能被4整除,那么不是闰年,比如2021#include<stdio.h>int main(){ int n; scanf("%d

2021-09-23 20:19:41 193 2

原创 B. Take Your Places!(Codeforces)

先判断奇数和偶数的个数情况:if(n==1) 则不用处理,输出0else if(奇数和偶数的个数相差大于1)则不存在符合条件的序列,输出-1else if(奇数的个数大于偶数的个数)只能奇数放在第一个进行排列else if(偶数的个数大于奇数的个数) 只能偶数放在第一个进行排列else if(奇数和偶数的个数相等) 奇数放在第一个和偶数放在第一个取最小完整代码如下:#include<iostream>#include<vector>#include<cm..

2021-08-31 16:30:56 246 1

原创 C. Compressed Bracket Sequence (Codeforces)

数据范围不大,我们就枚举,以当前的左括号为开始可以产生多少组符合条件的括号对。如果右括号的数量大于左括号的数量,则break;否则的话判断左括号和右括号的数量关系,我们把当前左括号的数量设置为sum,其他后面的左括号数量设置为oth,如果多余的右括号小于oth,则跟当前的左括号组不成匹配对,我们继续往下找;如果某一点时多余右括号的数量和oth相等了,ans++;如果某一点时多余右括号的数量比oth大了,我们再跟sum 作比较,如果小于等于sum,则ans += yu+1;否则ans += sum.

2021-08-31 16:22:04 271

原创 HDU - 7106 Function

因为在1~1e6中g(x)的种类共有54种,所以我们考虑对g(x)进行枚举,然后根据二次函数找最小值,将原式进行化简,得到f(x) = x^2^ (A * g(x) + B) + x (C * g(x)^2^ + D * g(x))然后分情况进行讨论:(注意取值的时候取的值要小于n)a>0开口向上,离对称轴越近函数值越小1.对称轴 < 0,最小值取gx[i][0];注意(gx[i][0] <= n )2.对称轴 > n,最小值取gx[i][upper_bound(g..

2021-08-30 18:49:39 86

原创 HDU - 6441 Find Integer (费马大定理,勾股数)

费马大定理:勾股数a2 + b2 = c2已知a,求b和c:(在这里我们分两种情况,a是奇数和a是偶数的情况)可以证明a2 + b2 = c2中符合的类型是奇2+ 偶2 = 奇2(在这里我们就不加以证明了)1、a是奇数设a = 2n+1,b = 2m,c = 2k+1;(2n+1)2 + (2m)2 = (2k+1)2;(2n+1)2 = (2k+1+2m) * (2k+1-2m);令2k+1-2m = 1(因为保证要整除,而且2k+1-2m是奇数,所以我们设1)所以①2k+1-2m

2021-08-28 09:43:39 78

原创 The 15th Chinese Northeast Collegiate Programming Contest - K.City

虽然不难,但是感觉很有意思的一道题,下面有几个点感觉还是挺妙的:· 并查集只能加边不能减边;·对数据进行离线处理,方便我们进行排序处理(后面会解释);首先数据的范围很大,如果我们每做一次判断都要进行一次遍历的话时间复杂度肯定会超时,所以我们想能不能像预处理那样只需要做一次就能得到所有我们想要的答案呢?首先我们先对所有边进行一个从大到小的排序,所以我们在判断毁掉了多少条路的时候只需要判断当前边的值是否小于毁灭的值即可,如果不能毁掉那么后面的也无法破坏,break就好。那么还是没有解决 O(t *..

2021-08-22 21:05:14 362

原创 HDU-7087 对象存储调度问题(n个物品装入m个箱子)

官方的题解注意到数据对象的大小都是2的整数次幂,贪心地把这些数据对象从大到小去往分条里存就是对的。一个做法是每次取剩下最大的数据对象,然后用堆来维护分条,每次取剩余空间最大的一个分条并将该数据对象存进去,如果存在存不进去的情况则无解,否则就有解。时间复杂度:O(n log n +m log m)类似于我们把n个物品装入m个箱子中,看是否能够装下,所以我们每次都是取最大的物品放入剩余空间最大的箱子中,如果物品全都装进入则输出“Yes”,否则输出“No”。这里我们用优先队列来实现,完整代码如下:..

2021-08-22 10:04:36 362

原创 HDU7095 - Add or Multiply 1 (百度之星复赛)

因为加法和乘法的次数交换也不影响结果,所以我们先对其进行一个排序方便我们后续的处理,假设我们有n个加号,m个乘号。(n<=m)交换也同理if(n>m) swap(n,m);之后我们就要考虑情况的种类了,首先假设我们把n个加号可以分成1~n段(也就是把n个“不同的”加号分成k个集合,1 <= k <= n),然后我们对这k个集合进行全排列答案也就是A(k,k),这k段可以把m个乘号分成k-1,k,k+1段(需要注意的是如果n=m,则当k=n时,最多分成n段)然后对这k-1,k..

2021-08-22 09:50:14 224

原创 HDU-7018 Banzhuan(取模,数论)

刚开始不知道样例给的60哪来的,后面想明白了是先放到最上边等这个方块掉下去。最小的花费需要注意的是(1,1,z)(1<=z<=n)这一列没有,剩下的就是取模的问题了,这该死的取模!完整代码如下:#include<iostream>#include<cstdio>using namespace std;typedef __int128 ll;const int mod = 1e9+7;void scan(__int128 &x)//输入{ .

2021-08-04 09:58:04 237

原创 HDU-7007 净化

先贴代码,明天再写吧……#include<iostream>#include<cstdio>#include<cmath>using namespace std;typedef long long ll;ll shu[100000+10];int main(){ int t; scanf("%d",&t); while(t--){ ll n,m; scanf("%lld%lld",&n,&m); ll sum =..

2021-08-01 22:57:00 143

原创 HDU-7005 随机题意

先排序,然后遍历,更新Min即可,这才是签到题……for(int i=1;i<n;i++){ int a = shu[i]; if(a + k >= Min){//可以有一种当前数字带来的新种类 Min = max(Min+1,a-k+1); ans++; } //如果这个条件不满足,说明在[a-k,a+k]的数字在前面都出现过了}完整代码如下:#include<iostream>#include<cstdio>#include<al.

2021-08-01 22:54:20 80

原创 HDU-7004 签到

这道题的话打个表就很容易看出来要用快速幂求2的倍数,每隔一次操作结果就是上一步乘2。主要还是取模的问题,模不是负数,所以在取模的时候不能直接取模,如果我们要对x进行取模,我们可以写成==(x+mod)%mod==当时WA了以为是爆了,所以用了__int 128,事后发现不用这么麻烦,long long就可以了。完整代码如下:#include<iostream>#include<cstdio>using namespace std;typedef __int128 ll.

2021-08-01 22:45:55 73

原创 HDU-7003 猎人杀

题意每死亡一个玩家做一次判断,如果狼人死亡,猎人胜利,反之死的是猎人并且场上还剩下2个玩家,狼人胜利。先是狼人杀玩家,做判断,然后死亡的猎人按照自己的猎杀顺序进行猎杀,做判断,如果游戏继续,就按照死亡的玩家的猎杀顺序继续进行猎杀,直至游戏结束,就是一个纯模拟。完整代码如下:#include<iostream>using namespace std;int game[60][60];int iden[60];int main(){ int t; cin >> t;

2021-07-31 23:00:45 211

原创 HDU-6999 萌新

不知道我脑子一天天在想什么题意找到一个 c 使得 a%c = b%c,分别找到 c 的最大和最小值,因为c-1是正整数,所以c > 1,找不到就输出-1。题解我们先排序,让a >= b,方便后续的操作;如果a = b ,最小为2,最大为a;如果a - b = 1,c最大最小都是-1;其他情况化简即可a % c = b % c=> (a - b) % c=> 所以 c 最大为 a - b;找最小的时候肯定是一个素数(如果是一个合数的话肯定也能继续分解),所以我..

2021-07-31 22:09:34 90

原创 Game on Plane(思维,pair)

这道题难应该就难在题目理解上吧,这个题大致意思就是给你n条直线,每条直线由两个点确定,然后Alice从中选择1~n条直线,然后Bob在n条直线中选择一条直线,输出Alice选的直线与Bob选择的直线的交点最少。因为Alice想要选择尽可能多的直线与Bob选择的直线相交,所以Alice尽可能选择不平行的直线,Bob想要选择一条直线与尽可能少的直线相交,所以选择与更多平行的直线平行的那一条直线。我们用pair来记录dx和dy,用最大公倍数进行化简。完整代码如下:#include<iostream.

2021-07-31 18:16:33 71

原创 Photoshop Layers(前缀和,模拟)

题目有点长但是不难理解,如果是1就对原来的图片进行覆盖,2的话就对原像素点进行累计(注意不要超过255),然后输入图层的起始和终止,输出像素信息。这道题是用前缀和,我觉得很妙的就是对于16进制的读取和输出的一些使用,平常不怎么经常用(还是我做题太少)。scanf("%X",,&x);//用16进制的形式读取x B[i] = x & 255;//取后两位给Bx >>= 8;G[i] = x & 255;//取中间两位给Gx >>= 8;R[i]..

2021-07-28 20:10:31 115

原创 Segment Tree with Pruning(记忆化搜索)

一个是记忆化搜索,一个是用map来进行存储,因为数组开不到这么大,算是一个技巧了,把一段数字分成两段,有两种情况,一个是两段均等分开:tree[r] = 2 * build(r/2,k) + 1;//不要忘记本身自己也是一个节点另一种情况是两边相差1:tree[r] = build(r/2,k) + build(r/2 + 1, k) + 1;分情况分好两段这道题也就结束了,剩下就是记忆化搜索了,如果这个我们之前计算过,我们之间返回值即可。(还有就是不要忘记clear一下map)完整代码..

2021-07-28 10:55:57 196

原创 I love exam(背包,动态规划)

先放代码,一会补#include<iostream>#include<string>#include<map>#include<vector>#include<cstring>#include<algorithm>using namespace std;map<string,int>km;struct infor{ int val; int time;};vector<infor>cou

2021-07-27 12:00:48 238 2

原创 I love cube(思维)

这道题需要注意的一个是13 + 23 + 33 +…… +n3的求和,一个是先做除法再取模和先取模再做除法的结果是不一样的。对于一个边长是n的立方体,他可以分成13个边长是n的立方体, 23 个边长是n-1的立方体,33个边长是n-2的立方体……以此类推可以分解成n3个边长是1的立方体。一个立方体可以凑出8个符合要求的等边三角形,所以等边三角形的个数就是立方体的数量*8,下一步就是求立方体的数量,我们有公式:13 + 23 + 33 + …… + n3 = [n(n+1)/2]2所以最终结果就是.

2021-07-26 10:51:08 291

原创 I love 114514(模拟)

只需要找到114514这样的一个序列就好,比如我们找到了第一个1,下面我们就要找第二个1,中间出现的其他字符都无关,直到找到1之后我们继续找4依次类推直至全部找完或者字符串遍历完。完整代码如下:#include<iostream>#include<string>using namespace std;string s1 = "114514";int main(){ int t; cin >> t; while(t--){ string s; c.

2021-07-26 10:33:24 239

原创 P1169 [ZJOI2007]棋盘制作(悬线法)

昨天做了做杭电多校联赛有一道关于悬线法的题,看到这个洛谷推荐悬线法的题目补一篇题解吧这道题跟杭电多校的那道题感觉差不多,但是有一点区别就是要求矩阵内黑白相间,所以我们在计算高度的时候注意一下颜色即可。1、对矩阵做合法标记处理首先我们先对所给矩阵的颜色进行一个处理:(0,0)设置为1如果这一行是第一行,那么如果(i,j)的颜色跟(i,j-1)的颜色不同,那么说明合法,则标记与(i,j-1)相同,反之则取非;如果这一列不是第一行,那么就跟他的上一行的同一列的颜色作比较,如果(i,j) 的颜色与(i

2021-07-26 10:25:58 56

原创 I love string(思维)

这道题主要是思维想过来就好,一个序列的排列种类只与最前面相同元素的个数有关,如果一旦出现了不同的元素,你会发现之后的排列方式就固定了,前面有几个相同的元素就是2的几次幂,不要忘记边乘边取模就好完整代码如下:#include<iostream>#include<string>using namespace std;const int mod = 1000000007;int main(){ int t; cin >> t; while(t--){ ..

2021-07-26 10:25:14 171

原创 KD-Graph(并查集)

这道题难倒是不难,主要是题目的意思可能不太好理解,就是有n个点,m条边,分成k组,每组至少有一个点,这时我们有一个值d,保证在同一个组内的点之间的边都要小于等于这个d,不在同一个组的点之间的边都要大于这个d,我们可以通过并查集的方法对这个d值进行一个查找:我们先对所有的边进行一个从小到大的排序,然后每次处理边相同的点进行集合合并,如果这一组(边相同的若干条边)处理为之后分成的集合数大于K,那么继续进行,如果等于K,说明KD图存在,如果小于K,说明KD图不存在,输出-1即可。完整代码如下:#in..

2021-07-25 23:10:32 168

原创 Maximal submatrix(悬线法)

这道题实质是就是求一个最大子矩阵,参考了很多悬线法的代码,这里介绍一个我感觉很妙的方式,首先我们要知道什么是悬线法:悬线,就是一条竖线,这条竖线要满足其上端点在矩形的上边界或其上端点的上面是障碍点。我们枚举每个点的悬线,求出其最多能向左和向右扩展到何处,取最大值,就能求出最大子矩阵了。通俗的说就是你有一条线,这条线的长度固定,可以左右移动,看他最多能扫过的面积就是我们要求的最大子矩阵的面积。我们可以对已知矩阵进行预处理:up[i][j]: 坐标是(i,j)的这个点最大可以往上的长度,因为要求每一.

2021-07-25 22:55:08 520 1

原创 Minimum spanning tree

这道题看起来是求最小生成式(虽然事实的确是这样),但是跟最小生成树的算法没有什么太大的关系,只需要直到最小生成树的基本定义和素数相关的内容即可,最小生成树的定义如下:一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。链接:完整定义与相关介绍了解了最小生成树的定义之后来解释为什么说还要用到素数相关的知识,在大于1的整数中一个数不是质数就是合数,如果一个数是合数,那么与这个相关数的最小公倍数就是他本身(例如4:2(4的因数)和4的最小..

2021-07-25 22:10:03 132

原创 Mod, Or and Everything(规律)

通过打表找规律就可以做,通过打表发现与(n-1)是2的几次幂有关,打表结果如下:通过寻得的规律代码如下:#include<iostream>using namespace std;int main(){ int t; cin >> t; while(t--){ long long n; cin >> n; long long ji = 1; long long ans = 0; n--; while(n/2){ ans ..

2021-07-25 21:45:19 282

原创 优先队列定义排序方式

1.按照从大到小进行排序priority_queue<int>q1;priority_queue<int,vector<int>,less<int> >q2;//注意less<int>和最后一个>要加空格分隔开struct infor{ int a,b; friend bool operator < (infor x,infor y){ return x.a < y.a; }}priority_queue&lt

2021-04-13 20:08:31 445

原创 计算阶乘中质因数的和

计算阶乘中质因数的和假如我们要求的是9!中可以分解为多少个2方法一:暴力也就是挨个遍历int cnt = 0;for(int i=1;i<=9;i++){ int n = i; while(n>=2 && n%2==0){ cnt++; n /= 2; }} 很平常的一种想法,就是遍历每个数,看看当前数可以被2整除几次,再累加和就好方法二:假如说我们要求9!中可以分解出2的个数第一步:1 2 3 4 5 6 7 8 9其中可以整除2的数有2

2021-04-12 20:17:37 152

原创 UVA1169 Robotruck(DP + 单调队列)

UVA1169 Robotruck(DP + 单调队列)思路很简单,并且要求捡垃圾的顺序是按照垃圾的编号从小到大进行收集,所以也降低了难度,我们很容易想到用一个双重循环的区间DP来做,可惜提交之后发现超时了,在这里我们用到的是滑动窗口单调队列的做法进行优化。我们设动态数组dp[i]为收集前 i 个垃圾所需要的的曼哈顿距离,(之后我们用距离来代表曼哈顿距离)所以我们的动态转移方程是:dp[i] = min(dp[i], dp[j] + 从原点到第 j+1 号垃圾的距离 + 从第 j+1 号垃圾到第 i

2021-03-17 11:04:51 124

原创 UVA10859 放置街灯 Placing Lampposts(树状DP)

UVA10859 放置街灯 Placing Lampposts(树状DP)这道题有两种解决方法,因为原图保证无重边无环无自环, 所以原图一定是一颗树(或森林).,都是树状DP,但是实现的过程大同小异,先说第一种吧:一:1.在这道题中有两个因素在影响着转移,一个是放置灯的数量,一个是如果放的灯的数量相同的情况下被两盏灯同时照亮的边的条数,但是这两个条件有个优先级,就是灯的个数大于被边同时被两盏灯照亮的边,那么我们是不是可以这样想,如果多了一个灯变量值+1000,而如果是灯照亮了一条边就+1,那么我

2021-03-16 11:04:45 196

原创 UVA1326 Jurassic Remains

UVA1326 Jurassic Remains这道题很好理解,就是有几个地方想要重点记录一下Meet-in-the-Middle如果这道题用最暴力的方式求解,每一组数据的时间复杂度为224,这是我们很难忍受的,但是如果我们分开来看,把每组数据分成前一半和后一半来看,这样时间复杂度就降到了212,哇,这可不仅仅是降了一半,这直接开根号了呀!所以特殊种类的情况下这样的暴力简直不要太美,可能有些同学会问了,这样把一组数分成两组,每组的时间复杂度是212,后面继续一个双重循环,时间复杂度不就又恢复到224了

2021-03-13 11:08:28 56

原创 UVA1398 Meteor(几何+扫描线)

UVA1398 Meteor扫描线的裸题,但是其中的几何知识倒是挺有意思,就是判断一个射线进入目标矩阵的进入时间和离开的时间:假设源点的位置是(x,y),移动的速度是(a,b),矩阵的左下角是(0,0),右上角是(w,h)一:最朴素的思路:由几何知识可知,这条射线过(x+at,y+bt),首先有几种情况是可以排除的:1、a>0 && x>w2、a<0 && x<03、b>0 && y>h4、b<0 &a

2021-03-08 18:00:06 89

原创 Uva10881 Piotr’s Ants

Uva10881 Piotr’s AntsPiotr likes playing with ants. He has n of them on a horizontal pole L cm long. Each ant is facing either left or right and walks at a constant speed of 1 cm/s. When two ants bump into each other, they both turn around (instantaneous

2021-02-24 09:29:58 122 1

原创 P1027 [NOIP2001 提高组] Car 的旅行路线

P1027 [NOIP2001 提高组] Car 的旅行路线1、每个城市有四个点,N 个城市有4N个点,我们对这4N个点进行floyed,这就是我们最终的结果2、根据三个点判断出第四个点的坐标:千万注意斜率不为零的情况分开讨论!!0不能做除数void add(int cnt){ int x1,x2,x3,y1,y2,y3; x1 = city[cnt-2].x; x2 = city[cnt-1].x; x3 = city[cnt].x; y1 = city[cnt-2].y; y2 =

2021-02-21 14:44:36 552

原创 P1005 [NOIP2007 提高组] 矩阵取数游戏

P1005 [NOIP2007 提高组] 矩阵取数游戏1、__int128的使用(不能直接cout 或者 printf,需要写函数)2、状态转移方程:if(i==j) dp[i][i] = map[k][i]*sum(2,m);else{ dp[i][j] = max(dp[i+1][j]+map[k][i]*sum(2,m-j+i), dp[i][j-1]+map[k][j]*sum(2,m-j+i));}主要是高精的__int128的问题,我们也可以用贪心的方法进行空间的压缩,当前行最大

2021-02-21 09:01:47 365

原创 洛谷P1013 [NOIP1998 提高组] 进制位

洛谷P1013 [NOIP1998 提高组] 进制位没什么说的,就是先找0,再找1,然后用递归找其余的数,思路不是很难,就是麻烦……#include<iostream>#include<string>#include<map>#include<stack>using namespace std;const int maxn = 11;int shu[maxn];char sign_shu[maxn];string mp[maxn][maxn

2021-02-21 07:49:26 131

原创 人工智能

人工智能从一位大佬的博客看到的一个人工智能的网站,觉得很好,网站链接如下:人工智能大佬博客:https://blog.csdn.net/ma2595162349/article/details/111304722

2021-02-04 00:01:42 60

原创 线段树

Structure 数据结构线段树先贴代码,日后一定补(狗头保命),还有区间乘,联系树状数组一起写一篇完整的。B站一位大佬讲的很清楚:B站连接#include<iostream>#include<cstring>using namespace std;typedef long long ll;ll shu[200001];ll ans[200001];ll tag[200001];int n;void build(int p,int l,int r){ if

2021-02-03 22:59:32 52

原创 KMP算法

String 字符串KMP算法KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)。void get_next(string s){ int k = -1; next[0] = -1

2021-01-29 18:54:43 95 1

原创 次小生成树 Kruskal

Graph 图论次小生成树 Kruskal1、初始化:对并查集进行初始化;for(int i=1;i<=n;i++){ f[i] = i;}对vis数组初始化;对graph数组进行初始化for(int i=1;i<=n;i++) { graph[i].clear(); graph[i].push_back(i); }2、对边进行排序;sort(map,map+m,cmp);3、判断当前边的两个节点是否已经属于同一集合,如果不属于:①这条边标记为使用;②把这两个点所在的集合统一为

2021-01-27 23:29:38 176

空空如也

空空如也

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

TA关注的人

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