zoukankan      html  css  js  c++  java
  • poj-3067(树状数组)

    题目链接:传送门

    题意:日本有东城m个城市,西城m个城市,东城与西城相互连线架桥,判断这些桥相交的次数。

    思路:两个直线相交就是(x1-x2)*(y1-y2)<0,所以,对x,y进行排序,按照x从小到大进行排序,x相同,按照y从小到大排序

    然后x已经有序,判断y的逆序数。从大到小判断,因为如果从小到大(3,1)与(3,2)就算相交,从大到小可以避免这种情况。

    注意:

    (1)数组要开大一点;

    (2)ans要用longlong类型,结果会很大。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int maxn = 1200;
    int c[maxn],m,n;
    struct Node{
        int x,y;
    }cur[maxn*maxn];
    bool cmp(Node a,Node b)
    {
        if(a.x==b.x) return a.y<=b.y;
        else return a.x<b.x;
    }
    int lowbit(int x)
    {
        return x&(-x);
    }
    void update(int x,int Item)
    {
        while(x<=m)
        {
            c[x]+=Item;
            x+=lowbit(x);
        }
    }
    int query(int x)
    {
        int sum=0;
        while(x>0)
        {
            sum+=c[x];
            x-=lowbit(x);
        }
        return sum;
    }
    int main(void)
    {
        int i,j,T,k,x,y;
        scanf("%d",&T);
        for(i=1;i<=T;i++)
        {
            memset(c,0,sizeof(c));
            scanf("%d%d%d",&n,&m,&k);
            for(j=1;j<=k;j++) scanf("%d%d",&cur[j].x,&cur[j].y);
            sort(cur+1,cur+k+1,cmp);
            long long ans=0;
            for(j=1;j<=k;j++)
            {
                update(cur[j].y,1);
                ans+=(query(m)-query(cur[j].y));
            }
            printf("Test case %d: %lld
    ",i,ans);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    C++结构体内重载、this指针和友元函数(初步了解)
    数据结构—造树计划—二叉搜索树
    PTA顺序的分数
    PTA兼容任务
    PTA航船
    UML-基于GRASP对象设计步骤
    UML-设计对象时涉及的制品有哪些?
    UML-什么是用例实现(场景实现)?
    UML-如何使用GRASP进行对象设计?
    日志总结
  • 原文地址:https://www.cnblogs.com/2018zxy/p/10187582.html
Copyright © 2011-2022 走看看