C语言一菜鸟级


私信TA

用户名:LHL

访问量:66231

签 名:

AC总是意料之外 ^_^

等  级
排  名 53
经  验 11536
参赛次数 5
文章发表 56
年  龄 24
在职情况 在职
学  校 四川工商学院
专  业 通信工程

  自我简介:

C语言 蓝桥杯 ACM 新人 欢迎大佬 前来指导 交流 本人 博客https://fivecc.blog.csdn.net/


题意: 标题:递增三元组

  原文         欢迎访问我的博客

给定三个整数数组 

A = [A1, A2, … AN], 

B = [B1, B2, … BN], 

C = [C1, C2, … CN], 

请你统计有多少个三元组(i, j, k) 满足: 

1. 1 <= i, j, k <= N 

2. Ai < Bj < Ck


【输入格式】 

第一行包含一个整数N。 

第二行包含N个整数A1, A2, … AN。 

第三行包含N个整数B1, B2, … BN。 

第四行包含N个整数C1, C2, … CN。


对于30%的数据,1 <= N <= 100 

对于60%的数据,1 <= N <= 1000 

对于100%的数据,1 <= N <= 100000 0 <= Ai, Bi, Ci <= 100000


【输出格式】 

一个整数表示答案


【样例输入】 

1 1 1 

2 2 2 

3 3 3


【样例输出】 

27


资源约定: 

峰值内存消耗(含虚拟机) < 256M 

CPU消耗 < 1000ms

思路: 先对 a[] 与 c[] 快排一波 用an[] ,cn[]分别统计 a[]中 某元素 前(包含本身及其小于这数)的数的个数 和从c[]中某元素 后(包含本身及其大于这个数)的数的个数 在枚举 b[i]      b[i]=an[d]*cn[d1]  (d<b[i]<d1)

复杂度 大概为 2*n*lg(n)+n

#include<stdio.h>
#include <string.h>
#define N 100004
long int n,anmin=0,cnmax=0,tn=0;
long int an[N],cn[N];
void swp(long int *t,long int x,long int y)
   {   long int tem=t[x];
      t[x]=t[y];
      t[y]=tem;
   }
long int  qp(long int t[N],long int r,long int l){
    
    long int x=t[r];
    long int i=r;
    long int j=l+1;
    while(1)
    {
        while(t[++i]<x&&i<l);
        while(t[--j]>x);
        if(i<j)swp(t,i,j);
        else break;
    }
    swp(t,r,j);
  return j;
}
void ppp(long int *t,long int r,long int l){
   long int m;
        if(r<l)
        {  m=qp(t,r,l);
         ppp(t,r,m-1);
         ppp(t,m+1,l);
        }
}
int main()
{long int i,j,sum=0;
long int a[N],b[N],c[N];
memset(an,0,sizeof(an));
memset(cn,0,sizeof(cn));
scanf("%ld",&n);
    for(i=1;i<=n;i++)
    { scanf("%ld",&a[i]);
     if(anmin>a[i]||i==1)anmin=a[i];
    }
     
    for(i=1;i<=n;i++)
    scanf("%ld",&b[i]);
    for(i=1;i<=n;i++){ 
           scanf("%ld",&c[i]);
         if(cnmax<c[i])cnmax=c[i];
      }
    ppp(a,1,n);
    ppp(c,1,n);
        for(i=1;i<=n;i++)
        {
            if(an[a[i]])an[a[i]]++;//相同 就加一即可
            else an[a[i]]=i;//通过排序后的位置得出 此数前面大的个数
            j=n-i+1;
           if(cn[c[j]])cn[c[j]]++;
           else cn[c[j]]=n+1-j;//通过排序后的位置得出 此数后面大的个数
        }
        for(i=1;i<=n;i++){   
              long int d=b[i]-1;
           long int d1=b[i]+1;
              while(an[d]==0&&d>=anmin)d--;
              while(cn[d1]==0&&d1<=cnmax)d1++;
              sum+=an[d]*cn[d1];
        }
        printf("%ld\n",sum);
        return 0;
}


 

0.0分

1 人评分

  评论区

#include <stdio.h>
int main() {
	int n;
	scanf("%d",&n);
	int array[3][n];
	for(int i=0;i<3;i++){
		for(int j=0;j<n;j++){
			scanf("%d",&array[i][j]);
		}
	}
	int count=0,I,J,K;
	for(int i=0;i<n;i++){
		I=array[0][i];
		for(int j=0;j<n;j++){
			J=array[1][j];
			for(int k=0;k<n;k++){								
				K=array[2][k];
				if(I<J&&J<K){
					count++;
				}
			}
		}
	}
	printf("%d",count);
	return 0;
}
2018-12-19 13:28:14
  • «
  • 1
  • »