
思维
IZUMIXINGI
这个作者很懒,什么都没留下…
展开
-
Codeforces 113C - Double Happiness欧拉筛 + 费马二定理
使用bitset筛,可以承受3e8 + 5 每个合数都被其最小素数因子筛掉,故时间复杂度为O(n) 费马二定理: 所有素数可以表示为4k + 1,4k + 3(2除外),表示为4k + 1的数可以被表示为a^2 + b ^2 #include<bits/stdc++.h> #pragma comment(linker, "/stack:200000000") #pragma GCC optimize("Ofast") #pragma GCC target("sse,sse2,sse3,ssse3原创 2021-11-09 20:12:29 · 121 阅读 · 0 评论 -
Codeforces 191C C. Fools and Roads [倍增求lca +树上差分]
求lca步骤: 1、dfs求每个节点的父亲和深度 2、dp 3、求lca void init_dep(int u,int pre){ dp[u][0] = pre; for(int i = head[u];i != -1;i = e[i].nxt){ int v = e[i].v; if(v == pre)continue; dep[v] = dep[u] + 1; init_dep(v,u); } } void init_dp(){ for(int i = 1;i <= 2原创 2021-11-07 16:19:08 · 281 阅读 · 0 评论 -
cf round 751 D.Frog Traveller(bfs剪枝和线段树优化建图做法)
#include<bits/stdc++.h> #pragma comment(linker, "/stack:200000000") #pragma GCC optimize("Ofast") #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") #define debug(x) cout<<#x<<" is "<<x<<endl #define原创 2021-10-27 16:44:21 · 157 阅读 · 0 评论 -
Codeforces Round #745 (Div. 2) E. Train Maintenance
Codeforces Round #745 (Div. 2) E. Train Maintenance 补一下这道题,本来以为线段树魔改,结果好像不是,还是自己太菜了,代码主要参考官方solution,然而他的tutorial写的我不太能接受,看完代码还是选择用我自己的方式来解释一遍~ 题目大意:有n辆车,m天,每辆车干x天休息y天,每天可以选择一种操作: 操作1:将第k辆车挑出来,开始工作 操作2:第k辆车退休 每天都询问当天有多少辆车在休息。 考虑最朴素的做法,对每个休息区间进行更新,使用差分数组进行维原创 2021-10-01 22:25:27 · 488 阅读 · 0 评论 -
[2021-9-8补题]codeforces round 704E,693F
#include<bits/stdc++.h> using namespace std; typedef long long ll; #define mp make_pair #define se second #define fi first #define pb push_back #define debug(x) cout << #x << " is " << x << endl vector<vector<int> &.原创 2021-09-18 15:04:52 · 123 阅读 · 0 评论 -
[补题]Technocup 2021 Elimination Round 3 and Round #692 D grim zoo
题目大意: 字符串由0,1,?三种字符组成,每个子序列01产生x价值,每个子序列10产生y价值,?要替换成1或者0,问产生最小价值为多少? 关键:当0和1的数量确定的时候,cnt(00)和cnt(11)是固定的, 而cnt(01) + cnt(10) = total_cnt - cnt(00) - cnt(11)此时也是固定的,因此,当x > y 时希望10数量越多越好,01数量越少越好,对于固定的01数量,1越放前面越好,因此,不妨先令所有问号为0,计算此时总的价值,然后从前往后置问号为1每一步取一原创 2021-09-17 11:12:37 · 2105 阅读 · 0 评论 -
Codeforcs educational round 96 [逆序对]E. String Reversal
交换相邻位置首先想到的是逆序对! 回想冒泡排序,交换次数 = 逆序对 的个数原字符串的位置可以看作一个有序序列,如 a a a z a 1 2 3 4 5 反转之后的序列为: a z a a a 对每个位置应该选择原串更靠前的位置,这样对逆序对的贡献最小故应该为: 1 4 2 3 5 将问题转化为求逆序对的个数! #include<iostream> #include<vector> #define pb push_back typedef long long ll; using原创 2020-10-13 13:48:19 · 144 阅读 · 0 评论 -
educational round 96 D.String Deletion
把所有区间长度都筛选出来,对1~k个区间 如果区间长度为1,找最近的一个区间长度>1的区间删点,如果不存在说明后续都是长度为1的区间直接ans += (k - i +1) /2 否则 ans++,对应区间长度减一,使用set解这个问题 #include<bits/stdc++.h> #define debug(x) cout<<#x<<" is "<<x<<endl #define fi first #define se second #de原创 2020-10-12 18:30:11 · 150 阅读 · 0 评论