4 solutions

  • 3
    @ 2022-1-6 16:14:34

    好像没有人发map映射呀,那我来插一脚。其实主要用到桶排的思想,只不过map更加节约时间

    #include<stdio.h>
    #include<map>
    #include<iostream>
    using namespace std;
    const int N = 1e6;
    int n,c,ans = 0;
    int num[N];
    map<int,int>a;
    int main() 
    {
        scanf("%d %d",&n,&c);
        for(int i = 0;i<n;i ++)
        { 
             scanf("%d",&num[i]);
        	a[num[i]]++;
    	}
    	for(int i = 0;i<n;i++)
    	{
    		ans +=a[num[i]+c];
    	}
    	printf("%d",ans);
    	return 0;
    }
    
    • 1
      @ 2022-4-3 6:42:50
      #include <iostream>
      #include <algorithm>
      
      using namespace std;
      // 1 1 2 3 C = 1
      int erfen2(int* arr,long long key,int N) {
      	int l = -1;
      	int r = N;
      	while (l + 1 < r) {
      		int mid = l + ((r - l) >> 1);
      		if (l == -1) {
      			mid = (l + r) >> 1;
      		}
      		if (arr[mid] <= key) {
      			l = mid;
      		}
      		else {
      			r = mid;
      		}
      	}
      	return r;//大于 key 的 第一个值,r - 1 是 key 的右边界
      }
      
      int erfen2B(int* arr, long long key, int N) {
      	int l = -1, r = N;
      	while (l + 1 < r) {
      		int mid = l + ((r - l) >> 1);
      		if (l == -1) {
      			mid = (l + r) >> 1;
      		}
      		
      		if (arr[mid] >= key) {
      			r = mid;
      		}
      		else {
      			l = mid;
      		}
      	}
      	return l;//小于 key 的 第一个值, l + 1 是 key 的 左边界。
      }
      
      
      int main(void) {
      	int N, C;
      	cin >> N >> C;
      
      	int* arr = new int[N + 5];
      
      	for (int i = 0; i < N; ++i) {
      		cin >> arr[i];
      	}
      
      	sort(arr, arr + N);
      
      	int ans = 0;
      	for (int i = 0; i < N; ++i) {
      		long long temp = arr[i] + C;// 我们只要找到这个值就行了。
      
      		ans += erfen2(arr, temp, N) -1 - erfen2B(arr, temp, N);
      
      	}
      		
      	cout << ans << endl;
      
      
      
      	return 0;
      }
      
      • 1
        @ 2022-1-3 21:12:18
        #include<bits/stdc++.h>
        using namespace std;
        const int N=1e7+5;
        int a[N];
        int b[N];
        int n;//以下是两个自己常用版子, 
        int find(int x){ //求右边界,若求大于某个数的第一个位置就在return r+1 
        	int l=0,r=n-1;
        	while(l<=r){
        		int mid=l+r>>1;
        		if(a[mid]>x){
        			r=mid-1;
        		}
        		else{
        			l=mid+1;
        		}
        	}
        	return r;
        }
        int find1(int x){//求小于某个数的第一个位置,同上理若求左边界就只需ruturn l 
        	int l=0,r=n-1;
        	while(l<=r){
        		int mid=l+r>>1;
        		if(a[mid]>=x){
        			r=mid-1;
        		}
        		else{
        			l=mid+1;
        		}
        	}
        	return l-1;
        }
        int main(){
        	int x;
        	cin>>n>>x;
        	for(int i=0;i<n;i++){
        		cin>>a[i];
        	}
        	sort(a,a+n);
        	int num;
        	int ans=0;
        	for(int i=0;i<n;i++){
        		num=a[i]+x;
        		ans+=find(num)-find1(num);
        	}
        	cout<<ans;
        	return 0;
        }
        
        • 1
          @ 2022-1-3 20:22:28

          方法一

          #include<bits/stdc++.h>
          using namespace std;
          typedef long long ll;
          ll n,c,l,r,ans;
          ll a[1000005];//数据有点大
          int main()
          {
          	cin>>n>>c;
          	for(int i=0;i<n;++i)
          	{
          		cin>>a[i];
          	}
          	sort(a,a+n);
          	for(int i=0;i<n;++i)
          	{
          		l=lower_bound(a,a+n,a[i]+c)-a;//不懂的建议百度
          		r=upper_bound(a,a+n,a[i]+c)-a;
          		ans+=r-l;
          	}
          	cout<<ans;
          	return 0;
           } 
          

          方法二 (和做法一思路一样)

          #include<bits/stdc++.h>
          using namespace std;
          typedef long long ll;
          ll n,x,h;
          int a[1000000];
          int find1(int x)//找小于等于a[i]-C的数的函数
          {   
              int l=0,r=n+1,mid;				
              while(l+1<r)			
              {			
                  mid=(l+r)/2;		
                  if(a[mid]<=x)l=mid;		
                  else r=mid;		
              }			
              return l;			
          }
          int find2(int x)
          {
              int l=0,r=n+1,mid;				
              while(l+1<r)			
              {			
                  mid=(l+r)/2;		
                  if(a[mid]<x) l=mid;		
                  else r=mid;		
              }			
              return l;			
          }
          int main()
          {
          	cin>>n>>x;
              for(int i=1; i<=n; i++)
              {
                  cin>>a[i];
              }
              sort(a+1,a+1+n);
              for(int i=1; i<=n; i++)
              {
                  h+=find1(a[i]+x)-find2(a[i]+x);
              }
              cout<<h;
              return 0;
          }
          
          • 1

          Information

          ID
          279
          Time
          1000ms
          Memory
          256MiB
          Difficulty
          8
          Tags
          # Submissions
          291
          Accepted
          55
          Uploaded By