给定直线的形式是在这条直线上的两个点的坐标
当直线斜率只有1种时,答案是1

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<map>
#define ll long long 
using namespace std;
int T,n; 
ll a,b,c,d;
inline ll read(){
    ll s=0,w=1;char ch=getchar();
    while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
    return s*w; 
}
double k[4],kk;
int main() 
{
//  freopen("3.in","r",stdin);
//  freopen("3.o)
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        k[1]=0,k[2]=0,k[3]=0;
        int res=0;
        for(int i=1;i<=n;i++){
//          scanf("%lld%lld%lld%lld",&a,&b,&c,&d);
            a=read();b=read();c=read();d=read();
            if(a==c) kk=192608017.794951;
            else kk=(double) (b-d)/(a-c);
            if(res==0) k[++res]=kk;
            else if(res==1){
                if(k[1]!=kk) k[++res]=kk;
            } 
            else if(res==2){
                if(kk!=k[1]&&kk!=k[2]){res=3;}
            }       
            else if(res==3) continue;
        }
        if(res==1||n==1||n==0) printf("0\n");
        else if(res==2&&n>2) printf("2\n");
        else if(res==3) printf("3\n");
        else if(res==2&&n==2)printf("1\n"); 
    }
    return 0;
}#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<map>
#define N 100005
#define ll long long 
using namespace std;
int n,m;
ll T,s,tim,res;
struct node{
    int id;
    ll p,t;
}d[N];
bool cmp(node a,node b){
    return a.p *b.t >b.p *a.t ;
}
bool cmp1(node a,node b){
    return a.id <b.id;
}
int main()
{
    scanf("%d%d%lld",&n,&m,&T);
    for(int i=1;i<=n;i++) d[i].id =i,scanf("%lld%lld",&d[i].p,&d[i].t);
    sort(d+1,d+n+1,cmp);
    for(int i=1;i<=n;i++) s+=d[i].p ,tim+=d[i].t ,res+=tim*d[i].p ;
    printf("%lld\n",s*T-res);
    while(m--){
        int x;
        ll a,b;
        s=0,tim=0,res=0;
        scanf("%d%lld%lld",&x,&a,&b);
        for(int i=1;i<=n;i++) if(d[i].id==x) {d[i].p=a,d[i].t =b;break;}  
//      sort(d+1,d+n+1,cmp1);
//      d[x].p =a,d[x].t =b;
        sort(d+1,d+n+1,cmp);
        for(int i=1;i<=n;i++) s+=d[i].p ,tim+=d[i].t ,res+=tim*d[i].p ;
        printf("%lld\n",s*T-res);
    }
    return 0;
}原文:https://www.cnblogs.com/Vimin/p/11645148.html