• luogu P2345 奶牛集会 |排序+树状数组


    题目描述

    约翰的N 头奶牛每年都会参加“哞哞大会”。哞哞大会是奶牛界的盛事。集会上的活动很多,比如堆干草,跨栅栏,摸牛仔的屁股等等。它们参加活动时会聚在一起,第i 头奶牛的坐标为Xi,没有两头奶牛的坐标是相同的。奶牛们的叫声很大,第i 头和第j 头奶牛交流,会发出max{Vi; Vj}×|Xi − Xj | 的音量,其中Vi 和Vj 分别是第i 头和第j 头奶牛的听力。

    假设每对奶牛之间同时都在说话,请计算所有奶牛产生的音量之和是多少。

    输入格式

    • 第一行:单个整数N,1 ≤ N ≤ 20000

    • 第二行到第N + 1 行:第i + 1 行有两个整数Vi 和Xi,1 ≤ Vi ≤ 20000; 1 ≤ Xi ≤ 20000

    输出格式

    • 单个整数:表示所有奶牛产生的音量之和


    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #define ll long long
    using namespace std;
    const int N=2e4+1;
    struct E{
    	int v,x;
    }e[N];
    int n;
    bool cmp(E t1,E t2){
    	return t1.v<t2.v;
    }
    ll c1[N],c2[N];
    void add1(int x,int y)
    {
    	for(;x<=N;x+=x&(-x))
    	c1[x]+=y;
    }
    ll num1(int x)
    {
    	int ans=0;
    	for(;x;x-=x&(-x))ans+=c1[x];
    	return ans;
    }
    void add2(int x,int y)
    {
    	for(;x<=N;x+=x&(-x))
    	c2[x]+=y;
    }
    ll num2(int x)
    {
    	int ans=0;
    	for(;x;x-=x&(-x))ans+=c2[x];
    	return ans;
    }
    int main()
    {
    	cin>>n;
    	for(int i=1;i<=n;i++)
    	scanf("%d%d",&e[i].v,&e[i].x);
    	sort(e+1,e+1+n,cmp);
    	ll ans=0;
    	for(int i=1;i<=n;i++)
    	{
    		ll p1=num1(e[i].x),p2=num2(e[i].x);
    		ans+=e[i].v*abs(e[i].x*p1-p2);
    		p1=num1(N)-p1;p2=num2(N)-p2;
    		ans+=e[i].v*abs(e[i].x*p1-p2);
    		add1(e[i].x,1);
    		add2(e[i].x,e[i].x);
    	}
    	cout<<ans<<endl;
    }
    
  • 相关阅读:
    Oracle面试题及答案整理
    Oracle问题总结
    Dubbo(四) -- telnet命令
    Dubbo(三) -- 多协议支持与多注册中心
    每天一算法 -- (冒泡排序)
    Dubbo(二) -- Simple Monitor
    数据库优化
    ActiveMQ内存配置和密码设置
    Dubbo源码导入Eclipse遇到的问题
    Dubbo(一) -- 初体验
  • 原文地址:https://www.cnblogs.com/naruto-mzx/p/11854695.html
Copyright © 2020-2023  润新知