自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 一个编译优化问题(没解决)

初学多线程,写出了如下程序#include <assert.h>#include <stdint.h>#include <stdio.h>#include <unistd.h>#include <string.h>#include <sys/time.h>#include <pthread.h>#include <semaphore.h>#define num 1sem_t p[num];

2022-03-23 11:16:04 572

原创 2018-2019 XIX Open Cup, Grand Prix of Korea (Division 2) 部分题解

比赛链接A. Dumae大致意思:n个人进行排队,给定每个人在队伍中的位置[Li,Ri][L_i,R_i][Li​,Ri​],给定m个关系ui,viu_i,v_iui​,vi​,uiu_iui​编号的人排在viv_ivi​编号的人前面。输出一个满足要求的队伍顺序。解法:对于两个人u,v如果u排在v的前面,那么必须Lv>=Lu+1。Ru<=Rv−1L_v>=L_u+1。R_u<=R_v-1Lv​>=Lu​+1。Ru​<=Rv​−1。因此考虑建立对m对关系建立图,分别按

2021-05-18 17:04:14 433

原创 codeforces 1900分左右的题 持续更新

Codeforces Round #716C. Product 1 Modulo N大致意思:从[1…n-1]中取尽量多的数,使他们乘积模n的余数为1思路:根据裴蜀定理,要是模n的余数为1,取的数一定与n互质,因此我们取所有1…n-1中和n互质的数,如果最后得到的结果=1,那么直接输出取的数,如果!=1,那么得到的余数也一定和n互质,那么就是之前取的数,把那个数去掉即可。D. Cut and Stick大致意思:给定n个数,每次取下标为[l, r]的数,求区间出现次数大于区间长度一半的数。思路:

2021-04-22 10:53:51 662 2

原创 poj2828

题目在这如果从正面考虑的话,求出每个人的位置比较困难。一开始,位置1-n都设置为1,即v[1…n] = 1。可以从倒着考虑,依次求出每个人的位置p,将v[p]设置为0。因此问题变成了如何求第k个1的值,如果考虑二分+线段树的话,时间复杂度是O(nlogn^2)。考虑线段树的性质,求出第k个1,可以直接在线段树上操作,因此时间复杂度为O(nlogn)#include <iostream>#include <cstring>using namespace std;con

2021-04-06 17:11:27 87

原创 hdu3333 链表+贪心+线段树

题目在这如果直接使用线段树的话,并不能维护对于某个值在给定区间内出现的次数。可以采用离线查询+贪心的方式线段树维护区间1-n的和将给定区间按右端点从小到大排序,对于a[i],记录它上次出现的位置记为pre[i]。从前到后扫描a[1]-a[n],因为询问的区间的右端点是按从小到大排序,所以每次在第i的位置设置为a[i]的值,在pre[i]的位置的值设置为0。如果到达了某个询问的右端点,将答案记录即可。#include <iostream>#include <cstring>

2021-04-05 21:44:28 97

原创 codeforces round 711 div2 Planar Reflections 多种dp方法

