zoukankan      html  css  js  c++  java
  • 楼兰图腾(权值线段树)

    在完成了分配任务之后,西部314来到了楼兰古城的西部。

    相传很久以前这片土地上(比楼兰古城还早)生活着两个部落,一个部落崇拜尖刀(‘V’),一个部落崇拜铁锹(‘∧’),他们分别用V和∧的形状来代表各自部落的图腾。

    西部314在楼兰古城的下面发现了一幅巨大的壁画,壁画上被标记出了N个点,经测量发现这N个点的水平位置和竖直位置是两两不同的。

    西部314认为这幅壁画所包含的信息与这N个点的相对位置有关,因此不妨设坐标分别为(1,y1),(2,y2),,(n,yn)(1,y1),(2,y2),…,(n,yn),其中y1y1~ynyn是1到n的一个排列。

    西部314打算研究这幅壁画中包含着多少个图腾。

    如果三个点(i,yi),(j,yj),(k,yk)(i,yi),(j,yj),(k,yk)满足1i<j<knyi>yj,yj<yk1≤i<j<k≤n且yi>yj,yj<yk,则称这三个点构成V图腾;

    如果三个点(i,yi),(j,yj),(k,yk)(i,yi),(j,yj),(k,yk)满足1i<j<knyi<yj,yj>yk1≤i<j<k≤n且yi<yj,yj>yk,则称这三个点构成∧图腾;

    西部314想知道,这n个点中两个部落图腾的数目。

    因此,你需要编写一个程序来求出V的个数和∧的个数。

    输入格式

    第一行一个数n。

    第二行是n个数,分别代表y1y2,,yny1,y2,…,yn。

    输出格式

    两个数,中间用空格隔开,依次为V的个数和∧的个数。

    数据范围

    对于所有数据,n200000n≤200000,且输出答案不会超过int64。

    输入样例:

    5
    1 5 3 2 4
    

    输出样例:

    3 4
    不明白为什么不需要离散化
    代码:
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    #include<stack>
    #include<set>
    #include<map>
    #include<vector>
    #include<cmath>

    const int maxn=2e5+5;
    typedef long long ll;
    using namespace std;
    struct node
    {
    int l,r;
    int num;
    }tree[maxn<<2];
    vector<int>v;
    int a[maxn];

    void pushup(int m)
    {
    tree[m].num=(tree[m<<1].num+tree[m<<1|1].num);
    }

    void build(int m,int l,int r)
    {
    tree[m].l=l;
    tree[m].r=r;
    tree[m].num=0;
    if(l==r)
    {
    return ;
    }
    int mid=(tree[m].l+tree[m].r)>>1;
    build(m<<1,l,mid);
    build(m<<1|1,mid+1,r);
     
    }
    void update(int m,int pos,int val)
    {
    if(tree[m].l==tree[m].r)
    {
    tree[m].num+=val;
    return;
    }
    int mid=(tree[m].l+tree[m].r)>>1;
    if(pos<=mid)
    {
    update(m<<1,pos,val);
    }
    else
    {
    update(m<<1|1,pos,val);
    }
    pushup(m);
    }
    int query(int m,int l,int r)
    {
    if(tree[m].l==l&&tree[m].r==r)
    {
    return tree[m].num;
    }
    int mid=(tree[m].l+tree[m].r)>>1;
    if(r<=mid)
    {
    return query(m<<1,l,r);
    }
    else if(l>mid)
    {
    return query(m<<1|1,l,r);
    }
    else
    {
    return query(m<<1,l,mid)+query(m<<1|1,mid+1,r);
    }
     
    }
    ll minl[maxn],minr[maxn],maxl[maxn],maxr[maxn];
    int main()
    {

    int n;
    cin>>n;
    for(int t=1;t<=n;t++)
    {
    scanf("%d",&a[t]);
    }
    build(1,0,n+1);
    for(int t=1;t<=n;t++)
    {
    minl[t]=query(1,0,a[t]-1);
    maxl[t]=query(1,a[t]+1,n+1);
    update(1,a[t],1);
    }
    build(1,0,n+1);
    for(int t=n;t>=1;t--)
    {
    minr[t]=query(1,0,a[t]-1);
    maxr[t]=query(1,a[t]+1,n+1);
    update(1,a[t],1);
    }
    ll ans1=0,ans2=0;
    for(int t=1;t<=n;t++)
    {
    ans1+=maxl[t]*maxr[t];
    ans2+=minl[t]*minr[t];
    }
    printf("%lld %lld ",ans1,ans2);

    system("pause");
    return 0;
     
    }
  • 相关阅读:
    SharePoint 2013 APP 开发示例 (六)服务端跨域访问 Web Service (REST API)
    麦咖啡导致电脑不能上网
    SharePoint 2013 Central Admin 不能打开
    SharePoint 2013 APP 开发示例 (五)跨域访问 Web Service (REST API)
    SharePoint 2013 APP 开发示例 系列
    synthesize(合成) keyword in IOS
    Git Cmd
    简单的正则匹配
    Dropbox
    SQL Server Replication
  • 原文地址:https://www.cnblogs.com/Staceyacm/p/11333463.html
Copyright © 2011-2022 走看看