ACM
ZileLee
这个作者很懒,什么都没留下…
展开
-
ccf-csp认证 202104.3 dhcp服务器
应该是csp到现在实现最容易的大模拟了,不涉及任何算法,直接按给出的过程慢慢写就行。#include <bits/stdc++.h>using namespace std;const int N = 1e4+5;const int inf = 0x3f3f3f3f;struct IP{ int time=0;//过期时间 string holder="";//掌握主机 int statu=0;//0 未分配 1 待分配 2 占用 3 过期}ip[N];int原创 2021-12-04 23:21:17 · 843 阅读 · 0 评论 -
E. Mocha and Stars(莫比乌斯反演+简单dp)
code:#include <bits/stdc++.h>using namespace std;#define ll long longconst int mod = 998244353, N = 1e5 + 10,maxn=105;int l[maxn], r[maxn], n, m;ll sum[maxn][N];const int MAXN = 1e6+5;bool vis[MAXN + 10];int prime[MAXN + 10], mu[MAXN +..原创 2021-09-17 11:47:52 · 179 阅读 · 0 评论 -
Sum of Log——数位dp
题面:问题的关键点在于[i&j=0]⌊log2 (i+j)+1⌋其中i&j=0表明了i+j不可能出现任何进位的情况贡献答案,log2 (i+j)+1表示i和j最先出现1的位数。很显然这是一个数位dp题#include<bits/stdc++.h>#define int long longusing namespace std;const int mod = 1e9+7;int dp[50][2][2][2];//长度,limit_x,limit_y,是否有前导0原创 2021-08-24 17:48:51 · 247 阅读 · 1 评论 -
LCM Walk HDU - 5584
描述A frog has just learned some number theory, and can’t wait to show his ability to his girlfriend.Now the frog is sitting on a grid map of infinite rows and columns. Rows are numbered 1,2,⋯ from the bottom, so are the columns. At first the frog is sitti原创 2021-08-18 20:19:55 · 78 阅读 · 0 评论 -
2021牛客暑期多校训练营2——G、League of Legends
看了官方题解视频,觉得有*点简略,和评论区的感觉一样(这里重新写一篇连铜牌都能看懂的 题解。题意给定 n 个区间 [ai,bi),要求将它们分成 k 组,最大化每组交的长度之和,并且每组的交长度不能为0。1≤k≤n≤5000 , 1≤a<b<105 。思路对于包含其他区间的大区间,我们考虑两种情况对其进行分配1.归属到一个被它包含的区间所在的组,不影响答案2.独自一组,长度直接算入答案很显然,要么为第一种情况,要么为第二种情况,因此可以单独处理。剩下的就是互不从属的小区间,我原创 2021-07-23 22:11:18 · 274 阅读 · 0 评论 -
P2598 [ZJOI2009]狼和羊的故事(网络流)
我个人的理解:可以先对原图进行建模为下图其左端是狼,右端为羊,中间是连接狼和羊的路现在为了让狼吃不到样,就要隔断狼和羊之间的连接也就是在这里,我们需要隔断狼和羊之间的连接,也就是转化成最小割问题很明显,这里的路权均为1然后分别建立源点和汇点,分别连接狼与羊,边权为inf,进行求解最小割即可#include<bits/stdc++.h>#define ll long longusing namespace std;const int MAXN = 2e5+7; int.原创 2021-05-03 21:42:16 · 139 阅读 · 0 评论 -
投掷骰子问题
对一个n面的骰子,令每一面都出现至少出现一次的概率为(1+1/2+1/4+1/5+1/6+…+1/n)*n对于邮票收集,每张邮票的价格为ai,则收集所有邮票所需要的金钱为(1+1/2+1/4+1/5+1/6+…+1/n)*sum(ai)原创 2021-04-30 15:43:14 · 430 阅读 · 1 评论 -
csp2019-12化学方程式
思路:将每个方程式进行切割出每个分子CaCl2+2AgNO3=Ca(NO3)2+2AgCl拆出 CaCl2,2AgNO3,Ca(NO3)2,2AgCl进一步去除系数拆出CaCl2,AgNO3,Ca(NO3)2,AgCl分别计算各个分子各原子数量,然后乘以系数最后判断等式左右原子数量是否相同#include<bits/stdc++.h>using namespace std;string tmp[1005],s;bool isbig(char c){ return (c>.原创 2021-04-28 19:43:13 · 270 阅读 · 1 评论 -
P4071 [SDOI2016]排列计数——错排公式的应用
首先需要了解错排公式:D(n) = (n-1)*(D(n-1)+D(n-2) )D(n) 即为n个数1-n进行排列,每个人的下标都不能等于自己的情况数量。然后这题就很显然了,公式为:Cnm×D(n)C_n^m \times D(n)Cnm×D(n)代码:#include<bits/stdc++.h>using namespace std;#define ll long long#define int long longconst int mod = 1e9+7;cons原创 2021-04-07 14:49:49 · 143 阅读 · 0 评论 -
Jhonson不等式和流水调度
现有A,B两个机器,原材料必须先经过A制作才能经过B制作成功,每个机器一次只能生产一个产品,生产每个产品均花费一定的时间,要求排序物品,用最少的时间完成生产。求解:Jhonson不等式按min(x.a,x.b)<min(y.a,y.b)排序,x.a代表物体x在A上制作所需要的时间按此确定选择的先后,然后a小的放到前头,b小的放到后头正确性易证#include<bits/stdc++.h>using namespace std;const int N = 1e3+5;stru原创 2021-03-28 22:06:18 · 244 阅读 · 0 评论 -
Kattis - repeatedsubstrings(后缀数组)
要求字符串中找出两个最大相同的公共子串思路:利用height数组,height数组最大的位置即为结果,另可通过sa[i]求取最大的位置。#include<iostream>#include<algorithm>#include<stdio.h>#include<string.h>using namespace std;/* 后缀数组模板,下标从0开始 s[]原字符串 后缀sa[i]和sa[j] LCP(i, j) = min{heigh原创 2021-03-23 18:36:01 · 87 阅读 · 0 评论 -
Corporate Identity——后缀数组
题意:多个字符串的最长公共子串如果是一个字符串的最长可重叠的公共子串,那么直接利用求出max(height)即可如果是一个字符串的最长不可重叠的公共子串,那么先二分答案,转化成判别式的问题比较好处理。假设当前需要判别长度为k是否符合要求,只需把排序后的后缀分成若干组,其中每组的后缀之间的Height 值都不小于k,再判断其中有没有不重复的后缀,具体就是看最大的SA值和最小的SA值相差超不超过k,有一组超过的话k就是合法答案。在这一题中,我们可以考虑将这些区间拼在一起,二分答案k,找出一段连续区间使得h原创 2021-03-23 17:01:28 · 162 阅读 · 0 评论 -
HDU3790:多目标最短路径问题(Dijkstra)
模板自用Problem Description给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。Input输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点。n和m为0时输入结束。(1<n<=1000, 0<m<100000, s != t)Output输出 一行有两个转载 2021-03-22 22:02:50 · 1486 阅读 · 0 评论 -
KMP判断最小循环节
当前的最小循环节为len-next[len]另附kmp代码void next(){ next[0] = 0; int len = 0,i=1; while(i<n){ if(pa[i] == s[i]){ len++; next[i] = len; i++; } else{ if(len>0){ len = next[i-1]; }else{ next[i] = 0; i++; } } }原创 2021-03-21 19:35:18 · 155 阅读 · 0 评论 -
dfs判断图中的环
1、判断环并且输出每个环的元素,大小void dfs(int u,int fa){ dep[u] = 1; for(int i=0;i<edge[u].size();i++) { int x = edge[u][i]; if(x==fa)continue; if(dep[x]==0){ pre[x] = u; dfs(x,u); } if(dep[x]==1){ int tmp = dep[u]-dep[x]+1; int temp = u;原创 2021-03-21 19:12:00 · 1088 阅读 · 0 评论 -
Codeforces Round #703 (Div. 2)D Max Median(二分)
题意:给出一个数组,找出长度>=k的subarray的中位数的最大值。思路:二分中位数,然后看原数组是否满足条件。怎么判断呢?对于数组的每个数,把小于当前数字的设为-1,大于当前数的设为1然后由此求前缀和pre。如果长度始终等于k,那么显然我们只要判断一个pre[i]-pre[i-k]>0就够了然现在是长度>=k那么我们就要引出一个新的数组minpre也就是截至到当前的最小前缀和#include<bits/stdc++.h>using namespace原创 2021-02-19 15:10:42 · 142 阅读 · 0 评论 -
Codeforces Round #703 (Div. 2)C1&C2 Guessing the Greatest(二分)
题意:交互题。query l,r区间内第二大的数,要求得到整个数组最大的数。思路:首先我们对整体数组进行query找到第二大的数所在的位置,设这个位置为p。然后分别对[1,p]和[p,n]进行query,看最大的数是在p的左端还是右端。如果在左端,那我们二分左端的区间左端点,找到最右的左端点a满足[a,p]的query和[1,p]一致,此时得出答案是a。在右端同理。PS:这题二分细节有点多,有点坑。#include<bits/stdc++.h>using namespace原创 2021-02-19 12:51:52 · 206 阅读 · 1 评论 -
Codeforces Round #680 (Div. 2, based on Moscow Team Olympiad)C. Division(质因数分解+欧拉筛优化)
我来提供一个非常暴力的做法显然,我们只需要考虑P是Q的倍数的情况。在这种情况下我们考虑对q的质因数分解为p1n1∗p2n2∗p3n3...pnnnp_1^{n_1}*p_2^{n_2}*p_3^{n_3}...p_n^{n_n}p1n1∗p2n2∗p3n3...pnnn然后对于每一个p1p_1p1考虑使得P不断除以p1p_1p1,直到P小于Q为止,记录此时的P。以12 和6 为例6=21+316 = 2^1+3^16=21+31首先对2考虑12/2/2=4 原创 2020-11-02 01:25:12 · 869 阅读 · 1 评论 -
CF1430E. String Reversal
给出一个字符串,要求将其通过相邻两项交换进行反转,问需要进行交换多少次?分析:原创 2020-10-29 20:10:59 · 191 阅读 · 0 评论 -
CF1433F Zero Remainder Sum——dp
一看题就直到是老dp了。给出一个矩形,每行最多只能选一半向下取整,问最后结果最大并且整除k的值是多少。显然我们要构造一个四维数组dp[i][j][k][h]代表在i行j列选取k个并且取模为h的结果code:#include<bits/stdc++.h>using namespace std;int a[100][100];int dp[75][75][75][75];int main(){ int n,m,k; scanf("%d%d%d",&n,&m原创 2020-10-29 19:10:17 · 191 阅读 · 0 评论 -
山东大学数据结构实验 栈——计算表达式
建立两个栈数字栈和符号栈。读入表达式遇到数字存入数字栈,遇到左括号和±*/存入符号栈维护符号栈中符号优先度单调。如果遇到右括号,那么一直向右计算,直到遇到左括号为止代码:#include<iostream>#include<algorithm>#include<string>using namespace std;int level[200];//符号优先级template<class T>class Stack{ public:原创 2020-10-27 20:42:18 · 336 阅读 · 0 评论 -
2020 CCPC 网络赛1002—— Graph Theory Class
刚签完到就上min_25筛233好!很有精神!思路:构造每个点若要加入原有图,那么所需的代价最低是它本身,最多与2相连,也就是这个数的两倍。显然,最终的答案是10^10以内的质数和*2+合数和。也就是10^10以内的所有数之和+质数和我们考虑用min_25筛解决我们设F(i) = i(当i为质数的时候)显然质数之和为我们设函数g(n,j)为求出1到n中,i为质数或i的最小质因子大于当前第j个质数的f ( i )。其中 pjp_jpj表示第j个质数显然我们要求的就是g(n,0)对于这原创 2020-09-21 19:42:53 · 519 阅读 · 1 评论 -
ccfcsp201803-2——碰撞的小球
问题描述 数轴上有一条长度为L(L为偶数)的线段,左端点在原点,右端点在坐标L处。有n个不计体积的小球在线段上,开始时所有的小球都处在偶数坐标上,速度方向向右,速度大小为1单位长度每秒。当小球到达线段的端点(左端点或右端点)的时候,会立即向相反的方向移动,速度大小仍然为原来大小。当两个小球撞到一起的时候,两个小球会分别向与自己原来移动的方向相反的方向,以原来的速度大小继续移动。现在,告诉你线段的长度L,小球数量n,以及n个小球的初始位置,请你计算t秒之后,各个小球的位置。提示 因为所有小球的初始位原创 2020-08-19 16:10:57 · 193 阅读 · 0 评论 -
Educational Codeforces Round 93 (Rated for Div. 2) D. Colored Rectangles
题意:分别给出三种颜色的木棍,每个木棍有一个长度。每次取两种颜色的木棍分别做一个长方形的长和宽,问最后所得最大的面积之和是多少?就是一道撒比dp题,被我搞黄了。首先有个前提是,为了取最大值,每次操作,取两种木棍时,一定取的是当前两种颜色木棍分别的最大长度才能保证答案正确。也就是说假如R颜色的木棍最大长度为d,第n(n>=2)大长度为cG颜色木棍的最大长度为b,第n(n>=2)大长度为a那么显然db+ca>=bc+da (易证)那么很显然,就是讲每个颜色的木棍分别排序,然后每次原创 2020-08-15 01:31:10 · 201 阅读 · 0 评论 -
带权并查集模板——How Many Answers Are Wrong
简单的说,就是以最左边的点为根节点。然后用rank[]记录该点到根节点(也就是最左侧)的距离。#include<iostream>#include<cstdio>using namespace std;#define maxn 200010#define rank ranksint f[maxn],rank[maxn];int find(int x){ if(x==f[x])return x; int tmp = find(f[x]); rank[x]+=ran原创 2020-07-26 23:58:23 · 124 阅读 · 0 评论 -
[kuangbin带你飞]专题四 最短路练习——刷题报告
主要讲了以下几类题1、最短路的变种:最短路的边权最大值。dijiksra修改判断条件即可2、来回/多次最短路,比如C题就是这种模式,属于来回最短路,实际上,就是一个简单的求两次最短路3、判断负环/正环:主要采取spfa方式,如果某一个点的入栈次数超过n,那么就存在负环/正环。4、各种奇奇怪怪的最短路的不同叙述,比如货币换算、0or1等题,还有直接给坐标的。5、对于点权和各种细节的处理,比如昂贵的聘礼。6、差分约束问题。先将不等式写成差分约束的形式。然后跑出最短路。7、最短路覆盖:如果dis[u原创 2020-07-26 01:15:34 · 160 阅读 · 0 评论 -
Layout——最短路+差分约束
一共有n头牛,有ml个关系好的牛的信息,有md个关系不好的牛的信息,对应输入的第一行的三个元素,接下来ml行,每行三个元素A,B,D,表示A牛和B牛相距不希望超过D,接下来md行,每行三个元素A,B,D表示A牛和B牛的相距至少要有D才行。求1号牛和n号牛的最大距离,如果距离无限大输出-2,如果无解输出-1。显然是一道差分约束题差分约束格式将原不等式化成u-v<=w的格式u-v<=w ⇒ add(u,v,w);u-v>=w ⇒ v-u<=w ⇒ add(v原创 2020-07-26 01:02:38 · 174 阅读 · 0 评论 -
Marriage Match IV(最短路+网络流)
题意:N个点M条边的有向图,给定起点S和终点T,求每条边都不重复的S–>T的最短路有多少条。第一步:求出最短路若d[u]+w == d[v]。那么e就是最短路上的一条边。spfa会被卡常,建议改用dijikstra第二步:求出最大流每条边都不重复的××,老网络流模型了求解S到T的最大流。将所求得的最短路的边,建新图,每条边的流量都是1。再用dinik求出S到T的最大流,即最终答案。code:#include<bits/stdc++.h>#define ll long lo原创 2020-07-26 00:03:03 · 181 阅读 · 0 评论 -
单调队列滑动窗口——洛谷P1886
单调队列,故名思义,就是队列中的元素单调递增或者递减。然后考察队首(head)和队尾(tail)对于队尾,主要是让元素进入,如果进来的元素打乱了原先的顺序,那么就剔除队尾的一些元素,再加入新的元素,直到符合单调性。对于队首,如果超出了滑动窗口的大小那么,就要弹出元素。code#include<bits/stdc++.h>#define maxn 1000010using namespace std;int a[maxn],q[maxn],p[maxn],head,tail;int原创 2020-07-24 00:42:11 · 144 阅读 · 0 评论 -
POJ Candies——差分约束+spfa 水题
前置知识spfa,差分约束不会的建议先去做洛谷P1993最开始用队列,不知道为什么超时了,看别人的博客把队列换成栈就行了。我也这样换一下,不太懂。code:#include<iostream>#include<cstdio>#include<algorithm>#include<cstdlib>#include<cstring>#include<stack>using namespace std;#define原创 2020-07-24 00:04:51 · 185 阅读 · 0 评论 -
Arbitrage——判最大环
Input套利是指利用货币汇率的差异,将一种货币的一个单位转换为同一货币的多个单位。例如,假设1美元买0.5英镑,1英镑买10.0法国法郎,1法国法郎买0.21美元。然后,通过兑换货币,聪明的交易者可以从1美元开始,购买0.5 * 10.0 * 0.21 = 1.05美元,获得5%的利润。您的工作是编写一个程序,以货币汇率列表作为输入,然后确定是否可能进行套利。Output输入将包含一个或多个测试用例。每个测试用例的第一行有一个整数n (1<=n<=30),表示不同货币的数量。接下来的n行每原创 2020-07-23 22:13:16 · 351 阅读 · 0 评论 -
Cow Contest——floyd确定两点之间关系
第一眼看到这题,我原本是想用双端拓扑排序做的,后来发现不对,因为一段的拓扑排序会影响另一端的结果。于是改用floyd算法,求得两点之间关系,和n-1个点保持关系的就是确定好排名的点。N (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating in a programming contest. As we all know, some cows code better than others. Each cow has a cer原创 2020-07-23 21:34:21 · 173 阅读 · 0 评论 -
MPI Maelstrom——floyd水题
很简单,就是Floyd跑一遍双源最短路。然后输出结果最大值就行。注意一个函数atoi,可以将字符串转换成数字。code:#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>using namespace std;int g[110][110],dis[110][110];int main(){ int n; memset(g,0,sizeof原创 2020-07-23 21:01:44 · 138 阅读 · 0 评论 -
POJ 3259-Wormholes(判全图负环)
大水题code:#include<iostream>#include<cstdio>#include<queue>#include<algorithm>#include<cstring> using namespace std;#define maxn 3005int head[maxn],cnt,n,m,w,vis[maxn],num[maxn],dis[maxn];struct node{ int to; int fro原创 2020-07-23 18:21:30 · 136 阅读 · 0 评论 -
poj1860 Currency Exchange(Bellman_ford算法)
思路:Bellman_ford算法判正环。以前这个算法判负环挺常见的,现在我们可以用来判正环。也就是改一下松弛操作的方式,仅此就行。code:#include<cstdio>#include<iostream>using namespace std;const int maxn = 110;double dis[maxn];int n,m,s,len;double v;struct node{ int u,v; double r,c;}edge[maxn*原创 2020-07-23 16:56:37 · 138 阅读 · 0 评论 -
种类并查集——洛谷P2024食物链
#include<bits/stdc++.h>using namespace std;#define maxn 1500100int f[maxn];int find(int x){ if(x == f[x])return x; else return f[x] = find(f[x]);}int merge(int x,int y){ int p = find(x),q = find(y); f[p] = q;}int check(int x,int y){ i原创 2020-07-22 22:23:58 · 94 阅读 · 0 评论 -
种类并查集——洛谷p1525
#include<bits/stdc++.h>using namespace std;#define maxn 40005int f[maxn];int find(int x){ if(x==f[x])return x; else return find(f[x]);}int merge(int x,int y){ int p = find(x),q = find(y); f[p] = q; // cout<<x<<" f "<<y原创 2020-07-22 21:46:13 · 129 阅读 · 0 评论 -
CF1385F Removing Leaves(贪心)
补题。由最深的节点开始贪心即可。代码参考:code代码如下:#include<bits/stdc++.h>using namespace std;#define MAXN 200010int head[MAXN],cnt,deg[MAXN],leaves[MAXN];struct node{ int to,from;}edge[MAXN<<1];set<int>s[MAXN];void add(int u,int v){ cnt++; ed原创 2020-07-20 00:21:52 · 190 阅读 · 0 评论 -
Codeforces Round #656 (Div. 3) E. Directing Edges
思路:拓扑序、有向图判环。有向图判环大家都很熟悉,就是跑一边拓扑排序,看最终加入队列的点数是否等于总点数。第二个是给环添加方向的做法。这让我想起了学网络流时的dinic算法。也就是选取一点dfs,得出所有点的深度,然后路线只能从浅向深移动,这样避免成环,我的思路正是受这启发。这里就不用多写dfs了,用拓扑序(可以理解为深度)解决即可。code:#include<bits/stdc++.h>using namespace std;#define MAXN 200010int to原创 2020-07-18 22:15:29 · 155 阅读 · 0 评论 -
树链剖分模板
讲解移步:树链剖分这里以[树上操作]这题为例:code:#include<algorithm>#include<iostream>#include<cstdlib>#include<cstring>#include<cstdio>using namespace std;#define MAXN 100005#pragma GCC optomizer(2)#define ll long longusing namespace原创 2020-07-09 11:17:30 · 145 阅读 · 0 评论