結果
問題 | No.1649 Manhattan Square |
ユーザー |
![]() |
提出日時 | 2021-08-13 22:11:13 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 610 ms / 3,000 ms |
コード長 | 2,366 bytes |
コンパイル時間 | 3,962 ms |
コンパイル使用メモリ | 189,784 KB |
最終ジャッジ日時 | 2025-01-23 19:38:14 |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 43 |
ソースコード
#include <cstdio>#include <cstring>#include <iostream>#include <string>#include <cmath>#include <bitset>#include <vector>#include <map>#include <set>#include <queue>#include <deque>#include <algorithm>#include <complex>#include <unordered_map>#include <unordered_set>#include <random>#include <cassert>#include <fstream>#include <utility>#include <functional>#include <time.h>#include <stack>#include <array>#include <list>#include <atcoder/all>#define popcount __builtin_popcountusing namespace std;using namespace atcoder;typedef long long ll;typedef pair<int, int> P;template<typename T>struct BIT{vector<T> bit;int size;BIT(int n):size(n), bit(n+1, 0){}T sum(int i){ //[0, i)T s=0;while(i>0){s+=bit[i];i-=(i&(-i));}return s;}T sum(int l, int r){ //[l, r)return sum(r)-sum(l);}void add(int i, T x){i++;while(i<=size){bit[i]+=x;i+=(i&(-i));}}};using mint=modint998244353;int n;int x[200020], y[200020];int main(){cin>>n;vector<int> ind(n);for(int i=0; i<n; i++){cin>>x[i]>>y[i];ind[i]=i;}mint sx2=0, sx=0, sy2=0, sy=0;for(int i=0; i<n; i++){sx+=mint(x[i]);sx2+=mint(x[i])*mint(x[i]);sy+=mint(y[i]);sy2+=mint(y[i])*mint(y[i]);}mint ans=sx2*n-sx*sx+sy2*n-sy*sy;vector<int> vy(n);for(int i=0; i<n; i++){vy[i]=y[i];}sort(ind.begin(), ind.end(), [&](int i,int j){ return x[i]<x[j];});sort(vy.begin(), vy.end());vy.erase(unique(vy.begin(), vy.end()), vy.end());int m=vy.size();BIT<mint> bit(m), bitx(m), bity(m), bitxy(m);mint ans1=0;mint c0=0, sx0=0, sy0=0, sxy=0;for(auto i:ind){int t=lower_bound(vy.begin(), vy.end(), y[i])-vy.begin();ans1+=mint(x[i])*mint(y[i])*(2*bit.sum(t)-c0);ans1-=mint(y[i])*(2*bitx.sum(t)-sx0);ans1-=mint(x[i])*(2*bity.sum(t)-sy0);ans1+=(2*bitxy.sum(t)-sxy);bit.add(t, 1);bitx.add(t, x[i]);bity.add(t, y[i]);bitxy.add(t, mint(x[i])*mint(y[i]));c0++;sx0+=x[i];sy0+=y[i];sxy+=mint(x[i])*mint(y[i]);}ans+=2*ans1;cout<<ans.val()<<endl;return 0;}