暴力/模拟/思维
木有
哈希表扁豆
此人不懒,但什么都没写
展开
-
[NOIP2021] 报数
Solution以预处理出来所有合法的数,用链表保存,每次询问答案就是O(1)的。预处理的时候可以先把带七的无重复的找出来,具体来说最大为为i的含有七的数字一定由第i位为7的所有数字和前i-1位含有7的所有数字在第i位拼任意数组成,然后根据这些晒掉所有倍数。Code#include<iostream>#include<cstdio>using namespace std;bool isok[10000005];int sevens[10000005],cnt,nx原创 2021-12-01 09:55:19 · 474 阅读 · 0 评论 -
【模板】无向图三元环计数
Problem给定一个 n 个点 m 条边的简单无向图,求其三元环个数。n<=1e5,m<=2e5。Solution枚举三个点O(n3),枚举临边O(m2),枚举点及其对边O(nm)都会T,根本原因在于任何一个简单三元环都会被枚举多次。于是我们可以得到一个直观的优化思路:避免对环的重复枚举。如果是有向图,对于一类子图的计数是不会出现重复统计,因此可以可以按照一个统一的规则将无向图转换成有向图?方法:对于一条边的两个端点,度小的连向度大的,度数相同的情况下编号小的连向编号大的,这原创 2021-09-18 17:49:24 · 345 阅读 · 0 评论 -
CF120J Minimum Sum
ProblemSolution为方便操作将坐标放至第一象限处理,对不同的x建立“桶”,将y从小到大放进其对应的桶,然后对桶两两比对找两桶之间最小的y的差。期间维护答案,最后对原数据进行扫描找到最终答案。由于每个桶中的y都是升序的,比对两个桶中最小的y的差只需同时将两桶扫一遍,最差时间复杂度O(n2/t),t>=10,刚好超时。考虑剪枝,如果两桶的x距离已经大于等于当前最优答案,此时不必再枚举第二个桶,继续枚举第一个桶即可。实测使用此优化在cf上效率提高10倍+,但实际上也可以卡,比如在极原创 2021-09-16 12:10:48 · 120 阅读 · 0 评论 -
二进制状态下枚举子集
for (int sub = S;sub; sub = (sub - 1)&S)//sub为子集大小为k的集合朴素的枚举是3的k次方的,此种枚举方法最差2的k次方,正确性在于((sub-1)∩S,sub)间没有S的子集。正确性对二进制下的sub,sub-1,(sub-1)∩S进行分析可证。...原创 2021-08-25 20:48:11 · 115 阅读 · 0 评论 -
H - Clock(思维+小模拟)
Problem有个表,给定初始时刻和一些其他时刻,求秒针总共最少转多少度使得经过所有时刻。Solution场上唯唯诺诺,场下重拳出击。。。想了想实际最优情况应该是一直往某个方向转,或者转到某个位置,然后沿反方向走完剩下所有的。处理时把时间化为秒,去重,特判初始位置在两头时和一遍走完的两种情况,所有的取最优,没啥细节。Code#include<iostream>#include<cstdio>#include<algorithm>using name原创 2021-08-22 11:09:33 · 117 阅读 · 0 评论 -
CodeForces - 1209C Paint the Digits
Problem给定序列,要求对序列中的每个数字用1或2染色,然后将染为1的数字按原序列的相对顺序放在新序列前面,将染为2的数字按原序列的相对顺序放在新序列后面,求一染色方案使新序列单调不降。Solution考虑到数字是从0~9,可以枚举新序列染色为1和染色为2交界处的数字大小,小于所枚举数字的染为1,大于所枚举数字的染为2,所枚举数字尽可能染为2,看能否使得两部分分别单调不降。时间复杂度O(t*n)。Code#include <iostream>#include <cstdio原创 2021-08-17 19:41:03 · 96 阅读 · 0 评论 -
M - Managing Difficulties
Problem给定数列,求有多少个aj-ai=ak-aj,i<j<k。Solution枚举j和i,倍增差k,如果有,倍增查数量。时间复杂度n^2lognCode#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using namespace std;int t,n,a[2005],m,cnt[2005],all[2005][2005原创 2021-08-14 16:59:26 · 142 阅读 · 0 评论 -
B3-G-Game of Gnomes(枚举)
Problemn个士兵分m组,每回合造成当前剩余人数点伤害,没回合选人数最多的组杀k个人,问最多能造成多少伤害。Solution枚举杀多少次k个人,剩下的人平分在m组总伤害最大。Code#include <iostream>#include <cstdio>using namespace std;long long n,m,k,ct,ans,mx;long long solve(){ ans = 0; long long x=(n-ct)/k;原创 2021-08-08 17:38:21 · 76 阅读 · 0 评论 -
UVA10570 外星人聚会 Meeting with Aliens
本来不难的一道题,硬是因为写法的不好折腾了好几天,也因此学了一点东西。环的问题一定要将环平铺开,这样不容易出错!本质上的做法是枚举起点1的位置(这样考虑实现起来更不容易出错),然后枚举是正反(123…,321…),计算每一种情况的交换次数。计算每一种情况下的转置环的个数cnt(如53214要变成12345,转置环为{5,4,1},{3,2},个数为2),交换次数为n-cnt,优点在于不需要改变原序列进行一对一对的实际交换,可证明这个计算方法与贪心的交换所得答案一样。#include<ios.原创 2021-04-27 21:20:54 · 116 阅读 · 0 评论 -
UVA10976 分数拆分 Fractions Again?!
从2k到k枚举x,通过(k*x)%(x-k)==0判断当前x是否可以。#include<iostream>#include<cstdio>#include<cstdlib>using namespace std;int k,x,y,ans,a[10005],b[10005];int main(){ while(cin>>k) { for(x=2*k;x>k;x--) if((k*x)%(x-k)==0) { a[+.原创 2021-03-13 08:38:49 · 71 阅读 · 0 评论 -
UVA11059 最大乘积 Maximum Product
入门题,别忘清maxn和注释freopen。#include<iostream>#include<algorithm>#include<cstdlib>using namespace std;long long n,a[20],maxn,nw,num;int main(){// freopen("1.txt","w",stdout); while(cin>>n) { maxn=0; for(int i=1;i<=n;i++.原创 2021-03-12 23:58:48 · 81 阅读 · 0 评论 -
UVA725 除法 Division
先把符合条件的单个数筛出来,总共三万多;对于给定的n,在筛出来的数中从小到大枚举除数,直到n*当前数>=筛出来的最大数;在满足前面的条件的基础上进一步判断能否组成排列。代码又臭又长! #include<iostream>#include<cstdlib>#include<cstdio>using namespace std;bool ok[100005],a[10],e;int q[100005],pos,n,num,aa[10];void .原创 2021-03-12 23:35:58 · 164 阅读 · 0 评论