[刷题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