题目1554:区间问题
来源:互联网 发布:由于网络原因上传失败 编辑:程序博客网 时间:2024/06/06 01:13
5星的题啊,想不出来。
转自http://blog.csdn.net/u013491262/article/details/21406351
记录前缀和:sum[i] = x[1] + x[2] + .... + x[i]
查找 x[s] + x[s+1] + ....+ s[e] = k ;
算法:
从小到大 固定 s ,查找 e。
=> 固定s , 在sum[s+1] , sum[s+2] ,....sum[n]内查找sum[最小的e] = k+sum[s-1] 。
做映射: sum[i] -> i 。
注意sum[i]会有重复,这个时候做 整数 -> 链表 的映射。 每次查找logN.
#include <cstdio>#include <cstdlib>#include <vector>#include <map> using namespace std;const int Max_N = 10008 ;int x[Max_N] ;int sum[Max_N] ;int n , k ;map<int , vector<int> > st ; int getint(){ int t=0,flag=1; char c=getchar(); while(c<'0'||c>'9'||c=='-'){ if(c=='-') flag=-1 ; c=getchar(); } while(c>='0'&&c<='9'){ t=t*10+c-'0'; c=getchar(); } return t*flag;} void Ans(){ int start , nowserch ; vector<int> now ; vector<int> ::iterator it ; for(start = 1 ; start <= n ; start++){ nowserch = sum[start-1] + k ; if(st.find(nowserch) == st.end()) continue ; now = st[nowserch] ; for(it = now.begin() ; it < now.end() ; it++){ if((*it) >= start){ printf("%d %d\n" , start , (*it)) ; return ; } } } puts("No") ; return ;} int main(){ int i ; while(scanf("%d" ,&n) != EOF){ st.clear() ; sum[0] = 0 ; for(i = 1 ; i <= n ; i++){ x[i] = getint() ; sum[i] = sum[i-1] + x[i] ; st[sum[i]].push_back(i) ; } scanf("%d" ,&k) ; Ans() ; } return 0 ;}
0 0
- 题目1554:区间问题
- 题目1554:区间问题
- 九度:题目1554:区间问题
- 九度OJ题目1554:区间问题
- 【九度】题目1554:区间问题
- 九度 oj 题目1554:区间问题
- 题目1554:区间问题 map<int , vector<int> >的使用
- 题目1496:数列区间
- 题目:合并区间
- 题目:插入区间
- 题目:区间最小数
- 题目:区间求和 I
- 题目1496:数列区间
- 九度 1554 区间问题
- NYOJ 14 会场安排问题(经典题目,贪心,区间问题)
- 区间问题
- 区间问题
- 区间问题
- Swing动画之敌机工厂
- 《linux命令行大全》读书笔记 第六章 重定向
- iOS开发中不可错过的十大第三方类库
- cocos2d-x环境搭建 window+eclipse+ndk
- UVA - 10057 A mid-summer night's dream.
- 题目1554:区间问题
- 用Python开始机器学习(4:KNN分类算法)
- SharePoint 2013 REST 服务使用简介
- 简单文章发布系统(4)
- Linux命令英文全称
- poj 2243 Knight Moves
- UVA - 10801 Lift Hopping (Dijkstra)
- 容器 第二节 重写equals和hashCode方法
- hibernate之13.hql(二)