有前缀和, 前缀GCD, 前缀奇数个数, 前缀偶数个数, 前缀差, 还有就是相对位置很重要的, 还有就是区间和的.等等(特别是区间和的, 一定可以用前缀和的思想来做!!!), 都要根据自己的思想来去解决!!!,前缀思想真的还是挺考人的, 如果想不到的话…..记住 : 一般涉及到区间的什么值时, 就要用前缀思想.

HDU — 4223
思路 : 目的是找一个子串, 其和的绝对值最小. 其实不用前缀思想也好写出来, 但是我一下就想了下前缀, 因为
子串还是一个区间赛. 所以求一个前缀和, 并排序, 然后一个一个相减, 这样的差值就是某一个子串的最小值.
因为是排好序了的, 所以要最小一定是在某一个前缀和差值里, 然后加上一个绝对值就是了.
总之 : 看到区间就要联想的前缀思想.

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=1e3+5;
int cas=1;
int ans[maxn];
int a[maxn];
int main()
{int t;scanf("%d",&t);while(t--){int n;memset(ans,0,sizeof(ans));scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);}for(int i=1;i<=n;i++)ans[i]=ans[i-1]+a[i];sort(ans,ans+n+1);for(int i=0;i<=n;i++)printf("%d ",ans[i]);printf("\n");int res=ans[1]-ans[0];for(int i=1;i<=n;i++){if(abs(ans[i]-ans[i-1])<res)res = abs(ans[i]-ans[i-1]);}printf("Case %d: ",cas++);printf("%d\n",res);}
}
/*题目描述 : 给你n个数(n < 1e5), 问不能拼出的最小数是多少(从 1 开始算), 比如 : 1,2,3,4,5 不能拼出最小
的数为16 . 1,2,4,5 不能拼出的最小数为13.  2,3,4,5不能拼出的数为 1 .
输入的n有多组数据, 每一个数<1e9.*/
// 思路 : 前缀和思想. 如果后面的数字如果大于前缀和+1 说明他和区间没有交集 前缀和+1 这个数字就达不到 就不连续了, 就输出此时的前缀和+1.
//代码如下 :
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1e5+5;
int a[maxn];
int main()
{int n;while(~scanf("%d",&n)){for(int i=0;i<n;i++){scanf("%d",&a[i]);}sort(a,a+n);  //记得排序哦.int ans = 0;for(int i=0;i<n;i++){if(a[i] > ans + 1)  //如上面所说. 主要原因是连续的数之间是有一定的联系的.break;ans += a[i];}printf("%d\n",ans+1);}
}

HDU — 6025
思想 : 因为是要删除其中一个数, 然后是总Gcd最大, 一个个删肯定会T, 所以删除一个, 相当于求前一个区间和后一个区间的GCD,
所以我们想到用求前缀GCD和后缀GCD的方法, 这样我们只需要扫一遍就可以求出来最后答案.
AC Code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define CLR(x) memset(x,0,sizeof(x))
using namespace std;
const int maxn=1e5+5;
const int inf=1e9;
int qian[maxn],hou[maxn];
int a[maxn];
int main()   //思路求前缀和后缀GCD这样删数的复杂度是n.
{int t;scanf("%d",&t);while(t--){CLR(qian);CLR(hou);int n;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);}qian[1]=a[1];hou[1]=a[n];for(int i=2;i<=n;i++){qian[i]=__gcd(qian[i-1],a[i]);}for(int i=2;i<=n;i++){hou[i]=__gcd(hou[i-1],a[n-i+1]);}int maxx=max(qian[n-1],hou[n-1]);for(int i=2;i<=n-1;i++){int m=__gcd(qian[i-1],hou[n-i]);if(m>maxx)maxx=m;}printf("%d\n",maxx);}
}

SHU 1952 题目 :(维护前缀和)
Description
已知一个长度为N的数列A[1..N]。
现在给出Q次查询,每次查询一个区间[L, R]。
对于每一个区间,求使得(A[i] + A[j])为奇数的(i, j)的对数 (L <= i < j <= R)。

Input
多组数据,第一行有一个整数T表示数据组数。(T <= 5)
之后有T组数据,每组数据第一行为两个整数N和Q,表示数列长度及查询数量。
(1 <= N, Q <= 100000)
接着有一行N个元素的数列A[1..N]。(1 <= A[i] <= 1000)
接下来Q行,每行有两个整数L, R,表示查询的区间。(1 <= L <= R <= N)

Output
对于每次询问,输出一行数字,表示区间”Odd Pair”的对数.
Sample Input
1
5 2
1 5 3 4 2
1 5
2 3
Sample Output
6
0
思路 : 只有当一个奇数加一个偶数时才满足题目要求. 所以知道该区间中奇数和偶数的个数就可以直接算.

