AC日记——奶牛集会 洛谷 P2345

奶牛集会

 

思路:

  把奶牛按照v排序;

  然后,每次都把奶牛放入一个集合s;

  因为奶牛已经排序;

  所以,每次第i次放入奶牛起作用的v就是vi;

  每次ans+=(xi*sum-sumxl)*vi+(sumxr-xi*sum)*vi;

  可以用线段树实现;

 

来,上代码:

复制代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

#define maxn 20005

struct CowType {
    int vi,xi;
};
struct CowType cow[maxn];

struct TreeNodeType {
    int l,r,xx,sum,mid;
};
struct TreeNodeType tree[maxn<<2];

int n;

long long ans,sx,ss;

inline void in(int &now)
{
    char Cget=getchar();now=0;
    while(Cget>'9'||Cget<'0') Cget=getchar();
    while(Cget>='0'&&Cget<='9')
    {
        now=now*10+Cget-'0';
        Cget=getchar();
    }
}

bool cmp(CowType aa,CowType bb)
{
    return aa.vi<bb.vi;
}

void tree_build(int now,int l,int r)
{
    tree[now].l=l,tree[now].r=r;
    if(l==r) return ;
    tree[now].mid=l+r>>1;
    tree_build(now<<1,l,tree[now].mid);
    tree_build(now<<1|1,tree[now].mid+1,r);
}

void tree_add(int now,int to)
{
    if(tree[now].l==tree[now].r)
    {
        tree[now].sum++;
        tree[now].xx+=cow[to].xi;
        return ;
    }
    if(cow[to].xi<=tree[now].mid) tree_add(now<<1,to);
    else tree_add(now<<1|1,to);
    tree[now].xx=tree[now<<1].xx+tree[now<<1|1].xx;
    tree[now].sum=tree[now<<1].sum+tree[now<<1|1].sum;
}

void tree_query(int now,int l,int r)
{
    if(tree[now].l==l&&tree[now].r==r)
    {
        sx+=tree[now].xx,ss+=tree[now].sum;
        return ;
    }
    if(l>tree[now].mid) tree_query(now<<1|1,l,r);
    else if(r<=tree[now].mid) tree_query(now<<1,l,r);
    else
    {
        tree_query(now<<1,l,tree[now].mid);
        tree_query(now<<1|1,tree[now].mid+1,r);
    }
}

int main()
{
    in(n);
    for(int i=1;i<=n;i++) in(cow[i].vi),in(cow[i].xi);
    sort(cow+1,cow+n+1,cmp),tree_build(1,0,20001),tree_add(1,1);
    for(int i=2;i<=n;i++)
    {
        tree_add(1,i);
        sx=0,ss=0,tree_query(1,0,cow[i].xi-1);
        ans+=(ss*cow[i].xi-sx)*cow[i].vi;
        sx=0,ss=0,tree_query(1,cow[i].xi+1,20001);
        ans+=(sx-ss*cow[i].xi)*cow[i].vi;
    }
    cout<<ans;
    return 0;
}
复制代码

 

posted @   IIIIIIIIIU  阅读(207)  评论(0编辑  收藏  举报
编辑推荐:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
阅读排行:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
点击右上角即可分享
微信分享提示