제출 #784109

#제출 시각아이디문제언어결과실행 시간메모리
784109LoboDiversity (CEOI21_diversity)C++17
64 / 100
7050 ms33000 KiB
#include<bits/stdc++.h> using namespace std; const long long inf = (long long) 1e18 + 10; const int inf1 = (int) 1e9 + 10; #define int long long #define dbl long double #define endl '\n' #define sc second #define fr first #define mp make_pair #define pb push_back #define all(x) x.begin(), x.end() const int maxn = 3e5+10; int n, q, a[maxn], ansq[maxn], pre[maxn]; int cost(vector<int> v) { int ans = 0; int sum_all = 0; for(auto x : v) sum_all+= x; int sr = sum_all; int sl = 0; for(int i = 0; i < v.size(); i++) { sr-= v[i]; ans+= sl*sr + v[i]*(sum_all-v[i]) + v[i]*(v[i]+1)/2; sl+= v[i]; } return ans; } vector<pair<int,int>> vtof(vector<int> v) { vector<pair<int,int>> ans; if(v.size() == 0) return ans; ans.pb(mp(v[0],1)); for(int i = 1; i < v.size(); i++) { if(v[i] == v[i-1]) { ans.back().sc++; } else { ans.pb(mp(v[i],1)); } } return ans; } // val, freq int costf(vector<pair<int,int>> v) { int ans = 0; int sum_all = 0; for(auto x : v) sum_all+= x.fr*x.sc; int sr = sum_all; int sl = 0; for(int i = 0; i < v.size(); i++) { int val = v[i].fr; int frq = v[i].sc; sr-= val*frq; ans+= sl*sr*frq + (frq*(frq+1)/2)*val*(sl+sr) + frq*(val*(val+1)/2); if(frq >= 2) { ans+= val*val*(frq-1)*(frq); ans+= val*val*frq*(frq-2)*(frq-1)/2; ans-= pre[frq-2]*val*val; // for(int j = 1; j <= frq-2; j++) { // ans-= val*val*j*(j+1); // } } sl+= val*frq; } return ans; } const int B = 1300; vector<pair<pair<int,int>,int>> bls[maxn]; void solve() { // vector<pair<int,int>> wtf = {{2,3}}; // // vector<pair<int,int>> wtf = {{2,1},{2,1},{2,1}}; // cout << costf(wtf) << endl; // exit(0); cin >> n >> q; vector<int> cc; for(int i = 1; i <= n; i++) { pre[i] = pre[i-1]+i*(i+1); cin >> a[i]; cc.pb(a[i]); } sort(all(cc)); cc.erase(unique(all(cc)),cc.end()); for(int i = 1; i <= n; i++) a[i] = upper_bound(all(cc),a[i])-cc.begin(); for(int i = 1; i <= q; i++) { int l,r; cin >> l >> r; bls[l/B].pb(mp(mp(r,l),i)); } for(int b = 0; b*B <= n; b++) { sort(all(bls[b])); int l = b*B; int r = b*B-1; map<int,int> fq, fq1; for(auto X : bls[b]) { int l1 = X.fr.sc; int r1 = X.fr.fr; while(r < r1) { fq1[fq[a[r+1]]]--; fq[a[r+1]]++; fq1[fq[a[r+1]]]++; r++; } while(l < l1) { fq1[fq[a[l]]]--; fq[a[l]]--; fq1[fq[a[l]]]++; l++; } while(l > l1) { fq1[fq[a[l-1]]]--; fq[a[l-1]]++; fq1[fq[a[l-1]]]++; l--; } vector<pair<int,int>> v1; deque<pair<int,int>> v; for(auto x : fq1) { if(x.fr != 0) v1.pb(x); } sort(all(v1),greater<pair<int,int>>()); int cnt = 0; for(auto x : v1) { int x1 = x.sc/2; int x2 = x.sc-x1; if(x1 != x2) { if(cnt == 0 && x1 > x2) swap(x1,x2); else if(cnt == 1 && x1 < x2) swap(x1,x2); cnt^=1; } v.pb(mp(x.fr,x1)); v.push_front(mp(x.fr,x2)); } vector<pair<int,int>> vv; for(auto x : v) { if(x.sc != 0) vv.pb(x); } // cout << X.sc << " " << l << " " << r << endl; // for(auto x : fq) cout << " " << x.fr << " " << x.sc << endl; // for(auto x : vv) cout << " " << x.fr << " " << x.sc << endl; ansq[X.sc] = costf(vv); // cout << costf(vv) << endl; // vector<int> vvv; // for(auto x : vv) { // for(int i = 0; i < x.sc; i++) { // vvv.pb(x.fr); // } // } // for(auto x : vvv) cout << " " << x << endl; // cout << cost(vvv) << endl; // assert(cost(vvv) == costf(vv)); } } for(int i = 1; i <= q; i++) { cout << ansq[i] << endl; } } int32_t main() { ios::sync_with_stdio(false); cin.tie(0); // freopen("in.in", "r", stdin); // freopen("out.out", "w", stdout); int tt = 1; // cin >> tt; while(tt--) { solve(); } }

컴파일 시 표준 에러 (stderr) 메시지

diversity.cpp: In function 'long long int cost(std::vector<long long int>)':
diversity.cpp:23:22: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   23 |     for(int i = 0; i < v.size(); i++) {
      |                    ~~^~~~~~~~~~
diversity.cpp: In function 'std::vector<std::pair<long long int, long long int> > vtof(std::vector<long long int>)':
diversity.cpp:35:22: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   35 |     for(int i = 1; i < v.size(); i++) {
      |                    ~~^~~~~~~~~~
diversity.cpp: In function 'long long int costf(std::vector<std::pair<long long int, long long int> >)':
diversity.cpp:53:22: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   53 |     for(int i = 0; i < v.size(); i++) {
      |                    ~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...