F 求条
  • 板块学术版
  • 楼主majoego
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/4/27 22:10
  • 上次更新2024/4/28 12:55:11
查看原帖
F 求条
1309682
majoego楼主2024/4/27 22:10
// Author: gsczl71
// Copyright (c) 2024 gsczl71 All rights reserved.
// Problem: D - Grid and Magnet
// Contest: AtCoder - AtCoder Beginner Contest 351
// URL: https://atcoder.jp/contests/abc351/tasks/abc351_d
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// Date: 2024-04-27 20:00:21

// #pragma GCC optimize(2,3,"Ofast","inline")
#include<bits/stdc++.h>
#define ll long long
#define i128 __int128
#define ull unsigned long long
#define pii pair<int,int>
#define pll pair<long long, long long>
#define fs first
#define sc second
#define x0 _x0_
#define y1 _y1_
#define endl '\n'
#define re register
#define pb push_back
#define vi vector<int>
#define pq priority_queue
#define mem(a,x) memset((a),(x),sizeof(a))
#define debug puts("AK IOI")
#define sz(s) (int)(s.size())
#define all(a) a.begin(),a.end()
#define rd(l,r) (myrand()%(r-l+1)+l)
#define print(x) {cout<<x<<endl;return;}
#define ctn(e) if(e) continue
#define brk(e) if(e) break
#define rt(e) if(e) return
#define ll_(e) (1ll*(e))
#define For(x,y,z) for(int x = y;x <= z;x++)
#define For_(x,y,z) for(int x = y;x >= z;x--)
#define double long double
#define mkp make_pair
using namespace std;
// #include <atcoder/all>
// using namespace atcoder;
#define int unsigned long long
const int mod = 1e9+7;
//const int mod = 998244353;
mt19937 myrand(time(0));
const int inf = 0x3f3f3f3f,N = 1e6+5,M = 1e6+5,K = 3000+5;
const long long linf = 0x3f3f3f3f3f3f3f3f;
int n;
struct node{
	int x,cx;
}a[N];
int unx[N];
map<int,int> mpx;
struct SegmentTree{
	struct node{long long l,r,sum,lazy;}t[N<<2];
	void build (long long p,long long l,long long r){//建树 
		t[p].l = l,t[p].r = r;
		if(l == r) {return ;}	
		long long mid = (l+r) >> 1;
		build(p * 2,l,mid),build(p * 2 + 1,mid + 1,r);
		t[p].sum = t[p * 2].sum + t[p * 2 + 1].sum;
	}void Add(long long p,long long x){
		t[p].lazy += x,t[p].sum += x * (t[p].r - t[p].l + 1);
	}void pushdown(long long p){
		if(t[p].lazy != 0 && t[p].l != t[p].r)
			Add(p*2,t[p].lazy),Add(p*2+1,t[p].lazy),
			t[p].lazy = 0;
	}void update(long long p,long long l,long long r,long long x){//区间修改
		pushdown(p); if(l <= t[p].l && t[p].r <= r){	Add(p,x); return ;}
		long long mid = (t[p].r + t[p].l) >> 1;
		if(l <= mid) update(p * 2,l,r,x); 
		if(r > mid) update(p * 2 + 1,l,r,x);
		t[p].sum  = t[p * 2].sum + t[p * 2 + 1].sum ;
	}void modify(long long p,long long x,long long v){//单点修改
		if(t[p].l == t[p].r){t[p].sum=v;return;}
		long long mid = (t[p].l + t[p].r )>> 1;
		if(x <= mid) modify(p * 2 ,x ,v);
		else modify(p * 2 + 1,x,v);
		t[p].sum = t[p * 2].sum + t[p * 2 + 1].sum;
	}ll query(long long p,long long l,long long r){//区间查询
		if(l <= t[p].l && t[p].r <= r) return t[p].sum;
		pushdown(p);
		long long mid = (t[p].l + t[p].r) >> 1;
		ll ans = 0;
		if(mid>=l) ans += query(p * 2,l,r);
		if(mid<r) ans+= query(p * 2+1,l,r);
		return ans;
	}
}segx,segxx;
void solve(){
	
	cin >> n;
	For(i,1,n) {
		cin >> a[i].x;
		unx[i]=a[i].x;
	}
	sort(unx+1,unx+1+n);
	unx[0] = unique(unx+1,unx+1+n)-unx-1;
	For(i,1,unx[0])mpx[unx[i]]=i;
	For(i,1,n){
		a[i].cx = mpx[a[i].x];
	}
	segx.build(1,1,unx[0]);
	segxx.build(1,1,unx[0]);
	// For(i,1,n) cout<<a[i].x<<" "<<a[i].cx<<endl;
	int ans=0;
	For(i,1,n){
		ans += (a[i].x * segxx.query(1,1,a[i].cx)) - (segx.query(1,1,a[i].cx));
		segx.modify(1,a[i].cx,a[i].x);
		segxx.modify(1,a[i].cx,1);
	}cout<<ans<<endl;
}
signed main(){
	ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
	int T=1;
//	cin >> T;
	For(_,1,T) solve();
	return 0;
}
2024/4/27 22:10
加载中...