栈,模拟 把每个元素逐个入栈 如果和栈顶元素匹配,那么一块弹出去,同时标记这里是可匹配的. 取出连续的,最长的可匹配的序列即可. #include <iostream> #include <stdio.h> #include <string.h> #define re register #define Clean(X,K) memset(X,K,sizeof(X)) using namespace std ; const int Maxl = 1000005 ; str…
P1944 最长括号匹配_NOI导刊2009提高 题解 宁愿相信世上有鬼,也不能随便相信某谷题目标签 我想了半天然后看了眼题解,发现用栈来模拟就好了 栈来模拟,还要用到一个bool数组,标记是否已经匹配 use[ i ] 一串括号,入栈,遇到匹配的就弹出去,标记已经匹配,然后最后挑连续匹配的最大的就好了,因为题目要求子串 注意两个点: 1.q[top]数组存的是括号的标号,而不是top是存的括号标号 2.res记录暂时一共有多少个连续的匹配括号数,所以每遇到一个新的括号,都要更新一遍 具体可以结…
传送门 非常傻的DP. f[i]表示末尾是i的最长的字串 #include <cstdio> #include <cstring> #define N 1000001 int f[N]; char s[N]; int n, p, ans; int main() { int i; scanf("%s", s + 1); n = strlen(s + 1); for(i = 1; i <= n; i++) { if((s[i - 1 - f[i - 1]] =…
P1950 长方形_NOI导刊2009提高(2) 题目描述 小明今天突发奇想,想从一张用过的纸中剪出一个长方形. 为了简化问题,小明做出如下规定: (1)这张纸的长宽分别为n,m.小明讲这张纸看成是由n*m个格子组成,在剪的时候,只能沿着格子的边缘剪. (2)这张纸有些地方小明以前在上面画过,剪出来的长方形不能含有以前画过的地方. (3)剪出来的长方形的大小没有限制. 小明看着这张纸,想了好多种剪的方法,可是到底有几种呢?小明数不过来,你能帮帮他吗? 输入格式 第一行两个正整数n,m,表示这张纸…
查看原题请戳这里 核心思路 题目让求最大费用的最小值,很显然这道题可以二分,于是我们可以二分花费的最大值. check函数 那么,我们该怎么写check函数呢? 我们可以删去费用大于mid的点以及与其相连的边,然后在剩余的点和边组成的图上跑一遍最短路求出从u到v需要消耗的最小的汽油,如果消耗汽油最小值不大于s,那么返回true,否则返回false. 注意事项 在二分时一定要判断到起点的花费是否大于mid r的初始值值应为$f_{max}+1$,因为如果$r_{start}=f_{max}$,那么…
传送门 思路 首先定义\(h\)数组,\(h[i][j]\)表示第\(i\)行第\(j\)列最多可以向上延伸多长(直到一个被用过的格子) 然后使用单调栈算出 \(l_i\)和 \(r_i\) ,分别是 \(h[i]\) 中左边第一个(从 \(h[i][j]\) 开始)不大于\(h[i][j]\)的数和右边第一个(从\(h[i][j]\)开始)小于\(h[i][j]\)的数 最终答案为\(ans +=\ (j - l[j]) * (r[j] - j) * h[i][j]\) 即在当前行i中,左边在…
P1952 火星上的加法运算_NOI导刊2009提高(3) 题目描述 最近欢欢看到一本有关火星的书籍,其中她被一个加法运算所困惑,由于她的运算水平有限.她想向你求助,作为一位优秀的程序员,你当然不会拒绝. 输入输出格式 输入格式: 第一行先愉入一个运算的进制N(2<=N<=36),接下来两行为需要进行运算的字符,其中每个字符串的长度不超过200位,其为N进制的数.其中包括0-9及a-z(代表10-35). 输出格式: 在N进制下它们的和 输入输出样例 输入样例#1: 复制 20 1234567…
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例: 输出样例: 说明 思路 AC代码 总结 题面 题目链接 P1951 收费站_NOI导刊2009提高(2) 其实还有一道双倍经验 P1462 通往奥格瑞玛的道路 题目描述 在某个遥远的国家里,有n个城市.编号为1,2,3,-,n. 这个国家的政府修建了m条双向的公路.每条公路连接着两个城市.沿着某条公路,开车从一个城市到另一个城市,需要花费一定的汽油. 开车每经过一个城市,都会被收取一定的费用(包括起点和终…
题目大意:有一张$n$个点$m$条边的图,每个点有一个权值$w_i$,有边权,询问从$S$到$T$的路径中,边权和小于$s$,且$\max\limits_{路径经过k}\{w_i\}$最小,输出这个最小值,若到达不了,输出$-1$ 题解:看到最大值最小,想到二分答案,二分这个最大值,每次对这个二分的答案跑一遍最短路,看是否可以到达就行了 卡点:1.没有判断起点的权值大于二分答案的情况 C++ Code: #include <cstdio> #include <algorithm>…
思路:二分+最短路 提交:1次 题解: 二分最后的答案. $ck()$: 对于每次的答案$md$跑$s,t$的最短路,但是不让$c[u]>md$的点去松弛别的边,即保证最短路不经过这个点.最后$return\space dis(s,t)<=$油箱容量 代码: #include<cstdio> #include<iostream> #include<queue> #include<cstring> #define R register int us…