luogu P5324 [BJOI2019]删数】的更多相关文章

传送门 不如先考虑暴力,能删的序列首先有\(1,2,3...n\),还有就是升序排序后从后往前放数,第\(i\)位要么放\(i\),要么放\(i+1\)位置的数,例如\(1,2,4,4,5,6,9,9,9\) 如果一个数\(i\)出现了若干次,假如是\(num_i\)次,我们发现是可以在\(i,i-1,i-2...i-num_i+1\)上放\(i\)的,这样放完之后,如果有的位置没有用到现有的数放上去,那么就要从没用的数里改一个放过来,问题也就是用一堆数,最多能放多少个位置.考虑从后往前放,然后…
原题传送门 易知这个数列的顺序是不用考虑的 我们看两个数列 \(1,2,3\)和\(3,3,3\)都能删完,再看两个数列\(1,2,3,4\)和\(2,2,4,4\),也都能删完 不难发现,我们珂以把这些数字塞进桶中,记\(cnt_i\)表示数字\(i\)出现的次数,对于每个\(i\),在一颗线段树上把区间\([i-cnt_i+1,i]\)赋值成1(因为一次删\(cnt_i\)个珂以转化成每次删\(1\)个,值从大向小递减),最后看[1,n]上有几个点不是1,这就是题目所求的答案 单点修改就直接…
[BJOI2019]删数(线段树) 题面 洛谷 题解 按照值域我们把每个数的出现次数画成一根根的柱子,然后把柱子向左推导,\([1,n]\)中未被覆盖的区间长度就是答案. 于是问题变成了单点修改值,即修改两根柱子的长度.全体修改就可以理解为询问区间的平移. 那么只需要拿线段树维护这个东西就行了. #include<iostream> #include<cstdio> using namespace std; #define MAX 150150 #define lson (now&…
先考虑对于一个序列,能使其可以删空的的修改次数. 首先可以发现,序列的排列顺序是没有影响的,所以可以将所有数放到桶里来处理. 尝试对一个没有经过修改的可以删空的序列来进行删数,一开始删去所有的\(n\),然后序列长度变为\(x_1\),删去所有的\(x_1\),然后序列长度变为\(x_2\),删去所有的\(x_2\)--直到对于一个长度为\(x_i\)的序列,其中没有\(x_i\)这个数,那么此时就要对序列执行修改操作了. 考虑过程,当不能连续的删数时,就需要通过修改来填补空缺.实际上,对\([…
https://www.luogu.org/problemnew/show/P5324 题解 首先我们需要弄清这个答案是什么. 对于一个长度为n的序列,那么它先删的肯定是\(n\),删完之后它就会跳到\(n-cnt[n]\)位置,然后变成子问题继续做 . 于是我们把每个数看做一条覆盖\(n-cnt[n]+1 \sim n\)的一条线段,那么有解的前提是\(1\sim n\)中的每个数都被覆盖了. 如果没有,需要调整多少次呢? 可以发现,我们可以花费一的代价将一条线段的长度-1,再将另一条线段长度…
题面 传送门 思路 dp部分 以下称合法序列为原题面中可以删空的序列 这个是我在模拟考场上的思路 一开始我是觉得,这个首先可以写成一个dp的形式:$dp[i][j]$表示用$j$个数字填满了目标序列的前$i$需要的步数 然后,发现只有$dp[i][i]$有意义,所以优化为$dp[i]$表示达成了构成长度为$i$的序列需要的最小步数 猜一个转移方程:$dp[i]=min_{j\in[1,i-1]}(dp[j]+max(0,(i-j)-num[i])$ 这里$num[i]$表示当前询问的序列中数字$…
状态定义: 一眼区间$DP$,从左右两边删不好定义状态,不如定义$dp[i][j]$表示$[i,j]$未删的最大值,转移就很自然了 转移: 从左边删$dp[i][j]=max(dp[i][j],dp[k][j]+abs(a[i-1]-a[k])*(i-1-k+1))$ 删除区间$[k,i),i-1>k$ 从右边删$dp[i][j]=max(dp[i][j],dp[i][k]+abs(a[j+1]-a[k])*(k-j));$ 删除区间$(j,k],k>j+1$ 但是这样转移是转移不了只删一个的…
考虑无修改怎么做.对于1~n的每个数,若其存在,将最后一个放在其值的位置,剩余在其前面依次排列,答案即为值域1~n上没有数的位置个数.带修改显然记一下偏移量线段树改一改就好了. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; #…
CF风格题,先猜结论,记数列中i这个数共出现了cnt[i]次,那么所有区间[i-cnt[i]+1,i]的并集的补集大小就是答案. 于是我们只需要线段树维护每个位置是否被某个区间覆盖到即可,对于整体加减操作,设一个偏移量即可. #include<cstdio> #include<algorithm> #define ls (x<<1) #define rs (ls|1) #define lson ls,L,mid #define rson rs,mid+1,R #defi…
LOJ#3094. 「BJOI2019」删数 之前做atcoder做到过这个结论结果我忘了... em,就是\([1,n]\)之间每个数\(i\),然后\([i - cnt[i] + 1,i]\)可以放一条线段,没被线段放的地方就是需要改的数的总和 之后我们线段树维护区间最小值以及个数 我们要注意如果+1后使得一个本来在\([1,N]\)的点越出了范围,那么就要把这个区间给删掉,-1同理,要加进来 值域开成\(N + 2M\)也就是\(4.5*10^{5}\)即可 #include <bits/…
洛谷 P1106 删数问题 https://www.luogu.org/problemnew/show/P1106 JDOJ 2898: 删数问题 https://neooj.com:8082/oldoj/problem.php?id=2898 Description 输入一个高精度的正整数N,去掉其中任意S个数字后剩下的数字按原左右次序组成一个新的正整数.编程对给定的N和S,寻找一种方案使得剩下的数字组成的新数最小. 输出新的正整数.(N不超过240位)输入数据均不需判错. Input [输入…
题目描述 Description 键盘输入一个高精度的正整数N,去掉其中任意S个数字后剩下的数字按原左右次序将组成一个新的正整数.编程对给定的N 和S,寻找一种方案使得剩下的数字组成的新数最小. 输入数据均不需要判错. 输出组成的新的正整数.(N不超过240位) 输入描述 Input Description 第一行,输入一正整数N(N<=10240),表示要删的数: 第二行,输入一正整数S,表示删去的个数,当然S小于N的位数. 输出描述 Output Description 仅一行,输出删数后形…
1145: 零起点学算法52--数组中删数II Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 2935  Accepted: 793[Submit][Status][Web Board] Description 在给定的数组中删除数 Input 多组测试,每组第一行输入1个整数n(n<20),然后是n个整数 第二行输入1个整数m Output 删除在第一行的n个整数中的数字m(多个的话都要删除),…
[题目描述] 给出一个正整数序列 a,长度为 n,cyb 不喜欢完美,他要删掉一些数(也可以不删,即删掉0个),但是他不会乱删,他希望删去以后,能将 a 分成 2 个集合,使得两个非空集合的数的和相同,现在他希望你能帮他算出删数的方案数. [输入文件] 第一行 n 个正整数 以下有 n行,每行1个 正整数表示整数序列a [输出文件] 一个整数表示答案 [输入样例] 4 1 2 3 4 [输出样例] 3 [数据范围] 30%:n<=5 100%:n<=20 100%:a 中每个元素<=10…
题目链接 luogu P2657 [SCOI2009]windy数 题解 我有了一种所有数位dp都能用记忆话搜索水的错觉 代码 #include<cstdio> #include<algorithm> inline int read() { int x = 0,f = 1; char c = getchar(); while(c < '0' || c > '9') c = getchar(); while(c <= '9' && c >= '…
(洛谷t2755暂时过不去了) 删数问题[传送门] 洛谷算法标签: emmmm……删数问题又牵扯到了字符串.因为毕竟高精度的数240位呢!要是输入一个整型,要码240行来求出每一位……怕是还没求出来就tel了.所以我们又用到了字符串(真的很常用哎).这个题ac起来还是比较easy的,毕竟一本通上有题.BUT——一本通上本没有考虑删后的数是零的情况啊!我也没考虑,所以没有一遍a[桑心](下课辽要,直接附ac代码吧) #include<iostream> #include<cstdio>…
http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/2072.html 删数问题 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Description 键盘输入一个高精度的正整数n(≤100位),去掉其中任意s个数字后剩下的数字按照原来的左右次序组成一个新的正整数.编程对给定的n与s,寻找一种方案,…
Libre 6007 「网络流 24 题」方格取数 / Luogu 2774 方格取数问题 (网络流,最大流) Description 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法.对于给定的方格棋盘,按照取数要求编程找出总和最大的数. Input 第 1 行有 2 个正整数 m 和 n,分别表示棋盘的行数和列数.接下来的 m 行,每行有 n 个正整数,表示棋盘方格中的数. Ou…
删数问题(NOI94) 输入一个高精度的正整数N,去掉其中任意S个数字后剩下的数字按原左右次序组成一个新的正整数.编程对给定的N和S,寻找一种方案使得剩下的数字组成的新数最小.输出新的正整数.(N不超过240位)输入数据均不需判错.[输入] n s[输出]最后剩下的最小数.[样例输入] 175438 4[样例输出] 13 分析: 由于正整数n的有效数位为240位,所以很自然地采用字符串类型存贮n. 那么如何决定哪s位被删除呢?是不是最大的s个数字呢?显然不是,大家很容易举出一些反例. 为了尽可能…
P2426 删数 题目描述 有N个不同的正整数数x1, x2, ... xN 排成一排,我们可以从左边或右边去掉连续的i(1≤i≤n)个数(只能从两边删除数),剩下N-i个数,再把剩下的数按以上操作处理,直到所有的数都被删除为止. 每次操作都有一个操作价值,比如现在要删除从i位置到k位置上的所有的数.操作价值为|xi – xk|*(k-i+1),如果只去掉一个数,操作价值为这个数的值. 问如何操作可以得到最大值,求操作的最大价值. 输入输出格式 输入格式: 第一行为一个正整数N: 第二行有N个用…
题目描述 键盘输入一个高精度的正整数N,去掉其中任意k个数字后剩下的数字按原左右次序将组成一个新的正整数.编程对给定的N和k,寻找一种方案使得剩下的数字组成的新数最小. 输出应包括所去掉的数字的位置和组成的新的整数.(N不超过250位) 输入数据均不需判错. 输入输出格式 输入格式: n (高精度的正整数) k (需要删除的数字个数) 输出格式: 最后剩下的最小数. 输入输出样例 输入样例#1: 175438 4 输出样例#1: 13分析:贪心思想,我们每次删数肯定是要找前面的大数给删掉,并且这…
删数 题目链接 一道裸的区间DP,f[l][r]表示剩下区间[l,r]时的最大价值 可以由f[1~l-1][r]和f[l][r+1~n]转移过来 详见代码: #include<algorithm> #include<iostream> #include<cstdio> #include<cmath> using namespace std; #define N 105 int n,x[N],f[N][N],ans; int main() { scanf(&q…
删数问题 题目链接 首先找出最小的k个数:用堆每次取出最小的元素p,将p*2+1和p*4+5压入堆. 贪心求最大数:从前往后找第一个data[j+1]>data[j],删除data[j].(链表应该是比较快的,然而蒟蒻懒得写链表,用了一个数组瞎搞..不开氧气优化会T一个点) #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmat…
1321:[例6.3]删数问题(Noip1994) 时间限制: 1000 ms         内存限制: 65536 KB提交数: 5127     通过数: 1595 [题目描述] 输入一个高精度的正整数n,去掉其中任意s个数字后剩下的数字按原左右次序组成一个新的正整数.编程对给定的n和s,寻找一种方案使得剩下的数字组成的新数最小. 输出新的正整数.(n不超过240位) 输入数据均不需判错. [输入] n s [输出] 最后剩下的最小数. [输入样例] 175438 4 [输出样例] 13逐…
本文索引目录: 一.PTA实验报告题1 : 程序存储问题 1.1 实践题目 1.2 问题描述 1.3 算法描述 1.4 算法时间及空间复杂度分析 二.PTA实验报告题2 : 删数问题 2.1 实践题目 2.2 问题描述 2.3 算法描述 2.4 算法时间及空间复杂度分析 三.PTA实验报告题3 : 最优合并问题 3.1 实践题目 3.2 问题描述 3.3 算法描述 3.4 算法时间及空间复杂度分析 四.实验心得体会(实践收获及疑惑) 一.PTA实验报告题1 : 程序存储问题 1.1 实践题目:…
删数问题 Time Limit: 1000 msMemory Limit: 65536 KiB Problem Description 键盘输入一个高精度的正整数n(≤100位),去掉其中任意s个数字后剩下的数字按照原来的左右次序组成一个新的正整数.编程对给定的n与s,寻找一种方案,使得剩下的数字组成的新数最小. Input 输入有多组 每组包括原始数n,要去掉的数字数s: Output 输出去掉s个数后最小的数 Sample Input 178543 4 Sample Output 13 Hi…
P2426 删数 题目描述 有N个不同的正整数数x1, x2, ... xN 排成一排,我们可以从左边或右边去掉连续的i(1≤i≤n)个数(只能从两边删除数),剩下N-i个数,再把剩下的数按以上操作处理,直到所有的数都被删除为止. 每次操作都有一个操作价值,比如现在要删除从i位置到k位置上的所有的数.操作价值为|xi – xk|*(k-i+1),如果只去掉一个数,操作价值为这个数的值. 问如何操作可以得到最大值,求操作的最大价值. 输入输出格式 输入格式: 第一行为一个正整数N: 第二行有N个用…
删数问题(需知道的数学定理) 给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新 的正整数.对于给定的n位正整数a和正整数 k,设计一个算法找出剩下数字组成的新数最 小的删数方案. 定理: ex:1 2 3 9 5:删掉一个数: 从第一个数开始遍历,到寻找到单调递减的第一个数(即单调递增的最后一个数),则删除,若无单调递减子序列,则删掉最后一个非递减序列的数:每找到一个就又从头开始.即每做一次删数,就是一次贪心选择,删掉此数剩下的数为组成最小,经过证明,此结论正确.…
题目大意:一个数列若能在有限次数内删空,则称这个数列可以删空,一次删除操作定义如下: 记当前数列长度为$k$,则删掉数列中所有等于$k$的数. 现在有一个长度为$n$的数列$a$,有$m$次修改操作,为单点变值/整体增加或者减少$1$,问每次修改后,最少需要修改序列中多少个数,使得序列可以被删除. 数据范围:$n≤150000$. 我们首先考虑下最少需要修改的次数,我们设$b[i]$为数列$a$中填写了i的值得数量. 对于每一个$i$,我们可以用$b[i]$这么多数,覆盖区间$[i-b[i]+1…
题目:https://loj.ac/problem/3094 弱化版是 AGC017C . 用线段树维护那个题里的序列即可. 对应关系大概是: 真实值的范围是 [ 1-m , n+m ] :考虑设偏移量 fx ,使得 a[ i ]+fx 是真实值.如果整体 +1 ,就 fx+1 . 因为要记录每个值的个数,所以 a[ i ] 最好都是非负的.那么令 fx 的初值是 -m ,a[ i ] 的最小值是 “最小的真实值 - fx ”,就是 1-m+m 了. 已经有了 a[ ] 的范围是 [ 1 , n…