[刷题codeforces]650A.637A

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[刷题codeforces]650A.637A相关的知识,希望对你有一定的参考价值。

650A
637A

点击查看原题

650A又是一个排序去重的问题,一定要注意数据范围用long long ,而且在写计算组合函数的时候注意也要用long long 虽然10^9没有超过long的范围,但是在计算n*(n-1)/2的过程中超了,所以需要用long long ,否则会出错。

#include<iostream>
#include<cmath>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
using namespace std;

long n;

struct Point {
    long x,y;
};

bool cmpx(const Point &p1,const Point &p2)
{
    if (p1.x!=p2.x) {
        return p1.x<p2.x;
    }
    else {
        return p1.y<p2.y;
    }
}

bool cmpy(const Point &p1,const Point &p2)
{
    if (p1.y!=p2.y) {
        return p1.y<p2.y;
    }
    else {
        return p1.x<p2.x;
    }
}

long long cn2(long long n)
{
    return n*(n-1)/2;
}

Point a[200005];
Point ax[200005];
long axc[200005];
Point ay[200005];
long ayc[200005];
Point axy[200005];
long axyc[200005];

void mysortx(Point *a,Point *ax)
{
    axc[0]=0;
    long p=0;
    while (p<n) {
        long coup=1;
        axc[0]++;
        ax[axc[0]]=a[p];
        while (p+1<n && a[p+1].x==a[p].x) {
            p++;
            coup++;
        }
        axc[axc[0]]=coup;
        p++;
    }
}

void mysorty(Point *a,Point *ay)
{
    ayc[0]=0;
    long p=0;
    while (p<n) {
        long coup=1;
        ayc[0]++;
        ay[ayc[0]]=a[p];
        while (p+1<n && a[p+1].y==a[p].y) {
            p++;
            coup++;
        }
        ayc[ayc[0]]=coup;
        p++;
    }
}

void mysortxy(Point *a,Point *axy)
{
    axyc[0]=0;
    long p=0;
    while (p<n) {
        long coup=1;
        axyc[0]++;
        axy[axyc[0]]=a[p];
        while (p+1<n && a[p+1].x==a[p].x && a[p+1].y==a[p].y) {
            p++;
            coup++;
        }
        axyc[axyc[0]]=coup;
        p++;
    }
}

int main()
{
    
    scanf("%ld",&n);
    for (int i=0;i<n;i++) {
        scanf("%ld %ld",&a[i].x,&a[i].y);
    }
    sort(a,a+n,cmpx);
    mysortx(a,ax);
    /*for (int i=1;i<=axc[0];i++) {
        cout <<ax[i].x <<"," <<ax[i].y <<"|" <<axc[i]<<endl;
    }*/
    sort(a,a+n,cmpy);
    mysorty(a,ay);
    mysortxy(a,axy);
    long long ans=0;
    for (int i=1;i<=axc[0];i++) {
        ans+=cn2(axc[i]);
    }
    for (int i=1;i<=ayc[0];i++) {
        ans+=cn2(ayc[i]);
    }
    for (int i=1;i<=axyc[0];i++) {
        ans-=cn2(axyc[i]);
    }
    printf("%I64d\n",ans);
    return 0;
}

 

 

637A原本是想的双关键字sort,但是后来发现没有那么麻烦,直接把数据存进1000000的数组扫两遍就行了。注意细节,尤其是for循环的起始位置。

 

#include<stdio.h>
#include<stdlib.h>

struct point {
    int o,x,y;
};

struct point a[1000005];

int main()
{
    int n;
    scanf("%d",&n);
    int i;
    for (i=1;i<=1000000;i++) {
        a[i].o=i;
    }
    for (i=1;i<=n;i++) {
        int input;
        scanf("%d",&input);
        (a[input].x)++;
        (a[input].y)=i;
    }
    int maxj=1;
    int maxn=a[1].x;
    for (i=2;i<=1000000;i++) {
        if (a[i].x>maxn) {
            maxn=a[i].x;
            maxj=i;
        }
    }
    int mini=1;
    int minm=100000000;
    for (i=1;i<=1000000;i++) {
        if (a[i].x==maxn && a[i].y<minm) {
            mini=i;
            minm=a[i].y;
        }
    }
    printf("%d\n",a[mini].o);
    return 0;
}

 

以上是关于[刷题codeforces]650A.637A的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces 650C Table Compression (并查集)

codeforces Codeforces 650A Watchmen

Codeforces 刷题记录

CodeForces 650A Watchmen

Leetcode刷题总结:650. 2 Keys Keyboard

Codeforces Round #650 (Div. 3) A. Short Substrings