- 2024-11-19Wtwy fan club 出征 icpc 大获全胜
第一次打ICPC貌似打得还不错,最后是11题12罚时,贡献了7题但是10罚时(((C其实就是选四个出现次数大于等于\(2\)的数,让他们两两差的和最大,记录一下出现次数扫一遍找最大,次大,最小,次小即可。D赛时脑瘫了多加了个分治的老哥,意识到时已经吃7发了。考虑以每个\(i\)做结尾
- 2024-11-17DP学习总结
动态规划是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。-----OIWiki例.1-最大子段和分析DP四步⑴定义状态定义\(dp_i\)表示以\(i\)结尾的最大子段和⑵分析答案答案即\({\max}^{i\in[1,n]}_{dp_i}\)⑶分析方程对于每个\(i\):可以与\([1,i-1
- 2024-11-16每日一题之最大子段和
给定由n个整数组成的序列a1,a2,…,an,序列中可能有负数,要在这n个数中选取相邻的子段ai,ai+1,…,aj(1≤i≤j≤n),使其和最大,并输出最大的和。例如:当{a1,a2,…,an}={1,-3,7,8,-4,12,-10,6}时,最大子段和为:sum=23。输入格式:第一行输入一个正整数N,表示序列的长度。N≤100000;第2行输入N个整数输出格式
- 2024-11-15最大子段和问题
最大子段和问题——————以洛谷P1115为例最大子段和,顾名思义就是在一段数组中选取元素和最大的子段(或最小)这里总结了动态更新的写法:intmain(){ intn,a,maxm,temp; scanf("%d",&n); for(inti=0;i<n;i++){ scanf("%d",&a); if(i==0)maxm=temp
- 2024-11-14[ZR] 绝对值划分
source:zr二十联测day19C题意定义序列\(\{a_i\}\)的权值为序列中元素之和的绝对值。定义一个序列的划分\(p_1,p_2,\cdots,p_k=n\)为将序列\(\{a_i\}\)划分成了\([1,p_1],[p_1+1,p_2],\cdots,[p_k+1,n]\)这\(k\)段。定义划分的权值为其划分出来的\(k\)个子段的权
- 2024-11-11Henceforth
区间所有子区间的最大子段和之和。对\(r\)扫描线。维护\([i,r]\)的最大子段和,做个历史和。考虑以\(r\)为右端点的最大子段和能更新的答案,对于一个区间\([l,r]\),其能被更新仅当\(sum_r-\min\limits_{i=l-1}^{r-1}sum_i>ans_l\)即\(ans_l+\min\limits_{i=l-1}^{r-1}sum
- 2024-10-24CSP-S 考前做题
P11218首先还是博弈论题要么打表找规律要么dp。然后注意到\(2\timesn\)网格这个东西非常典,状态数很少,可以状压。首先我们做一点观察:不难发现\(11\)一定全选,\(00\)可以选一个,然后\(01\)可以选两个然后没贡献,这样他就没法换,跑一遍最大子段和。然后注意到他换只能换
- 2024-10-21逐月破星杯
C.区间排序题目描述给定一个数组\(A\),你要按照如下方式对\(A\)排序:将\(A\)分割成互不相交的子段,且每个元素恰好属于一个子段。准备一个空数组\(B\),按顺序把这些子段完整地插入到\(B\)中的任意位置。求至少要分成几个子段。思路很明显我们会贪心的尽可能长的取子
- 2024-10-10[JOI 2013 Final]彩灯
[JOI2013Final]彩灯题意给出一个\(01\)序列,可以把一段区间反转。求反转后序列最长的交替子段,即\(010101\ldots\)或\(101010\ldots\)。思路首先发现一个性质,反转的一定是一段交替子段。因为反转不交替子段对答案的贡献不优。枚举反转哪一段交替子段,统计左右两边的
- 2024-09-13P1115 最大子段和(DP)
#include<bits/stdc++.h>usingnamespacestd;#definexfirst#defineysecondtypedefpair<int,int>PII;typedeflonglongll;typedefunsignedlonglongull;typedefunsignedintuint;typedefvector<string>VS;typedefvector<int>
- 2024-09-10【转载】mx noip day2 sol
T1捏捏这个题才是签到题。右边为逆序对总数。为左边的值找一个具体意义,我们将证明这个值不大于等号右边的值。考虑冒泡排序,右边即冒泡排序交换的次数(每交换一次一定减少一个逆序对)。左边一定不大于冒泡排序交换次数,因为左边的值只考虑了复原需要向左移动的数,而未考虑向右移动
- 2024-09-1051nod 最大M子段和v1/v2/v3
学习笔记最大M子段和V1\(N\)个整数组成的序列\(a[1],a[2],a[3],…,a[n]\),将这N个数划分为互不相交的\(M\)个子段,并且这\(M\)个子段的和是最大的。如果\(M>=N\)个数中正数的个数,那么输出所有正数的和。\(N,M<=5000\)。例如:\(-211-413-56-2\),分为\(2\)段,\(11
- 2024-09-0924.9.7 sol
T1捏捏这个题才是签到题。右边为逆序对总数。为左边的值找一个具体意义,我们将证明这个值不大于等号右边的值。考虑冒泡排序,右边即冒泡排序交换的次数(每交换一次一定减少一个逆序对)。左边一定不大于冒泡排序交换次数,因为左边的值只考虑了复原需要向左移动的数,而未考虑向右移动
- 2024-09-0951nod 1050 循环数组最大子段和
51nod1050循环数组最大子段和虽然是板子题,两种做法,我们先写一种,另一个咕咕。因为是循环,所以分为两种,中间的和两边的,中间的直接dp求最大,两边的转化一下就是总的数字和减去中间的最小数字和。#include<bits/stdc++.h>usingnamespacestd;#definelllonglonglla[500005]
- 2024-09-0851nod 1791 合法括号子段
51nod1791原题链接因为在括号串固定的情况下,括号的匹配是固定不变的。所以对左括号进行匹配,p[i]表示与i这个括号相匹配的括号的位置,易得到dp方程ans[i]=ans[p[i]+1]+1,然后再从后先前一遍求和即可。#include<bits/stdc++.h>usingnamespacestd;#definelllonglongconst
- 2024-08-25【数据结构-前缀异或和】力扣1177. 构建回文串检测
给你一个字符串s,请你对s的子串进行检测。每次检测,待检子串都可以表示为queries[i]=[left,right,k]。我们可以重新排列子串s[left],…,s[right],并从中选择最多k项替换成任何小写英文字母。如果在上述检测过程中,子串可以变成回文形式的字符串,那么检测结果为
- 2024-08-14洛谷题单指南-常见优化技巧-P1115 最大子段和
原题链接:https://www.luogu.com.cn/problem/P1115题意解读:最大连续子序列的和。解题思路:DP的做法可参考:https://www.cnblogs.com/jcwy/p/18144124也可以采用双指针来枚举:i从1开始,j=i用j来枚举连续序列,如果已有序列和+下一个a[j]>=下一个a[j],那个j一直++,累加序列和如果出
- 2024-08-11【最大子段和问题:不定长、定长、有长度上界】
题目思考我由这道题想起了一系列问题:最大连续子段和 贪心 最大连续子段和,但是区间长度为m 前缀和 最大连续子段和,但是区间长度小于等于m 我的思考是从贪心上面改 错误代码#include<bits/stdc++.h>usingnamespacestd;typedefl
- 2024-07-31子段和问题
Abstract本文主要介绍各种序列子段和问题。P1最大子段和传送门Introduction首先来看一道经典例题,求一段序列的最大子段和Idea考虑动态规划,令dp[i]表示在取第i个数的情况下,前i个数所能得到的最大子段和,那么显然有dp[i]=max(dp[i-1]+a[i],a[i]),其中a[i]表
- 2024-07-31最优 K 子段
素数的密度约为ln(n),这就是说,1~n中素数的个数约为\(\frac{n}{ln(n)}\)观察你写出来的DP转移式,可以发现检查时没有必要DP,直接贪心就好了由于数据随机,最后十分钟“乱搞”两次成功过题,开心~点击查看代码#include<bits/stdc++.h>usingnamespacestd;intprime[20005],m;i
- 2024-07-29最大子段和 - 题解
最大子段和时间限制:C/C++1000MS,其他语言2000MS内存限制:C/C++128MB,其他语言256MB描述给出一个长度为\(n\)的序列\(a\),选出其中连续且非空的一段使得这段和最大。输入描述第一行是一个整数,表示序列的长度\(n\)。第二行有\(n\)个整数,第\(i\)个整数表示序列的第
- 2024-07-22题解 P1115 最大子段和
link容易想到朴素做法:for(intl=1;i<=n;++i){for(intr=1;j<=n;++j){intv=s[r]-s[l-1];ans=max(ans,v);}}但是显然\(\mathrm{\color{#052242}TLE}\)再回头看代码:想要v最大,只需要\(\large{S_{l-1}}\)最小即可
- 2024-06-22最大子段和
include<bits/stdc++.h>usingnamespacestd;constintmaxn=200005,minn=-0x3f3f3f3f;intn,arr[maxn];intmaxSubSum(intle,intri){if(le==ri){returnarr[le];}intmid=(le+ri)>>1,leftSum=minn,rightSum=minn,sum=0;for(inti=mid;i
- 2024-06-20CH4301 区间最大子段和
给定长度为N的数组A,以及M条指令,每条指令可能是以下两种之一:1xy,查询区间[x,y]中的最大连续子段和。2xy,把A[x]改成y。对于每个询问,输出一个整数表示答案。数据限制:N<=5e5,M<=1e5,|A[i]|<=1000。提示:线段树,每个区间需要维护答案、前缀、后缀以及区间和。#include<bits
- 2024-06-05顺序表应用7:最大子段和之分治递归法
Description给定n(1<=n<=50000)个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时定义子段和为0,依此定义,所求的最优值为:Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n。例如,当(a[1],a[2],a[3],a[4],a[5],a