# pragma G++ optimize "O3"//一号加速 #include<cstdio> #include<cctype> #include<algorithm> #define MAXN 20000 using namespace std; struct Cow{ int v,x; inline bool operator < (Cow tar){//强制内联 return v<tar.v; } }cow[MAXN+1]; inline char get_char(){//超级快读 static char buf[1000001],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++; } inline int read(){ int num=0; char c; while(isspace(c=get_char())); while(num=num*10+c-48,isdigit(c=get_char())); return num; } inline int Abs(int a){//绝对值优化 int b=a>>31; return (a+b)^b; } int main(){//尽量使用局部变量 int n=read(); long long ans=0; for(int i=1;i<=n;++i) cow[i].v=read(),cow[i].x=read(); sort(cow+1,cow+n+1);//先排序,然后就可以省去求max for(int i=1;i<=n;++i) for(int j=1;j<i;++j)//n^2的复杂度 ans+=cow[i].v*Abs(cow[i].x-cow[j].x); printf("%lld",ans);//long long 速度比 int 慢 return 0; }
以上方法是枚举,朴素O(N2),在本题的数据规模下可以在规定时间限制内解决,如果奶牛数目不是20000,而是200000,怎么办?试一试下面两种方法:
类似于归并排序的二分O(N logN)
树状数组O(N logN)