poj2785题解
2016-05-21 17:12
357 查看
二分经典题,注意边界,否则wa到。。。。
由于4个for必定wa,所以分别对a和b,c和d求和,然后对其中一个进行排序,二分查找
由于4个for必定wa,所以分别对a和b,c和d求和,然后对其中一个进行排序,二分查找
#include <stdio.h> #include <stdlib.h> #include <string.h> int ab[4010*4010],cd[4010*4010]; int N; int mycmp(const void *a,const void *b) { return *((int *)a)-*((int *)b); } int main(int argc, char const *argv[]) { int a[4010],b[4010],c[4010],d[4010],pos1,cnt,pos2,i,j,r,l,mid; while(scanf("%d",&N)!=EOF) { cnt=0; memset(ab,0,4010*4010*sizeof(int)); memset(cd,0,4010*4010*sizeof(int)); for(i=0;i<N;i++) scanf("%d %d %d %d",a+i,b+i,c+i,d+i); for(i=0;i<N;i++) for(j=0;j<N;j++) { ab[i*N+j]=a[i]+b[j]; cd[i*N+j]=c[i]+d[j]; } qsort(cd,N*N,sizeof(int),mycmp); for(i=0;i<N*N;i++) { pos1=-1;pos2=-2;l=0;r=N*N; if(-ab[i]==cd[N*N-1]) pos2=N*N-1; else while(l<r) { mid=l+((r-l)>>1); if(-ab[i]>cd[mid]||(-ab[i]==cd[mid]&&-ab[i]==cd[mid+1])) l=mid+1; else if(-ab[i]<cd[mid]) r=mid; else{ pos2=mid;break; } } l=0;r=N*N; if(-ab[i]==cd[0]) pos1=0; else while(l<r) { mid=l+((r-l)>>1); if(-ab[i]>cd[mid]) l=mid+1; else if(-ab[i]<cd[mid]||(-ab[i]==cd[mid]&&-ab[i]==cd[mid-1])) r=mid; else{ pos1=mid;break; } } cnt+=pos2-pos1+1; } printf("%d\n",cnt ); } return 0; }
相关文章推荐
- SAX - Hello World
- ViewHolder重用机制 RecyclerView+CardView 优化
- Spring-bean作用域scope详解
- (创建型模式)PROTOTYPE——原型模式
- hdu_5695_Gym Class(拓扑排序)
- Hive连接MongoDB
- 2016"百度之星" - 初赛(Astar Round2A) 1001 All X(数论知识)
- android反编译工具Apktool安装与使用
- hdu_5695_Gym Class(拓扑排序)
- C# split字符串
- (创建型模式)FACTORY METHOD——工厂方法模式
- 给 Android 开发者的 RxJava 详解
- TreeSet的排序两种实现方式Comparator和Comparable
- Win7上帝模式
- CMake与Make最简单直接的理解
- android模拟器无法使用camera拍照
- UVa 213 - Message Decoding
- 单例模式—java实现
- (结构型模式)PROXY——代理模式
- Android SDK 在线更新镜像服务器资源