AC Code

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=1e5+5;
int cas=1;
struct math{int odd; //结构体中的变量会自动付初值.int ans;
}s[maxn];int main()
{int t;scanf("%d",&t);while(t--){int n,q;scanf("%d%d",&n,&q);for(int i=1;i<=n;i++){int x;scanf("%d",&x);if(x&1){s[i].odd += s[i-1].odd + 1;   //每一个继承前面那个的奇数和偶数个数.s[i].ans += s[i-1].ans;}else{s[i].ans += s[i-1].ans + 1;s[i].odd += s[i-1].odd;}}while(q--){int l,r;scanf("%d%d",&l,&r);int a = s[r].odd - s[l-1].odd;int b = s[r].ans - s[l-1].ans;printf("%d\n",a*b);}}
}

FZU — 2129(这道题挺重要的!!!)
思维题. 也可以用前缀和思想, 只是有点难理解. 所以这儿就不给这种解法了. 给一种易理解的解法.
思路 :
设ans(k)为k长度的子序列的个数,,a[k]为第k个子序列,那么如果a[k]和前面的数都不相同的情况下,ans(k)]=ans(k-1)*2+1;如果前面的数字出现过的话,那么就要减去最近一次出现a[k]这个数值的地方-1的子序列个数,因为这些算重复的了,而且+1也没有了,因为ans(a[k]上次出现的位置)包括了a[k]单独算一次的情况
AC code

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define mod 1000000007
using namespace std;
const int maxn=1e6+5;
int cas=1;
int ans[maxn],a[maxn];
int vis[maxn];
int main()
{int n;while(~scanf("%d",&n)){memset(ans,0,sizeof(ans));memset(vis,0,sizeof(vis));for(int i=1;i<=n;i++){scanf("%d",&a[i]);}for(int i=1;i<=n;i++){if(vis[a[i]]==0){ans[i] = (ans[i-1]*2+1)%mod;}else{ans[i] = ((ans[i-1]*2 - ans[vis[a[i]]-1])%mod+mod)%mod;  //这样做的目的是为了防止出现负数(我是
//wa试出来的)因为我找不到具体样列会出现负数.所以必须这才能A .}vis[a[i]] = i;}printf("%d\n",ans[n]%mod);}
}

一些用前缀思想解决的题(持续完善)相关推荐

  1. 运用贪心思想解决跳跃游戏

    运用贪心思想解决跳跃游戏 文章目录 运用贪心思想解决跳跃游戏 Jump Game I 1.题目描述 2.分析 3.代码 Jump Game II 1.问题描述 2.分析 3.动规代码[超时] 4.贪心 ...

  2. 普元EOS开发积累第一篇(常见错误解决方法) 持续更新

    普元EOS开发积累第一篇(常见错误解决方法) 持续更新 参考文章: (1)普元EOS开发积累第一篇(常见错误解决方法) 持续更新 (2)https://www.cnblogs.com/tangjing ...

  3. java开发中遇到的问题及解决方法(持续更新)

    java开发中遇到的问题及解决方法(持续更新) 参考文章: (1)java开发中遇到的问题及解决方法(持续更新) (2)https://www.cnblogs.com/LiuYanYGZ/p/6112 ...

  4. Eslint报错整理与解决方法(持续整理)

    Eslint报错整理与解决方法(持续整理) 参考文章: (1)Eslint报错整理与解决方法(持续整理) (2)https://www.cnblogs.com/lunlunshiwo/p/859600 ...

  5. HDU 6579 Operation (前缀线性基模板题)

    Operation 思路 只要套上前缀线性基的板子然后按照题意模拟即可,前缀线性基模板题了. 代码 /*Author : lifehappy */ #pragma GCC optimize(2) #p ...

  6. Python机器学习:SVM008SVM思想解决回归问题

    怎么定义拟合 比如线性,MSE值最小 SVM margin包含样本数量越多越好~ 取中间的直线为结果 引入超参数ε #SVM思想解决回归问题 import numpy as np import mat ...

  7. 利用计算机解决鸡兔同笼问题,利用极限思想解决复杂鸡兔同笼问题

    [导读] 中公事业单位为帮助各位考生顺利通过事业单位招聘考试!今天为大家带来数量关系:利用极限思想解决复杂鸡兔同笼问题. 在近些年的公考中,数量关系题目考察在越来越灵活的基础上出现了传统题型的回归,比 ...

  8. 动态规划算法思想解决找零钱问题

    前言 关于找零钱问题,网上已经有很多相关的资料以及优秀的文章博客等.这里写这篇博客的初衷很简单,就是为了方便自己,回过头来捡起这个知识能快一点,接受起来更易理解点:他人的文章写的再好,毕竟是别人的,学 ...

  9. Java使用动态规划算法思想解决01背包问题

    Java使用动态规划算法思想解决背包问题 背包问题是一种组合优化的NP完全问题.问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高 动 ...

最新文章

  1. zoj 1204 Additive equations
  2. 数据库审计服务器性能要求,数据库审计技术指标资质要求-.docx
  3. keras构建前馈神经网络(feedforward neural network)进行多分类模型训练学习
  4. GoogLeNet(从Inception v1到v4的演进)
  5. 汽车雷达 -- 车载ADAS常用中英文对照
  6. 如何在ubuntu上搭建hustoj?
  7. 音视频技术开发周刊(第120期)
  8. idea资源包下创建资源包_根据谁创建资源授权资源
  9. 【渝粤题库】陕西师范大学200431综合英语(一)作业(高起专、高起本)
  10. python中的非阻塞使用互斥锁
  11. STM32之SPI原理
  12. JavaScript语言精粹--执行环境及作用域,this
  13. linux home目录重装,Linux/centos 卸载重装
  14. Python pickle库
  15. SAP License:SAP All-in-One产品特点
  16. 织梦自定义表单限制IP24小时只能提交一次方法
  17. 2022爱分析·国央企数字化实践报告
  18. bus Hound使用详解
  19. Python - 【珍藏】知识清单及文章链接
  20. RGB三通道图像和灰度值简单理解

热门文章

  1. 支付项目:5、通用型支付系统(1)
  2. [原创]Camtasia Studio 6.0录制视频时鼠标闪烁的解决办法
  3. VR教程来了!谷歌设计师出品的VR设计入门指南
  4. centos7 安装Apache、PHP、MariaDB并修改相关默认端口
  5. UE4 场景展示Demo
  6. 利用vue实现树表格分页
  7. 在VisualStudio中使用EF操作Firebird数据库
  8. 长线、短线在现货黄金中是什么意思的专业术语
  9. 【JAVA基础】重新系统学习Java(五)案例一
  10. 百瑞BARROT BR2262e蓝牙模块的使用