csp 202006-2 稀疏向量(雙指標)
阿新 • • 發佈:2022-03-18
目錄
題目描述
掃描
分析
首先看資料範圍,肯定不能兩個向量都讀進來然後兩重迴圈遍歷,遇到id相等的就乘
可以用雙指標的思想,先把第一個向量存起來,然後用一個指標指著第一個向量當前的座標,然後讀取第二個向量的時候移動第一個向量的指標,從而遇到id相同的就將val乘起來。
需要注意的是,第一個指標要判斷有沒有出邊界
while (k < h.size() && h[k].id < bid) k++; // 下面就是大於等於 // 不要忘記了 k < h.size() if(k == h.size()) break; // a用完了
程式碼
#include<iostream> #include<cstdio> #include<vector> using namespace std; typedef long long LL; struct VER { LL id; LL val; }; vector<VER> h; LL n, a, b; int main() { scanf("%lld%lld%lld", &n, &a, &b); for(int i = 0; i < a; i++) { VER p; scanf("%lld%lld", &p.id, &p.val); h.push_back(p); } LL res = 0; LL k = 0; for(int i = 0; i < b; i++) { LL bid, bval; scanf("%lld%lld", &bid, &bval); while (k < h.size() && h[k].id < bid) k++; // 下面就是大於等於 // 不要忘記了 k < h.size() if(k == h.size()) break; // a用完了 if(h[k].id == bid) { res += (LL) h[k].val * bval; k++; } } printf("%lld\n", res); return 0; }