XTUOJ1247 Pair-Pair 预处理+暴力

分析:开个1000*1000的数组,预处理矩阵和,然后分类讨论就好

时间复杂度:O(n)

#include <cstdio>
#include <iostream>
#include <ctime>
#include <vector>
#include <cmath>
#include <map>
#include <queue>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long LL;
const int N=1e5+5;
const int INF=0x3f3f3f3f;
const int mod=1e9+7;
struct Node{
  int x,y;
}p[N];
int a[1005][1005];
int high[1005],low[1005],mid[1005];
LL ret[5];
int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m)){
      memset(a,0,sizeof(a));
      memset(ret,0,sizeof(ret));
      memset(high,0,sizeof(high));
      memset(low,0,sizeof(low));
      memset(mid,0,sizeof(mid));
      for(int i=1;i<=n;++i){
         scanf("%d%d",&p[i].x,&p[i].y);
         ++a[p[i].x][p[i].y];
         if(p[i].y>p[i].x)++high[p[i].x];
         else if(p[i].y==p[i].x)++mid[p[i].x];
         else ++low[p[i].x];
      }
      for(int i=1;i<=m;++i){
        low[i]+=low[i-1];
        mid[i]+=mid[i-1];
        high[i]+=high[i-1];
      }
      for(int i=1;i<=m;++i)
        for(int j=1;j<=m;++j)
          a[i][j]+=a[i-1][j]+a[i][j-1]-a[i-1][j-1];
      for(int i=1;i<=n;++i){
        if(p[i].y>p[i].x){
             int tmp=0,t;
             t=high[m]-high[p[i].y];
             tmp+=t;ret[4]+=t;
             t=low[m]-low[p[i].y]+mid[m]-mid[p[i].y];
             tmp+=t;ret[3]+=t;
             t=high[p[i].y]-high[p[i].y-1];
             tmp+=t;ret[3]+=t;
             t=high[p[i].y-1]-high[p[i].x];
             tmp+=t;ret[3]+=t;
             t=a[p[i].x][m]-a[p[i].x][p[i].y];
             tmp+=t;ret[3]+=t;
             ret[2]+=1ll*(n-tmp);
        }
        else if(p[i].x==p[i].y){
          int tmp=0,t;
          t=high[m]-high[p[i].x];
          tmp+=t;ret[3]+=t;
          t=low[p[i].x]+mid[p[i].x];
          tmp+=t;ret[1]+=t;
          ret[2]+=1ll*(n-tmp);
        }
        else {
          int tmp=0,t;
          t=low[p[i].y]+mid[p[i].y];
          tmp+=t;ret[1]+=t;
          t=high[m]-high[p[i].y];
          tmp+=t;ret[3]+=t;
          ret[2]+=1ll*(n-tmp);
        }
      }
      printf("%I64d %I64d %I64d %I64d\n",ret[1],ret[2],ret[3],ret[4]);
    }
    return 0;
}

时间: 2024-11-04 23:29:27

XTUOJ1247 Pair-Pair 预处理+暴力的相关文章

uva10245 - The Closest Pair Problem(暴力+剪枝)

题目:uva10245 - The Closest Pair Problem(暴力+剪枝) 题目大意:给出N个点,求这些点中最小的两点距离. 解题思路:把这些点中两两之间的距离都算出来,这样的复杂度是O(n^2),会超时,所以加了一个减枝. 先将所有的点按照x坐标排序.然后在计算的过程中,如果发现要计算的这两点的X坐标之差的绝对值已经大于等于当前的最小值,那么说明后面的点计算距离一定比这个最小值要大. 这题的正解貌似是分治法,可惜没看懂. 代码: #include <stdio.h> #inc

uva 10245 The Closest Pair Problem (暴力+剪枝)

uva 10245 The Closest Pair Problem 题目大意:给出n个点,求出距离最近的两点间的距离.若点与点间的距离都大于10000,输出INFINITY 解题思路:这题的正统做法是分治,偷懒方法是暴力加剪枝.先按x坐标排序,然后fabs(p[i] - p[j]) > ans的点就可以直接跳过了. #include<stdio.h> #include<string.h> #include<stdlib.h> #include<algori

hdu 5288 (预处理+暴力) OO’s Sequence

题意: 见题面. 思路 预处理出每个a[i]左边和右边第一个能整除它的位置L[i]和R[i],然后计算这个值对于答案的贡献的个数. 贡献就是左右区间长度相乘 参考code: /* #pragma warning (disable: 4786) #pragma comment (linker, "/STACK:0x800000") */ #include <cassert> #include <cctype> #include <cmath> #inc

C++编程-&gt;pair(对组)

pair 是 一种模版类型.每个pair 可以存储两个值.这两种值无限制,可以是tuple,vector ,string,struct等等. 首先来看一下pair的函数 初始化,复制等相关操作如下: default (1) constexpr pair(); copy / move (2) template<class U, class V> pair (const pair<U,V>& pr); template<class U, class V> pair

C++学习之Pair

C++学习之Pair Pair类型概述 pair是一种模板类型,其中包含两个数据值,两个数据的类型可以不同,基本的定义如下: pair<int, string> a; 表示a中有两个类型,第一个元素是int型的,第二个元素是string类型的,如果创建pair的时候没有对其进行初始化,则调用默认构造函数对其初始化. pair<string, string> a("James", "Joy"); 也可以像上面一样在定义的时候直接对其初始化. 由

C++编程-&amp;gt;pair(对组)

pair 是 一种模版类型.每一个pair 能够存储两个值.这两种值无限制,能够是tuple.vector ,string,struct等等. 首先来看一下pair的函数 初始化.复制等相关操作例如以下: default (1) constexpr pair(); copy / move (2) template<class U, class V> pair (const pair<U,V>& pr); template<class U, class V> pa

C++学习STL之关联容器 --- pair、map、set

本博文我们继续讨论标准模板库STL的关联容器: 主要有:pair.map.set. 一:pair pair是一种简单的关联类型,不属于容器范围.而是代表一个 key-value键值对. 创建.初始化.操作 示例代码如下: 1 #include <iostream> 2 #include <string> 3 #include <vector> 4 using namespace std; 5 //将pair放入容器&initpair 6 int main(int

Codeforces 506D Mr. Kitayuta&#39;s Colorful Graph 并查集+水水的分类讨论+水水的离线预处理

首先读入所有的边与询问.将边按颜色分类. 按颜色进行并查集, 若此并查集内的点<= 100,则100*100/2的枚举是否联通. 若此并查集内的点  > 100,则将与这些点相关的所有询问查一遍. 那么时间复杂度为100*100/2*(M/100),或者为M/100*Q. 极限的时候两种方法都在一亿左右了,而且每次还需要在map里搞一搞,还要查询是否联通,不知道为啥没有超时.. #include <algorithm> #include <iostream> #incl

Theme Section HDU - 4763(些许暴力)

题意: 求出最长公共前后缀 不能重叠  而且 这个前后缀 在串的中间也要出现一次 解析: 再明确一次next数组的意思:完全匹配的最长前后缀长度 求一遍next 然后暴力枚举就好了 #include <iostream> #include <cstdio> #include <sstream> #include <cstring> #include <map> #include <cctype> #include <set>