首页 > TAG信息列表 > NEX
P1081 [NOIP2012 提高组] 开车旅行
记城市 \(i\) 的海拔高度为\(h_i\), \(i\) 和 \(j\) 之间的距离 \(d_{i,j}=|h_i-h_j|\)。 旅行过程中,两人轮流开车,第一天 \(A\) 开车,之后每天轮换一次。选择一个城市 \(s\) 作为起点,向编号大的一方行驶,并且最多行驶 \(x\) 公里就结束旅行。 \(B\) 总是沿着前进方向选择一个最近的NC20185 [JSOI2010]缓存交换
题目 原题地址:[JSOI2010]缓存交换 题目编号:NC20185 题目类型:堆、贪心 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 1.题目大意 Cache容量以及主存单元访问次序一致,求最少的非命中次数 2.题目分析 每次删除缓存区中元素中下一次出现最晚的 3.题目代区块反转(模拟、链表)
题意 题目链接:https://www.acwing.com/problem/content/description/4280/ 数据范围 \(1 \leq K, N \leq 10^5\) 思路 这道题难度不大,但是我们需要思考如果写得更加简短。 这里给出yxc的实现方式。以地址为索引,使用两个数组存储节点的数值以及下一个节点的地址。 用一个数组按照洛谷-P3388 【模板】割点(割顶)
【模板】割点(割顶) tarjan 学了一下割点,发现就是找 \(low[nex] \ge dfn[now]\) 的点,同时根的话要求有两个分支才能作为割点 搜索的时候如果 \(nex\) 没有被访问过,则直接继续搜,如果访问过,则尝试通过 \(dfn[nex]\) 来松弛自己的 \(low[now]\),因为只考虑当前点能跑到的最上面的点,这与CodeForces-1601B Frog Traveler
Frog Traveler dp + bfs 感觉又像搜索 从后往前进行状态转移,像 \(bfs\) 一样保证当前搜索的是消耗次数最少的 状态转移因为是一个连续的区间,因此考虑当前能上升到的最大距离,只有能更新这个最大值,才进行状态转,保证每个位置只被访问一次 时间复杂度 \(O(n)\) #include <iostream> #iCSES-1682 Flight Routes Check
Flight Routes Check 判断是不是一个强连通图,如果不是,就找出不能到达的单程 tarjan 模板 判断不能到达的,直接从 \(1\) 开始走一次搜索,如果与 \(1\) 不同强连通块上的点,且 \(1\) 能够到达那个点,显然答案就是从那个点到 \(1\) 记得考虑整个图不连通的情况 #include <iostream> #inclmanacher和字典树
manacher求最大回文串, 1 char str[N]; 2 ll pre[N]; 3 ll ans = 0; 4 void getstr(string s){ 5 int dex = 0; 6 ll len = (ll)s.size() * 2 + 1; 7 for (ll i = 0; i <len ; ++i){ 8 if (i & 1){ 9 str[i] = s[dex++]; 10洛谷 P2764 最小路径覆盖问题 题解--zhengjun
思路 只需要用二分图匹配,每一次连接了一对匹配,相当于合并了两条路径(单个点也认为是路径),所以要让路径总数最小,就要让匹配的数量最大,由于是路径,所以每个点的入点和出点都最多只能连两条边。 代码 #include<bits/stdc++.h> using namespace std;typedef long long ll;const int N=3e2[loj3006]破壁
显然可以直接贪心,即每一次移动尽量少的距离,时间复杂度为$o(nm)$ 不难发现,以下两类攻击可以被删除: 1.连续两次攻击位置相同,则删除其中一次攻击 2.连续三次攻击位置形如$a<b<c$或$a>b>c$,则删除中间的攻击 此时,攻击位置即形如$a_{1}<a_{2}>a_{3}<a_{4}>...$(或交换$<$和$>$) 取其中最近字符串基础(代码,易错):hash,KMP,tie
kmp:寻找最长子串(次数和位置) const int N=2;int lenw,lent;char w[10000+2],t[1000000+2];int nex[10000+2],f[1000000+2];inline void before(){ for(register int i=2,j=0;i<=lenw;++i) { while(j>0&&w[j+1]!=w[i])j=nex[j]; if(w[j+1]==w[i])nex[i]=++j; else nex[1017 Queueing at Bank (25 分) (模拟 23/25
添加链接描述 /* 每个客户最多被服务1小时 给的小时 分钟 秒 超过17.00.01不被服务 提前来要等待 保留一位小数 */ #include<bits/stdc++.h> using namespace std; const int N=1e4+9; struct node { int st,nex; }t[N]; bool cmp(node a,node b){ return a.st<b.st做题记录 牛客寒假基础训练3-I
题目链接 此题我原本的思路是:建立前缀和数组t[],表示前i个字符的种类总数。对于任意的i,在i+l-1之后找到第一个j使得j>=i+2即可。注意j之后剩下的字符数是否大于等于r。 但这种做法是错误的。考虑IE$abQ这样的字符串,这种方法会少统计$abQ从而得到错误答案。 看起来比起从第一剑指offerJZ24
问题: 给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。 数据范围: n\leq1000n≤1000 要求:空间复杂度 O(1)O(1) ,时间复杂度 O(n)O(n) 。 如当输入链表{1,2,3}时, 经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。[6] Nightmare
Nightmare Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Problem Description Ignatius had a nightmare last night. He found himself in a labyrinth with a time bomb on him. The labyrinth has an exit, Ignatius should get ouCF1592C Bakry and Partitioning | 异或
传送门 题意 给定一颗大小为\(n\)带点权的树, 和一个整数\(k\) 询问是否可以删除至多\(k-1\)条边(至少1条), 将树分成至多\(k\)个连通块,使得每个连通块中的点权异或和相同 题解 这种题的思路大概就是考虑分成很多连通块时, 是否能用较少的联通块等效代替 容易想到, 如果划分成\(m\)个C. XOR Inverse 题解(字典树求逆序对)
题目链接 题目思路 字典树居然还能求逆序对,震惊 就是利用字典树求逆序对的思想来解决此题 妙蛙种子 代码 #include<bits/stdc++.h> #define fi first #define se second #define debug cout<<"I AM HERE"<<endl; using namespace std; typedef long long ll; typedef unsigned lon【赛前复习】树形DP
前言: 没有,下一个 学习博客: 简单介绍: 题目 Fire Fire 给定一棵树,对于任意节点 \(i\) 需要满足至少一个条件。 1.可以花费一定代价 \(w_i\) 建消防站; 2.离它最近的消防站的之间的距离不超过 \(D_i\), 求满足条件的最小花费。 \(dp_{i, j}\): 表示城市 \(i\) 的负责点是 \(j\) 的情leetcode 腐烂的橘子
994. 腐烂的橘子 在给定的网格中,每个单元格可以有以下三个值之一: 值 0 代表空单元格;值 1 代表新鲜橘子;值 2 代表腐烂的橘子。 每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。 返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1。kmp算法(详解)
在日常生活中我们常常会遇见在一篇文章中找关键词的事情。如果用程序来解决你会怎么做??? ps:假设文章字段为t, 关键词为p 暴力解法: 枚举文章中的每一个点,然后往后匹配是非为关键字??? 就像这样, 挨个匹配每个字符。 int lent = strlen(t); int lenp = strlen(p); for(int i = 0; i <[loj6031]字符串
为了方便,用$N=10^{5}$来描述复杂度 (对原串建立SAM)注意到$\sum|w|=qk\le N$,考虑对$q$和$k$的大小关系分类讨论: 1.若$q\le k$,即询问次数较少,将其与原串建立一个广义SAM,然后找到枚举所有区间,倍增找到该区间对应子串的位置,该right集合大小即为答案,时间复杂度为$o(qN\log N)$ (建立广义SCF1516D Cut 题解
描述: 给定 \(n\) 个数的序列和 \(q\) 次询问,每次询问给定区间 \([l,r]\) ,求出至少将其分割成几个子区间,才使得每个子区间的 \(\operatorname{lcm}\) 等于区间内所有数的乘积。 思路: 区间 \([l,r]\) 内所有数的乘积等于其 \(\operatorname{lcm}\) 当且仅当 \(\gcd(a_i,a_j)=1\) ,其HDU----1242(BFS)
题目链接 Rescue 代码如下 #include<bits/stdc++.h> using namespace std; const int M = 205; int dx[] = {1,0,0,-1}; int dy[] = {0,1,-1,0}; int n,m; int vis[M][M];char mp[M][M]; struct dot { int x,y,time; }; bool in(dot gx) { if(gx.x>=0&&gx.x<n&a翻转链表II
详细思路 链表题,别管其他的,先给我画图 画图 class Solution { public: ListNode* reverseBetween(ListNode* head, int left, int right) { ListNode*dummy=new ListNode(0,head); ListNode*pre=dummy,*L=head,*R=dummy,*nex=head;P2234 [HNOI2002]营业额统计题解
题目传送门 一、双链表解法 1、需要记录原始数据。 2、为了按金额排序,同时还需要记录相应的第几天,所以引入了结构体。 3、按结构体排序后的结果组成了一个双链表,本质上就是按金额从小到大排序的链,而链表中保存的数据是天数,注意,是天数,而不是金额。就是哪一天排在哪一天后面。 4、倒剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
pre, nex = 0, 0 while pre < len(nums): if nums[pre] % 2 == 1: nums[pre], nums[nex] = nums[nex], nums[pre] nex += 1 pre += 1 return nums ''' l, r =