LuoguP3948 資料結構
阿新 • • 發佈:2018-12-20
題目地址
題解
以為這題雖然是資料隨機也不至於那麼水吧...
於是秉著先打部分分和暴力的原則先寫了暴力和min,max為-inf和inf的特殊點,對於暴力搞了個小優化,延後的操作直接字首和答案就好...
然後感覺資料隨機的話能過\(n<=5000\)
交了發現跑的飛快,有了一點奇奇怪怪的想法,直接交暴力試試?
然後就過了。7000+ms...
效率是\(O(opt*n+final)\)的,因為資料隨機所以其實也不用卡就能過去了...
我以為他的隨機至少有部分構造資料來著...
然後看了官方題解居然也只是對暴力操作差分優化了一下...這個的效率也不對的其實...如果資料出到上界是過不去的...
(當時有想到這個但是算了效率是不對的於是cut掉了這個想法。還以為這題正解多高明233333)
#include <bits/stdc++.h> using namespace std; #define ll long long #define inf 0x3f3f3f3f #define N 200010 int n, opt, mod, Min, Max, fin; ll a[N], sum[N]; namespace pts_1 { void solve() { int l, r, x; for(int i = 1; i <= opt; i ++) { char ch[10]; scanf("%s%d%d", ch, &l, &r); if(ch[0] == 'A') {scanf("%d", &x); continue;} printf("%d\n", r - l + 1); } scanf("%d", &fin); for(int i = 1; i <= fin; i ++) { scanf("%d%d", &l, &r); printf("%d\n", r - l + 1); } } } namespace pts_2 { void solve() { int l, r, x; for(int i = 1; i <= opt; i ++) { char ch[10]; scanf("%s%d%d", ch, &l, &r); if(ch[0] == 'A') { scanf("%d", &x); for(int i = l; i <= r; i ++) a[i] += x; } else { ll ans = 0; for(int i = l; i <= r; i ++) { ans += a[i] * i % mod >= Min && a[i] * i % mod <= Max; } printf("%lld\n", ans); } } for(int i = 1; i <= n; i ++) { sum[i] = sum[i - 1] + (a[i] * i % mod >= Min && a[i] * i % mod <= Max); } scanf("%d", &fin); while(fin--) { scanf("%d%d", &l, &r); printf("%lld\n", sum[r] - sum[l - 1]); } } } int main() { scanf("%d%d%d%d%d", &n, &opt, &mod, &Min, &Max); if(Min <= -inf && Max >= inf) {pts_1::solve(); return 0;} else { if(n <= 5000) {pts_2::solve(); return 0;} pts_2::solve(); return 0; } }