九度 oj 题目1554:区间问题

    xiaoxiao2021-03-25  161

    http://ac.jobdu.com/problem.php?pid=1554

    copy from http://blog.csdn.net/u013491262/article/details/21406351

    把sum[1~i] = sum[i],  sum[i] 是以a[i]为最后一个元素的前缀和,  

    Map以前缀和为key, 具有相同的前缀和的idx的vector 为value。

    查找是以sum[i-1]+k 的key查找, 复杂度为O(logn) 找到后,找第一个比i大的那个idx。 

    #include <cstdio> #include <vector> #include <map> #include <cstring> using namespace std; #define inone(i) scanf("%d",&i) #define rep(i,j,k) for(int i=j;i<=k;i++) #define ms(x,y) memset(x,y,sizeof(x)) const int maxn = 2e6 + 10; map<int, vector<int> > idxs; int c[maxn], n, k, a, flag; int main() { while (inone(n) != EOF) { ms(c, 0); idxs.clear(); rep(i, 1, n) { inone(a); c[i] = c[i - 1] + a; idxs[c[i]].push_back(i); } inone(k); flag = 0; rep(i, 0, n-1) { if (idxs.find(c[i] + k) == idxs.end()) continue; vector<int> vI = idxs[c[i] + k]; rep(j, 0, vI.size()-1) { if (vI[j] >= i + 1) { printf("%d %d\n", i + 1, vI[j]); flag = 1; break; } } if (flag) break; } if(!flag) printf("No\n"); } return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-3056.html

    最新回复(0)