题目:水池
代码(一个数组标记或两个数组索引的暴力做法)
主要是连通,计算的过程可以不用弄出来,每次需要再计算就行。
连通也可以用一个数组来标记vis[i] = l。 每次全部连通到 l 上,输出时,左右扩大就行。
#include<bits/stdc++.h>
using namespace std;const int N = 1e4+10;
int V[N];
int ll[N], rr[N];int main() {int n;cin >> n;for(int i = 1; i <= n; i ++) {cin >> V[i]; }int q;cin >> q;while(q --) {int op;cin >> op;if(op == 1) {int l, r;cin >> l >> r;rr[l] = l+1, ll[r] = r-1;for(int i = l+1; i < r; i ++) {rr[i] = i+1; ll[i] = i-1;}}else {int k;cin >> k;long long fz=0, fm=1;long long l = k, r = k;while(ll[l]) --l;while(rr[r]) ++r;for(int i = l; i <= r; i ++) {fz += V[i];}fm *= r-l+1;long long gys = __gcd(fz,fm);fz /= gys; fm /= gys;if(fm==1) cout << fz << endl;else cout << fz << "/" << fm << endl;}}return 0;
}
代码2(并查集 或 区间和并)
不更新先,先记录个暴力,用并查集也很简单。
牛客原题:
E-小苯的蓄水池(hard)_牛客周赛 Round 66