codeforces
xtuls
退役acmer,准研究生
展开
-
1398E Two Types of Spells 权值线段树
假设目前有x个火魔法 y个星魔法 显然 y个星魔法让y个权值最大的魔法翻倍就行但是 有一个情况就是 y个星魔法就是前y大的魔法 这时候 肯定有一个y魔法不能翻倍 根据贪心 我们要去掉最小的y魔法 假如最大的x魔法用权值线段树维护上述操作即可 #include<bits/stdc++.h>using namespace std;const int N = 2e5+100;typedef long long ll;struct node{ int op,d...原创 2020-08-15 20:27:06 · 130 阅读 · 0 评论 -
codeforces E. Sum of Digits
这题可以暴力打本地表。。。 等正解出来再搞正解对于k=0 我们让9尽量多就行 这个可以特判对于k=1 暴力打表到1e9对于k>=2 暴力打表到1e6(发现1e6以上就没有变化了)当然这样做纯靠懵的 实在没办法了就这样搞#include<bits/stdc++.h>using namespace std;typedef long long ll;ll ans[155][10]={0,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,0,-1,-1,-..原创 2020-06-26 11:10:49 · 330 阅读 · 0 评论 -
CodeForces - 849E cdq分治
cdq分治的题 不过要先推出维度的关系显然想要得出一种数的答案 我们需要知道这种数在区间里面出现的位置 最后的位置减去最前面的位置即可但是我们无法很便捷的找到最后和最前的位置 却可以找出所有出现的位置设 pre[i] 为i位置的数上一次出现的位置 对于每一个这样的对(i和pre[i]) 他们的贡献是 i-pre[i]那么一种数对于整个区间的贡献就是i<=R pre[i]>=L 的所有贡献和三个维度分别是 时间,当前位置 i 和pre[i]对于每一个询问...原创 2020-06-24 11:51:29 · 387 阅读 · 0 评论 -
Codeforces Round #652 (Div. 2)
D. TediousLee我们先处理一下叶子结点(ye)和1个儿子的结点(one)之间的关系显然 找规律题 观察3号树 4号树和6号树的关系 发现4号树的叶子 在6号树变成了“爪子” 每个爪子贡献为4 然后我们去掉4号树的叶子 发现刚好得到了一棵完整的3号树于是 猜想规律是然后用样例验证一下就知道了#include<bits/stdc++.h>using namespace std;const int N = 2e6+20;typedef...原创 2020-06-24 11:38:14 · 116 阅读 · 0 评论 -
E. Johnny and Grandmaster 数论+思维
这道题的思路来源于一个叫zbr的大佬 真的挺秒的 仔细想想也不是很难 但是没有想到如此简便的做法首先我们要从大到小排序 这个应该没问题 因为大数的权重远远比小的大 所以先分配大的在分配小的其次 我们要清楚 对于一个大数 如果我们把他分配给一个集合 另外一个集合就要想办法凑出这个数 根据p^k这个特殊性 假设我们这个一个大数是 p^k 那么比它小的数 要么刚好凑成它要么不够凑 这是显然易见的 如果不够凑 答案就是 p^k减去所有比它小的数 否则 我们把p^k 凑出来 在重置差值为0 再...原创 2020-06-05 11:44:15 · 244 阅读 · 0 评论 -
cf 646 E. Tree Shuffling
贪心做,每次选ai最小的点向下遍历,然后做最大交换次数。 把剩余的(1个0或1个1存在根结点) 在继续这个过程就行 我们可以推断 走过的点一定不会再走(再走肯定不会更优)#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N = 2e5+10;ll a[N];int fa[N],b[N],c[N],cur,h[N],nex[N<<1],to[N<<1],v..原创 2020-06-01 01:43:44 · 155 阅读 · 0 评论 -
D - Yet Another Yet Another Task 用线段树写水题
a[i]的数据范围瞬间让这题变成了水题 我们枚举区间最大值 (从0到30) 负数没必要 因为当区间长度为1时ans为0 是最小值 我们只保留小于等于这个枚举值的数 然后维护最小前缀和就行了 如果碰到大于枚举值的位置 我们把最小前缀和设为正无穷#include<stdio.h>#include<algorithm>using namespace std;const int N = 1e5+10;int ans,b[N],sum[N];int main(){...原创 2020-05-29 20:59:12 · 2532 阅读 · 0 评论 -
线段树合并 CF 600E Lomsat gelral
这题和[Vani有约会]雨天的尾巴有些神似的地方 算是线段树合并的模板题把 每个结点维护一颗线段树 线段树维护颜色出现个数 以及编号和 pushup要写好 想清楚 最后dfs合并起来就行了#include<bits/stdc++.h>using namespace std;const int N = 1e5+10;typedef long long ll;#define ls T[rt].l#define rs T[rt].rll ans[N];int h[N],...原创 2020-05-24 21:19:43 · 148 阅读 · 0 评论 -
Codeforces Problem 707D Persistent Bookcase bitset+dfs
题目链接:codeforces.com/contest/707/problem/D这个题用了比较巧妙的dfs 我们先来看 1,2,3 操作 这三个都很好做我们维护1000个bitset 在相应的书架上进行操作就好关键是4操该如何维护 乍一看这像是维护历史信息 得用可持久化的数据结构 后来我看了题解之后豁然开朗大家可以看链接:https://blog.csdn.net/queuelovestack/article/details/52269321大概意思就是我们根据询问建立起来一颗d...原创 2020-05-21 10:08:33 · 232 阅读 · 0 评论 -
CF Round #643 (Div. 2) E - Restorer Distance
大佬说是三分裸题 于是我补了一下 确实挺裸的关于高度 显然是有一个cost 的峰值函数的 于是我们三分一个高度 然后进行计算记住计算的时候 要注意一个贪心 就是 当M<A+R的时候 我们先进行M操作#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N = 1e5+10;int n;ll A,R,M;ll H[N];ll checkmid(ll h){ ll a..原创 2020-05-19 20:07:58 · 1238 阅读 · 0 评论 -
CF Round #643 (Div. 2) C. Count Triangles
有人说这套题C比D和E 从过题的人数上来看确实这样 D题很好想 过的人很多 E题大佬说是三分裸题(大佬总能一眼看出)等下就补E我们来讲讲C题 其实有个很简单的而且细节也很少的方法 当时想了想 被队友叫去搞D了主要就是利用前缀和思想(虽然我求的是后缀)我们知道 在 X<=Y<=Z的情况下 要构成三角形就只有一个限制 那就是 X+Y>Z我们肯定要从a,b,c,d这几个范围下手先枚举最小的那条边a<=X<=b 从a到b枚举一遍对于第2条边 ...原创 2020-05-17 19:51:20 · 995 阅读 · 0 评论 -
CF Round #254 (Div. 1) C. DZY Loves Colors
我们维护区间最大值和最小值来判断区间的数是不是都相等 当更新操作更新很大的区间时 其后的更新操作(包括前一个更新区间的)复杂度就会降低 具体的证明我也不大会。。#include<bits/stdc++.h>using namespace std;const int N = 1e5+100;typedef long long ll;struct tree{ int ma,mi,l,r; ll val,lazy;}T[N<<2];void pushup(int..原创 2020-05-15 22:07:04 · 173 阅读 · 0 评论 -
CF Beta Round #19 D. Points 线段树
仔细看这个题是一个偏序问题 我们对x轴建立线段树 线段树上维护y的最大值 因为每个x都对应多个y 所以我们需要在叶子结点开一个set数组对于1,2操作 我们更新即可对于3操作 我们询问 区间 x+1~inf 这应该算个套路了 然后先询问左子树 保证是大于x的最小x 到了叶子结点 在经过set二分来找y 通过维护y的最大值 我们可以保证复杂度#include<bits/stdc++.h>using namespace std;const int N = 2e...原创 2020-05-15 20:56:40 · 166 阅读 · 0 评论 -
Codeforces Round #111 (Div. 2) E. Buses and People 线段树
这很像一个偏序的问题 但是我们要用线段树来解决它 仔细想想cdq应该也可 但是写起来比较麻烦我们就写线段树首先我们把人和车都按上车起始点排序 这样可以减少一维剩下还有终止点和时间这两维 我们对时间离散化 并且以时间(车辆的信息)开一棵线段树维护终止点的最大值 以及车辆的编号(应该是不存在时间相同的车的)对于每辆车 我们更新对应时间点的终止点以及车辆编号对于每个人 我们根据维护的终止点最大值 在pos~tot的区间上 去找最左端的合法点pos是这个人的时间离散后排的位...原创 2020-05-15 15:17:29 · 898 阅读 · 0 评论 -
cf Round #641 (Div. 2) D. Orac and Medians 思维
显然当某个区间(长度大于1)的中位数为k时,整个区间都可以变成k 但我们很难去找所有子区间的中位数 来确定它们是否为k我们得换个思路:https://www.luogu.com.cn/blog/Caro23333/codeforces-round-641-div1b-orac-and-medians-zhong-wen-ti-xie我们假设Ai==k Bi=1Ai<k Bi=0Ai>k Bi=2首先 数组里面必须包含k这个值其次 对于每个长度为3的区间 若这...原创 2020-05-14 16:23:52 · 198 阅读 · 0 评论 -
CERC2014 gym 100543L
这题完全没往dp上面想 害 有时候贪心和dp 还是很难分的开 该dp的写贪心大概率是只过样例的 一个比较好的方法是 看数据范围 但是这个也不完全准确 至于一些更进阶的方法 我也不晓得啊 有时候想个贪心也不知道对不对 想错误样例也想不到位 害 wo太难了这题对于每个区间找出d的最大值 然后枚举这个最大值对应的l和r作为决策点就行了#include<bits/stdc...原创 2020-05-05 10:03:12 · 156 阅读 · 0 评论 -
Gym - 100519 B Bring Your Own Bombs 离散化+二分+思维
题目链接:https://vjudge.net/contest/370255#problem/B我们考虑每一行每一列会爆炸的概率是多少 显然 对于会爆炸的每一行 位于该行的矩形的长都会爆炸 对于会爆炸的每一列 位于该列的矩形的宽都会爆炸 但是对于 行列都爆炸的但我 我们显然重复计算了 所以要容斥一下#include<cstdio>#include<algor...原创 2020-05-03 18:48:44 · 158 阅读 · 0 评论 -
cf #637 (Div. 2) D. Nastya and Scoreboard
这题看着就是一道dp,不过始终没找到什么合适的方法(太菜了) 一开始想着用string类型记录所有状态然后强行比较大小(然后发现string的比较和加运算都是o(n)的) 也就是搞了个N^3的算法 肯定gg了赛后看了一下别人交的代码 感觉还是思维太差了(当时始终想不到怎么记录dp的路径)首先我们要从低位向高位dp,为啥呢,因为在比较大小的时候是从高位开始逐一的比较,如果从低位可以推到...原创 2020-04-24 13:31:49 · 625 阅读 · 0 评论 -
E. Kaavi and Magic Spell 区间dp
个人觉得dp的边界条件应该是由状态转移方程所确定的 一般先确定状态转移方程 在通过合理性去判断边界条件这个题题意很好理解 给你两个串 s和t 用s去构建一个新串 每次按顺序取出s中的一个字母 可以加在新串的开头 或者结尾 问有多少种方法让新串的前缀是t如果要让新串的前缀是t串的话 那么s显然要通过某种方式和t串进行一个匹配 通过题意知道s串在取字母的时候可以放新串的前面或者后面 那我...原创 2020-04-17 09:41:47 · 213 阅读 · 0 评论 -
cf #635 (Div. 2) D. Xenia and Colorful Gems
有一种显然易见的策略,首先把r,g,b都排序 然后遍历 r 当前遍历到r[i] 通过lower_bound在g数组中找和r[i] 最近的两个元素设为 g[k] g[k+1] 我们再在 b数组中找和 (r[i]+g[k])/2最近的两个值 记为 b[x] b[x+1] 对于 g[k+1]我们进行同样操作 得到 b[y] b[y+1] 这样我们 求 四个元组 (r[i],g[...原创 2020-04-16 10:45:14 · 128 阅读 · 0 评论 -
CodeForces - 1151E 思维
是很难简单计算的 我们换一个角度去看 看每一个位置对答案的贡献是多少 但是位置必须得是联通块 才会有贡献 所以我们要对和进行适当筛选才能计算贡献首先对于位置我们计算它作为连通块右端点的贡献那要如何计算呢例如 序列 2 5 1 3 4 我们要让位置1的2作为联通块右端点 首先2要属于l和r 那么 l的取值范围 就是1-2 其次我们要让第2个位置的5和第一个位置...原创 2020-04-15 17:29:28 · 137 阅读 · 0 评论 -
CodeForces - 1142B Lynyrd Skynyrd 倍增+思维
这个题很多地方都想到了 最后卡在了倍增优化显然一开始给了一个环 我们可以找出每个值的前驱 当我们遍历a数组的时候 我们需要找出最小的包含一个循环的区间 为啥是最小呢 假如 这个循环是 3 1 2 然后a数组是 3 3 1 2 显然对于r=4的时候 l=2是最小区间 对于l<2的情况我们都是认为满足条件的 而相反我们不能把l=1作为最小区间所以对于每个r我...原创 2020-04-14 23:19:04 · 296 阅读 · 0 评论 -
CodeForces - 1141F2 Same Sum Blocks map套vector+贪心
题意就不说了我们知道每一种分法的值都相同 那么最多也就 n^2个区间 我们用map根据值把他们放进vector 因为题目要输出l和r所以我们的vector里面的元素也是 l和r 然后我们就暴力遍历每一个值 根据贪心策略 求出最多的不相交区间数就行了#include<bits/stdc++.h>using namespace std;const int N = 1...原创 2020-04-14 17:52:12 · 95 阅读 · 0 评论 -
cf #633 (Div. 2) E. Perfect Triples 打表找规律
我们跑个暴力的dfs 把三元组按顺序找出来 然后找规律(很多时候打了表我也不知道有啥规律)因为是异或操作 我们可以看二进制表 但是看四进制表可能更可以看出这个规律1行(第一块)001 002 0034行(第二块)010 020 030011 022 033012 023 031013 021 03216行(第三块)100 200 300101 ...原创 2020-04-14 13:12:22 · 169 阅读 · 0 评论 -
Codeforces Round #633 (Div. 2) D Edge Weight Assignment 猜结论
最小值:当任意两两叶子结点的距离都为偶数时 输出1 否则输出3 最大值:初始为边的个数n-1 也就是无论树的结构是什么样 一开始我们都默认 边是可以完全不同的 但有些比较特殊的情况 如果存在两个叶子结点 他们距离为2的话 他们必定相同 这时候最大值要-1 假如对于一个父节点 他有x个儿子是叶子那么这x个儿子的值必定相同 最大值-(x-1)因为n>=3 必定存在非叶子结点 我...原创 2020-04-13 12:26:29 · 78 阅读 · 0 评论 -
Codeforces 1316 E. Team Building 状压dp+贪心
题目链接题意:总共有n个人,每个人可以当做观众或者球员,每个位置只有一个球员,给定每个人当观众的价值和每个人在每个位置的价值。其中共有p(p<=7)个球员和k个观众,求出怎么安排使得总价值最大。首先得贪心选择 将观众的价值从大到小排序 这样观众的选择可以保证最优表示正在选第i个人 并且确定第i个人后球员的选择状态用二进制压缩的j来表示那么如果我们不选第i个人...原创 2020-04-11 14:43:04 · 96 阅读 · 0 评论 -
Codeforces 1334 D Minimum Euler Cycle 找规律
题目链接智杰巨巨带我做题这是个规律题把 我们就画几个完全图 然后找下规律 会发现那个序列是这样的:1 2 1 3 1 4 ... 1 n (2*n-2个数) 2 3 2 4 ... 2 n (2*n-4个数) 3 4 ... 3 n (以此类推) ... ...原创 2020-04-11 11:03:33 · 172 阅读 · 0 评论 -
CodeForces - 1108E2 线段树+扫描线思想
题意:要我们从m个区间中选任意个区间进行减一 操作 保证最后整个区间极差最大首先我们思考一下 当我们选的区间包含了最小值的时候 有两种情况:最大值包含在内 极差不变 最大值不包含在内 极差+1可见当最小值包含在一个区间内时,答案不会变差 那我们直接枚举区间 然后看当前最小值在不在这个区间不久行了 这样显然不行 其一 最小值有多个 其二也是关键一点 最小值不一定保...原创 2020-04-05 13:02:44 · 352 阅读 · 0 评论 -
CodeForces - 1114F 线段树+欧拉函数+状压
一开始不想求逆元 想着用乘法维护 及 其中pj是ai积所包含的质因子 k是每个质因子出现的次数,所有我开了63*2个树状数组来维护每个质因子的个数,然后果断超时了 。。后来看了题解才知道 就是从欧拉函数的原始公式下手 那我们要维护的就是区间l到r的积以及 区间出现的质因数种数(对应到值) 第一个很好维护 那第二个怎么维护呢 需要状压 我们可以发现 300以内...原创 2020-04-03 08:24:55 · 134 阅读 · 0 评论 -
CodeForces - 1077F2 单调队列优化dp
做F2之前我们先想想F1 怎么做 做了这两题可以在想题的时候更好地梳理自己的思路 以得到优化算法的方法因为F1数据小 可以n^3暴力 dp[i][j] 表示我们选到了第i个物品并且选了第i个以后我们有j个物品 以下是代码#include<bits/stdc++.h>using namespace std;const int N = 5e3+100;typed...原创 2020-04-02 13:23:52 · 447 阅读 · 0 评论 -
CodeForces - 1089K 线段树维护最大后缀和
首先要读懂题吧 任何骑士进入的时间大于 询问的t都不用考虑 而到达时间小于t的询问 我们要找出他们离开的最大值 他们全离开后才是公主进入的时间 我们询问1到t的最大后缀和 用这个时间减去t就是等待时间了#include<bits/stdc++.h>using namespace std;const int N = 1e6+10;typedef long ...原创 2020-04-01 19:56:36 · 123 阅读 · 0 评论 -
CodeForces - 1093E cdq分治 或 树套树
题意不说了 学了个新姿势:对于每个值 记录他们在a序列和b序列中的位置 假设我们以b的位置为x轴 a的位置为y轴 那么询问 就变成了 在 矩阵 左下角(lb,la) 右上角(rb,ra)内有几个点显然是cdq裸题 关键在上述转换 树套树也是同样的思路 但是比cdq慢很多cdq代码#include<bits/stdc++.h>using...原创 2020-04-01 14:49:42 · 181 阅读 · 0 评论 -
CodeForces - 1062E 区间lca
显然 询问的数量级比较大 那么就要快速求出区间的lca 易得:区间lca是区间dfs序最大的点和区间dfs序最小的点的lca那么我们 可以选择删除最大值点 或最小值点 在这两种情况下选 lca的深度最大的点就行我用的是树剖求lca 实际上倍增应该更好写#include<bits/stdc++.h>using namespace std;const i...原创 2020-04-01 14:30:32 · 260 阅读 · 0 评论 -
codeforces 1154E 链表
用链表维护就行,学习高级数据结构也不要忘了基础的数据结构代码用pre和suf数组模拟链表#include<bits/stdc++.h>using namespace std;const int N = 2e5+100;int pos[N],ans[N],pre[N],suf[N];int main(){ int n,k; scanf("%d%d",&n...原创 2020-04-01 14:11:00 · 207 阅读 · 0 评论 -
Codeforces Round #596 div2 D题
#include<bits/stdc++.h>using namespace std;typedef long long ll;const ll N = 1e5;const int MAX = 1e5+10;vector<ll>prime[MAX];ll a[MAX],cnt[MAX];ll powk[MAX],flag[MAX];int main(){...原创 2019-10-27 10:42:38 · 94 阅读 · 0 评论 -
CodeForces 1027D 并查集做法 最简单的做法没有之一
题目链接:http://codeforces.com/problemset/problem/1027/DMedicine faculty of Berland State University has just finished their admission campaign. As usual, about80%80%of applicants are girls and majori...原创 2019-08-03 14:36:41 · 319 阅读 · 0 评论 -
CodeForces - 853C 主席树维护矩形内的点数
n*n的矩阵 每一行给一个点 (保证列不同) 共n个点 这些点可以构成 n*(n-1)/2 个美丽矩阵 美丽矩阵的定义是 以两个点为对角的矩阵 现在有q个询问 每个询问给一个矩阵 问这个矩阵和多少个美丽矩阵相交我们得这样考虑问题 把这个n*n的矩阵分成9块7 8 94 5 61 2 3其中5对应的是我们询问的矩阵那么我们可以一次求出每一块矩阵有多少...原创 2020-04-10 14:20:14 · 397 阅读 · 0 评论 -
Codeforces Round #589 (Div. 2) C
思路:依照题目意思,先把x按照质因数分解,再用这些质因数用类似分解n!的方法去求sum例如:x有质因数2,n/2就可以知道n里面几个是2的倍数,但是对于4和8这些2的多次方的数都只算了一次,所以我们要让2累积,求出所有2出现的次数,这样sum*=pow(2,2出现次数);就求完2的了,其他质因数类似注意累积会爆long long,可用long double或者int128判断一下边界...原创 2019-09-30 20:24:46 · 145 阅读 · 0 评论 -
CodeForces - 848B 思维题+map套双端队列
思路来源:https://blog.csdn.net/qq_28954601/article/details/77800976首先容易得出的一个结论是 如果 会相遇的话 我们在观察一下 当一个人a改变线路时 和他相撞的另一个人b走了他的线路 假设b后面(向原点远离的方向)没有人 那么b的线路将不再改变 我们可以视为a将它的方向转移给了b 我们维护这个转移的过程就行...原创 2020-04-10 19:28:31 · 143 阅读 · 0 评论