![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
模拟
陈末iiiiiiiiiiii
Retired
展开
-
Codeforces Round #756 div3 D 有根树的权值分配 贪心 模拟
题目给你N个节点的父节点Ai,当父节点和自己相同的时候就是根节点。再你一个权值数组,要求节点到根的路的所有边加起来的权值dist,按权值数组的要求的大小关系存在。当 P = 3,1,2,5,4 时 ,要求3节点最小,1节点第二小…以此类推。要你提供一种合法的权值分配方案。即给每个节点到父节点的边赋值。没有合法方案输出-1.题解思路树的题写的太少了,也挺怕这种题的。一开始就想什么dfs。结果可以暴力的,我们按顺序给节点从小到大赋值即可。儿子节点的值肯定比父节点大。所以他的顺序也必须在父节点后原创 2021-11-29 21:53:01 · 283 阅读 · 0 评论 -
Deltix Round, Autumn 2021 ( Div. 1 + Div. 2) C 双指针 模拟 余数块问题
题目给你一个长度为N的数组A给你 一个 数 K 。让你确定有几个 ( i , e ) 组合 使得这个K连续的乘积为一个素数。题解思路第二次碰到这种问题,其实按乘积连续,其实就是用他对K的模数继续分块。这样能保证每个点只进一次。先筛出素数。要组成素数,肯定是前面一堆1加一个素数加后面一堆1。这里堆也可能是0个。所以对每个素数,我们处理出他前面有几个1,后面有几个1。然后进行组合就行。利用双指针来处理。记得开longlong,因为,这里是有相乘的运算,所以很可能会爆。AC代码#in原创 2021-11-29 15:22:08 · 207 阅读 · 0 评论 -
Codeforces Round #756 (Div. 3) F 类滑动窗口的双指针 模拟 尺取法
题目有N个人在AMT机前,ATM机内有S元,每个人会存Ai元或者取-Ai元,取决于Ai的正负号。当ATM机钱不够下个人的时候就会关闭。请你选择一个连续的区间,使得ATM机能服务最多的人。题解思路很明显,找一个最长的连续区间使得区间和 sum + S >= 0 。利用双指针来维护区间,时间复杂度是On的。将每个头指针都延展到能延展的最大长度即可。记尾指针。更新答案,并且将这个头指针往前,并将头指针值弹出。再用记忆了的尾指针继续往后探。这样每个点最多被访问2次。上次写过类似的,这次原创 2021-11-27 11:46:44 · 623 阅读 · 0 评论 -
2021牛客寒假算法基础集训营4 G 暴力模拟 离线逆向处理 标记指针
题目题解思路(突破点)通过性质 后面填的会把前面填的覆盖了所以,我们逆向处理 。从后面往前填,并且在填过的点放上前向指针和后向指针,这样可以保证每个点只被处理一次,这样复杂度就是够的。这里每个点加的数要处理好。这题也能开2000个线段树来维护这个情况。AC代码#include <bits/stdc++.h>//#include <unordered_map>//priority_queue#define PII pair<int,int>#defi原创 2021-11-25 10:19:20 · 380 阅读 · 0 评论 -
Codeforces Global Round 17 B 双指针 模拟
题目给你一个序列A要求只删除一个值(删除他的一部分或者全部或者不删)使得原序列为回文序列4 2 1 2 41 2 1特别的单个值也是回文序列1题解思路第二次碰到这种题目了,还是Wa了一发。直接两个指针一头一尾。碰到不同的时候就是不是你死就是我亡。肯定是选择删除两个种的一个。枚举即可。AC代码#include <bits/stdc++.h>//#include <unordered_map>//priority_queue#define PII p原创 2021-11-24 18:01:54 · 295 阅读 · 0 评论 -
华东交通大学2021年ACM“双基”程序设计竞赛 I 括号 栈+模拟
题目题解思路连续的两个数字组成的每对合法的括号对(())的贡献等于 合法匹配对的个数 + 和之前的连续合法对的组合(即加上之前的数量)(())() 第2对个的贡献是 1 + 1()()() 第3对个的贡献是 1 + 2()(()) 第2个对的贡献是 2 + 1还有一些不等的对的情况()((())())((())这种不匹配的时候要将它之后的连续贡献取成1,但是在它和之后多的右括号合并之后又有可能连上之前的连续括号对,然后连续贡献又边大了。所以这里用到了两个栈。一个栈存多的右括号另原创 2021-11-20 10:31:09 · 333 阅读 · 0 评论 -
2021牛客寒假算法基础集训营2双端队列的运用+模拟
题目题解思路性质(突破点):由于翻转一次后只能翻转左端点之后的点,所以这个翻转的左端点必然要让它等于i,如果这样不能相等那么之后一定翻转不到它。这样就形不成这个序列了。那么如果模拟这个过程呢?直接数组reverse?那肯定超时的。大佬们提供了一种思路利用双端队列来两头判断数。当这段区间翻转后从后头加数,前头先将翻转区间导入。当相等就将前头的数pop不等的时候肯定是需要翻转或者操作不到了。再翻转后就前头加数,后头先将翻转区间导入。以此类推。表示好这两种状态即可。当数加完的时候,要判原创 2021-11-15 20:39:17 · 258 阅读 · 0 评论 -
Codeforces Round #753 (Div. 3) C 贪心+模拟
题目给你一个长度为N的序列,每次可以让整个序列减去最小值而生成新的最小值。要求:最大化最小值。题解思路因为是让整个序列减去的同一个值,所以大小关系不变。我们直接排序,然后从最小的开始一直往前减并且更新答案就行了。这种题目知道怎么写但是没写出来。真的无语。最近是真的菜的离谱。AC代码#include <bits/stdc++.h>//#include <unordered_map>#define PII pair<int,int>#define ll原创 2021-11-03 09:21:59 · 111 阅读 · 0 评论 -
2021 ICPC 江西省大学生程序设计竞赛 J 二分 队列 模拟
题目你有一个可以调节容量的(存放数字)容器,一开始为空。给你N次查询 。问有至少多大的容量能完成K次完美操作。如果这个数字不在容器,并且容器满了,那就将最久之前查询的数从容器种删除,再加上这个数。如果容器没满就直接加入。如果在容器就将这次查询称为完美操作。题解思路容器越大,完美操作数肯定越高。因为不会使别的数被删除。所以容量具有单调性。这样我们就可以二分枚举出这个答案了。log这样我们需要在On内判断出枚举的答案的准确性。我们利用哈希表和队列来模拟这个操作。用哈希值来记录在不在容器里。原创 2021-10-25 20:25:11 · 205 阅读 · 0 评论 -
Codeforces Round #750 (Div. 2) C 双指针 模拟
题目给你一串字符串,你选择一种字符来删除使他变成回文字符串,选择了就只能删除字符串里的任意个数的这种字符。求最少删除的次数。题解思路一开始没看清题目,以为任意都能删除。后来发现只能选择一种,那样就很显然了。直接找到第一个不同的字符对,删除他们两个其中一个。如果能得到回文串就取最小值。之前相同的肯定不用删,因为加和不加他们对里面的回文串是没有影响的,删除他们反而得不到最优解。考虑删除某个字符时,我们用双指针来跑,不同而且可以被删除就删,不能就得不到回文串。可惜我模拟错了。真菜啊。AC代码原创 2021-10-25 18:06:16 · 139 阅读 · 0 评论 -
166. 数独 DFS 之 剪枝 二进制 位运算 优化 思维
题目题解思路4大剪枝常用剪枝策略首先进行优化搜索顺序,每次搜索可以放的数最少的的点 。再根据行列九宫格不能相同,想到位运算优化(我是想不到)。利用按位与 & 的 清零性质 (即一位为0 按位与出来的一定是 0 )用 0 表示放了这个位置的数 , 1表示没放 。这样的话 每行列和九宫格的 所有状态 就可以用一个 2 ^ 9 - 1 的 数 表示了其次这里可以lowbit来快速找出1的位置来让我们放数 。实现初始化将 所有行列 子棋盘的状态变为1 即表示都没放原创 2021-10-15 19:54:35 · 271 阅读 · 0 评论 -
Codeforces Round #748 (Div. 3) E 模拟 无向图点的入度
题目树是无环的无向连通图。这个问题是关于无根树的。一棵树的叶子是一个顶点,最多连接一个顶点。园丁维塔利从 n 个顶点种了一棵树。他决定修剪这棵树。为此,他执行了许多操作。在一次操作中,他移除了树的所有叶子。一棵树的例子。例如,考虑上图所示的树。下图显示了对树只应用一个操作的结果。将“移除所有叶子”操作应用于树的结果。注意操作的特殊情况:对空树(0 个顶点)应用操作不会改变它;对具有一个顶点的树应用操作会移除该顶点(该顶点被视为叶子);对具有两个顶点的树应用操作会删除两个顶点(两个顶点都被视原创 2021-10-14 18:36:30 · 68 阅读 · 0 评论 -
3993. 石子游戏 模拟 前缀和
题目题解思路一开始用全部多的数来二分搜答案,后面wa了才发现是思路错了。因为不一定前面的每次我们都能取到k个数,我们只能通过模拟来让每一步合法。模拟控制 h,每次取的数要尽量靠近K不能大。将将石子堆的数放入桶中,取最大的和最小的作为上下界。求出h数组前缀和这样我们就能O1的求出某一部分的数的个数了。一层一层的控制取出的总石子K的个数当大于时就加一次个数这样就能贪心出最小次数这里可能有点难理解 , 因为j时一层一层往下的所以直接加就是石子数,h[ma] - h[j-1]就是大于J的石子的总原创 2021-10-03 18:55:26 · 72 阅读 · 0 评论 -
Codeforces Round #538 (Div. 2) B 贪心 整体考虑
题目题解思路整体考虑整个最值,我们可以知道前KM大的数一定可以加上。区间分成k份,每份取前M个,整合一下就是 全部前KM大的数 。我们只需标记这些数,对每个区间都取到M个即可。学长这里用了个骚操作来解决负数问题这里B数组存的是编号,这样就是存储了A数组降序排的时候的原编号。这里太妙了。bool cmp( int t1 , int t2 ){ return a[t1] > a[t2];} for (int i = 1 ; i <= n ; i++ ) {原创 2021-08-17 00:30:35 · 54 阅读 · 0 评论 -
CodeForces - 1095D 思维 逻辑模拟 想复杂了
题目题解思路AC代码#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <vector>#include <algorithm>#include <map>using namespace std;const int INF = 0x3f3f3f3f;struct node{原创 2021-07-27 15:00:56 · 73 阅读 · 0 评论 -
CodeForces - 1095E 括号匹配 栈的运用
题目题解思路各种前缀后缀中缀表达式都可以由栈来解决。每个括号需要找到他对应的括号。我们将左括号压栈,当遇到右括号时出栈。将括号的编号压栈!此时我们遵循括号就近匹配,利用先进后出来推出的。(这个特性有助于推出答案)当遇到无法处理(栈中没有元素来匹配)的括号时前压栈,由于我们只能进行一次操作,所以最后栈中只能存在2个无法匹配的元素。由于每种情况不同,我们进行分类特判处理。))左括号无法匹配,此时我们现在左括号前的任意与左括号相同的元素来替换,因为左括号右边的元素已经被匹配。(参考前面的特性)原创 2021-07-27 14:06:41 · 166 阅读 · 0 评论 -
ACwing 3624. 三值字符串 双指针 当时没写出来
题目链接题解思路闫总用了这一步属实想不到,让右指针保证了每一个数的必要性,再让左指针将字符串读完。当存在新答案时更新。右指针的这个操作没想到。 while( vis[a[j] - '0'] > 1) { vis[a[j]-'0']--; j++; }AC代码#include <iostream>#include <cstdio&g原创 2021-06-07 19:55:11 · 49 阅读 · 0 评论 -
CodeForces - 961B 双指针 看清数据范围 注意变量 WA了N次
题目题解思路用双指针维护大小为k的区间即可,暴力往回走直接TLE。100000个 10000时爆int答案数据范围大于int 用long long 。很简单的双指针,写错那么多次,都是自己太急,写了不少错误,没认真考虑。AC代码#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <cmath>#include <原创 2021-06-04 09:18:41 · 132 阅读 · 1 评论 -
ACwing 每日一题 3554. 二进制 auto 二进制转十进制 位运算 和闫总的思维差太多了
题目题解思路拿到题目知道是水题,但是我居然想着用char数组来模拟。这下坏了,用char得麻烦死,知道可以二进制转十进制,但是有点写不出,我就被卡了很久。看了wph大佬的代码,发现int数组直接就能做了,模拟进位就行了啊。再看闫总的代码,感受到了和大佬的差距。闫总直接存string,用auto枚举string的每一位,转成十进制,再写个从33位(因为可能32位加成了33位)开始十转二函数,33位为0就不输出,即可。感觉自己还是太弱了,水题也想的很复杂。要多提升思维啊!AC代码#includ原创 2021-05-24 20:00:52 · 102 阅读 · 0 评论 -
HDU2054 A == B ? 终于来补的一道模拟题 纪念一下 只要敢模拟模拟题就是弟弟
题目地址链接题解思路不断根据 前面多0 后面多0 有无小数点 进行测试模拟 不断debugAC代码#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using namespace std ;const int maxn = 1e5;char a[maxn];char b[maxn];int main(){ while(cin&g原创 2021-04-27 21:38:21 · 84 阅读 · 2 评论