题目在这大致意思,输入有n面镜子,一束光强为k的光,如果光直接穿过镜子,那么光强不变,如果经过镜子反射,那么光强减一。求出最后有多少光强大于0的光射出镜子外。算法一:dp[i][j]设为当前光的强度是i,射在第j面镜子上的方案数所以最后的答案为所有dp[i][j]的和得到状态转移方程if (i == 1) f[i][j] = 1;else{ if (i % 2 == 1) f[i][j] = sum[i - 1][j - 1] % mod; else f[i][

2021-04-01 11:12:46 92

原创 2021年度训练联盟热身训练赛第一场 Full Depth Morning Show 换根DP

#include <iostream>#include <cstring>using namespace std;typedef long long LL;const int N = 1e5 + 10, M = 2 * N;LL t[N], sz[N], a[N], b[N], sum[N];int h[N], e[M], ne[M], w[M], idx;int n; LL sn;void add(int a, int b, int c){ e[id.

2021-03-20 19:04:13 105

原创 UVA1312

注意到数据范围:网格的长和宽都是1e4级别的,而树的数量范围是1e2以内,这提示我们:是不是可以从树上着手,而不是暴力枚举网格长和宽来获得答案。事实确实如此,将网格的四个边界也都看成点,易证得,最大的正方形存在一组对边,必然都有点。因此,可以将y坐标去重排序后,枚举正方形的一组对边在y坐标上,其x轴上最多能延申多长。借助已有状态,来获得问题的解。还有一题给我留下了很深的印象。题目在这可以搭配看本题代码如下#include <iostream>#include <cstring

2021-03-15 12:50:39 89

原创 uva1619 poj2796 单调栈

本题坑点比较多注意:①特判都是输入0的情况②是多组数据数据这题在uva上提交总是WA,原因是uva其实没有special judge,实际要输出长度最短且最偏左的子序列。所以我就到poj做了。。注意到,对于数列中的一个数a,只有向其左右两端不断扩展,直到遇到比它小的数为止,这段区间即是以a为最小值的区间。因此枚举1-n的每个数为区间的最小值。剩下的任务就是怎么找到当前这个数左右两边小于它的数。找左边的做法=找右边的做法找出一个数左边第一个比它小的数,即是单调栈模板题。#include &lt

2021-03-14 22:02:07 89

原创 UVa1608 不无聊的序列 分治+中途相遇法

以前没有遇到过中途相遇这种方法,看紫书解释后感觉非常巧妙。本题的解法是在给定区间找出唯一的元素后,分别在元素的左半区间和元素的右半区间查找。问题是1:如何在一段区间找出唯一的元素,可以转化为该元素左右邻居的位置下标(与该元素值相同),因此可以使用双向链表,用map进行预处理该双向链表。2:如果从左向右或者从右向左寻找唯一的元素,最坏的时间复杂度总是可以被卡到n^2。中途相遇的思路,就是同时从两边向中间寻找唯一的元素,可以保证最坏的时间复杂度是nlogn。#include <iostream&g

2021-03-13 10:06:37 195

原创 uva1471

算法竞赛入门经典解法400ms+#include <iostream>#include <cstring>#include <set>using namespace std;typedef pair<int, int> PII;const int N = 2e5 + 10;const int INF = 1e9;int a[N], g[N], f[N];set<PII> s;int main(){ int T;

2021-03-12 20:46:11 108

原创 HDU1024 Max Sum Plus Plus

题目地址题目大意:给定m和n,再给出n个数,求出m段数的和使总和最大解法1:设f[i][j][k]表示状态,记录最大值f[i][j][0]表示当前是第i个数,已经选取了j段,第i个数没有被选f[i][j][1]表示当前是第i个数,已经选取了j段,第i个数被选dp[i][j][0] = max(dp[i - 1][j][0], dp[i - 1][j][1]);dp[i][j][1] = max(dp[i - 1][j - 1][0], max(dp[i - 1][j][1], dp[i - 1]

2021-03-09 11:24:24 102

原创 牛客寒假训练 魏迟燕的自走棋 贪心+并查集

题目在这贪心方案:对于装备的价值从大到小进行选择。如果每件装备只对应一个人的话,只需要设置一个st数组记录每个人知否已经选了装备,从大到小枚举每件装备能否选择即可。现在问题是k=1或k=2,我们可以考虑将士兵看成点,用并查集来维护士兵的信息,使用st数组来维护连通块能否还能选择装备。连通块的意义:对于一个连通块,它可能不能再匹配装备了,或者还能匹配一件装备。如果还能匹配一件装备的话,任意选择其中一个点,则之前匹配该连通块的装备能匹配剩下的全部点。因此只要有装备能匹配连通块中的任意点,都可以将该装备选

2021-02-22 09:38:30 129

原创 牛客寒假训练 温澈滢的狗狗 二分 + 计数

题目在这考虑暴力做法:从小到大枚举亲密度,算出各个亲密度下有多少对数,然后相加直到为k。时间复杂度为O(n ^ 2)二分做法:二分亲密度mid,算出亲密度<=mid时有多少对,如果有大于等于k对时答案显然在左边,否则在右边。然后问题就是怎么算出亲密度<=mid有多少对数。比赛时就死在这里,想到了可能是二分亲密度,但没有想到怎么算有多少对数。这里给出两种方法。①直接法:因为要求亲密度<=mid的对数,因此,可以枚举长度为mid 的区间。使用双指针算法,左指针为l,右指针为r,每次右指

2021-02-21 22:00:10 101

原创 链表/并查集 维护区间的信息

买礼物线段树+双向链表一组长度为n的序列,每个数都在1-n给定操作操作一:删除区间的某个元素操作二:给定区间l,r,问区间内是否有相同的元素如果暴力做的的话,对于区间(L,R),遍历每个元素,找他后面有没有和他相同的元素,单次操作的复杂度是平方级别的。这题需要进行适当的转换。找某个元素后面和他相同的元素,可以转换为链表的形式,每个链表的next指针指向和他相同的元素的位置。 则对next指针建立线段树,每次查询区间内的最小值,观察最小值是否落在(L,R)。#include <iost

2021-02-20 10:05:25 213

原创 牛客寒假训练 红和蓝

题目在这考虑叶结点,因为叶结点必须和一个结点同色,因此只能是他的父节点。因此对于叶结点,和他父亲染相同的颜色, 两个结点构成了一个组合 。如果出现两个子节点都要和父节点染相同的颜色,即都要和父节点构成组合,则不成立。如果对于某个结点u,遍历其子节点后其仍没有被染色,说明其子节点已经和子节点的子节点构成组合,因此,u必须和他的父节点同色。最后特判根节点能不能被染色。#include <iostream>#include <cstring>using namespace

2021-02-18 22:51:55 286 1

原创 牛客 贪吃的派蒙

题目在这maxp 为最大数的位置maxv 为最大数的值lmin 为最大数左边有几个数lmax为最大数左边数的和rmin, rmax同理#include <iostream>#include <cstring>using namespace std;const int N = 1e5 + 10;int n, k;int a[N];typedef long long LL;int main(){ int t; cin >> t

2021-02-18 22:23:58 164

原创 牛客 减数游戏

题目在这里可以证明得到性质:1:每次选取最小的两个数,最后得到的数是最大的如果直接这么暴力做,先排序,每次删去两个数得到一个数,将得到的新数插入排好序的数中。显然会超时间,long long也不够用。2. 前一次得到的数,一定比这一次得到的数小,满足单调性。由性质二,当得到的数第一次大于原数列中最大的数时,后面的数都会大于原序列最大的数,因此插入是在原数列后面依次插入。满足单调,有序性。因此将堆中的所有数取出加入队列操作。#include <iostream>#include &l

2021-02-18 21:02:57 103

原创 牛客 照看小猫 组合计数

题目在这里每只小猫的名字由小写英文构成,且有一个名字的长度上限。可考虑先初始化,对于不同长度上限,共有多少种不同的取名方案。然后将小猫名字上限从小到大排序,进行遍历。对于小猫i,设长度上限为k,前i-1只小猫的名字长度上限必然小于等于小猫i的,所以小猫i的取名方案数为:长度上限为k的方案数 - (i - 1)。#include <iostream>#include <cstring>#include <algorithm>using namespace

2021-02-18 20:39:00 90

原创 HDU4635 强连通分量

题目大意:给一张没有自环,没有重边的有向图。问最多加多少条边,要求加边完后的图没有自环,没有重边,且不是强连通的。因为要添加最多的边,因此显然可以得到,最后的图是由两个强连通分量组成,设为a,b。a,b都为完全图,且a中所有点都指向b中每个点,b中点没有指向a中的点。设a中的点数为x,b中的点数是y。因此最后添加的边数N = x * (x - 1) + y * (y - 1) + x * y - mN = (x + y)2 - (x + y) + x * y - m = n2 - n + x * y

2021-02-11 19:50:43 118

原创 POJ3694 tarjan求桥+LCA+并查集优化

题目链接题目大意:给定一张有n个点,m条边的无向连通图。然后依次加入q条边,问你每加入一条边,图中还剩下多少桥。1.先将图中进行tarjan缩点,因为(边)双联通分量都被缩成了一个点,因此缩点后的图是一棵树。点与点之间的边是桥。2.对于每次添加一条边,首先看两个点是不是属于一个双联通分量,如果是的话,则桥的数量不变。否则找出两点的祖先,因为从两点到祖先的路径可以构成一条环,所以路径上的桥经过添加边后不再是桥,减去相应的数量即可。如果用此思路的话,时间复杂度是O(m + q * n)对于一条边连接父

2021-02-11 12:18:42 301

原创 kuangbin带你飞 线段树 题解

A-敌兵布阵线段树的单点修改和查询区间总和操作#include <iostream>using namespace std;const int N = 5e4 + 10;struct Node{ int l, r; int sum;}tr[4 * N];int w[N];void pushup(int u){ tr[u].sum = tr[u << 1].sum +tr[u << 1 | 1].sum;}void bu

2021-02-06 20:08:09 102

原创 POJ 1456 贪心+并查集/贪心+堆

题目描述A supermarket has a set Prod of products on sale. It earns a profit px for each product x∈Prod sold by a deadline dx that is measured as an integral number of time units starting from the moment the sale begins. Each product takes precisely one unit o

2021-01-23 16:08:07 133

原创 湖南大学2020届ACM新生赛 全部题解

新生赛过后,熬了4天夜,终于把模型机验收完了,还有一星期多期末考试,抽空写个题解。A Counting 0 and 1 in string0->1 1->101是由0,1转移过来,0是由1转移过来。因此列出状态转移的方程即可#include <iostream>using namespace std;long long f0[100], f1[100];int main(){ f0[0] = 1, f1[0] = 1; int t; c

2021-01-03 23:10:23 1853

原创 关押罪犯 扩展域并查集 带权并查集 二分图+二分

关押罪犯题目描述S 城现有两座监狱,一共关押着 N 名罪犯,编号分别为1~N。他们之间的关系自然也极不和谐。很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多。如果两名怨气值为 c 的罪犯被关押在同一监狱,他们俩之间会发生摩擦,并造成影响力为 c 的冲突事件。每年年末,警察局会将本年内监狱中的所有冲突事件按影响力从大到小排成一个列表,然后上报到 S 城 Z 市长那里。公务繁忙的

2020-12-19 13:51:53 334 1

原创 湖南大学 新生杯 L - Liao Han ACM

L - Liao Han题目描述:题目的意思是给定一个正整数n,求1-n中,约数个数为奇数的数的个数。唯一分解定理,任意正整数n可分解为其中p为质数。从而可以得到N的约数个数为的一个数的约数个数为奇数,才是符合题目要求的,可以某个数满足题目要求和该数字是完全平方数是等价的。①如果该数满足要求,则其所有a必然是偶数,因此是一个完全平方数。②如果该数是一个完全平方数,则经过分解后,其指数(即a)必然是2的倍数,约数个数是奇数。因此只要算出1-n中有几个完全平方数,即sqrt(n)。...

2020-12-17 10:42:10 239

原创 湖南大学 十四届ACM程序设计新生杯 题解

A-AFei Loves Magic思路:如果两个魔法石相遇,需要改变各自的方向并且以和原来相同的速度前进。这是和魔法石在同一地方相遇,但是方向不变,继续运动是等价的。因此只需算出t时间后还有多少,魔法石在(0,L)中即可。代码#include <iostream> using namespace std;const int N = 1e6 + 10;int x, d;int n, L, t; int main(){ cin >> n >>

2020-12-16 21:05:33 343

原创 202006-5 乔乔和牛牛逛超市

#include <iostream>#include <cstring>using namespace std;const int N = 2e5 + 10, M = (1e6 + 10 + 2 * N) * 2, INF = 1e9;int h[N], e[M], ne[M], f[M], idx;int q[N], cur[N], d[N];int p[N];int n, m;int ss[8];typedef long long LL;LL sum;i

2020-12-15 12:14:29 497

原创 最大获利 最小割

最大密度子图#include <iostream>#include <cstring>using namespace std;const int N = 5010, M = (50010 + 2 * N) * 2, INF = 1e8;int h[N], e[M], ne[M], idx;int f[M];int q[N], cur[N], d[N];int dg[N];int p[N];int n, m, U;int S, T;void add(int

2020-12-13 22:37:26 119 1

原创 欧拉函数的证明(容斥原理)

2020-12-12 21:55:50 1717

原创 不同范围组合数

一.递推法题目描述给定n组询问,每组询问给定两个整数a,b,请你输出CabC_{a}^{b}Cab​ mod (10^9+7)的值。1≤n≤10000,1≤b≤a≤2000问题解法根据公式CabC_{a}^{b}Cab​ = Ca−1bC_{a - 1}^{b}Ca−1b​ + Ca−1bC_{a - 1}^{b}Ca−1b​递推进行预处理,求出所有CabC_{a}^{b}Cab​ 的情况,询问的时间复杂度为O(1)。时间复杂度时间取决于a的值,两层for循环的时间复杂度是O(a^2)参考

2020-12-04 20:21:42 200

原创 区间问题的贪心方法

一.区间选点题目描述给定N个闭区间[ai,bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点,输出选择的点的最小数量。(位于区间端点上的点也算作区间内。)问题解法1)将区间的右端点从小到大排序2)从前往后枚举每个区间,如果这个区间包含已经选择的点,则跳过。否则,将该区间的右端点加入选择点的集合。问题证明选择到某个区间时,如果已经选择点都不在区间中,说明该区间与之前的所有选择点的区间都没有相交的部分(区间左端点在已经选定的点右边),则加入选择点的集合。如果在区间中,则无需作

2020-12-03 12:46:33 564

原创 floyd算法正确性的证明和求最小环

flody可用四行代码直接搞定for (int k = 0; k < n; k ++) for (int i = 0; i < n; i ++) for (int j = 0; j < n; j ++) dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])但为什么是正确的呢?可以用动态规划的思想进行理解设F[k, i, j]为中间经过的结点不超过k,起点是

2020-07-22 16:17:44 478

原创 POJ1426(取模进行BFS优化)

题目Given a positive integer n, write a program to find out a nonzero multiple m of n whose decimal representation contains only the digits 0 and 1. You may assume that n is not greater than 200 and there is a corresponding m containing no more than 100 dec

2020-07-21 12:16:33 337

原创 POJ1321 状压DP

题目描述在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。Input输入含有多组测试数据。每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n当为-1 -1时表示输入结束。随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, .

2020-07-20 22:19:09 113

原创 使用set erase函数的注意点

在做一道题目时,需要自定义struct函数,如下所示struct G{ int id; int score; int g; bool operator < (const G a) const { if (score != a.score) return score > a.score; else if (g != a. g) return g < a.g;

2020-06-27 12:51:53 1385

原创 PAT A1039 unordered_map

使用cin和cout会超时,为了加快速度,可以加上ios::sync_with_stdio(false);map是基于红黑树实现的,unordered_map是基于哈希实现的,对于本题来说,由于不需要对元素进行排序,显然使用unordered_map下面为代码和注解#include <iostream>#include <vector>#include <unordered_map>#include <algorithm>using.

2020-06-24 12:08:54 125

空空如也

空空如也

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

TA关注的人

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