zoukankan      html  css  js  c++  java
  • Comet OJ 三元组 推导+两个指针+分类讨论

    题目:https://www.cometoj.com/contest/59/problem/F?problem_id=2681

    题意:给你n个三元组 ai,bi,ci,如果某一对三元组满足    2*min(ai+aj,bi+bj) <= max(ai+aj,bi+bj),那么贡献+ci*cj

    思路:我们可以看的出这个式子其实就是说这个的最大值要是最小值的两倍,但是我们不确定哪个大

    我们就先假设

    2*(ai+aj)<=  bi+bj

    移项得

    (2*ai-bi)+(2*aj-bj)<=0

    那么我们按2*ai-bi排序

    我们可以得出一个结论,如果当我们得i与j匹配时,i必定和[i+1,j]都匹配,那么我们这里就可以记录一个前缀和,那么i+1 也必定  是在[i+1,j]这个范围内找到匹配,

    所以我们可以用两个指针进行查找,这是  ai+aj<=bi+bj的情况,>的时候我们只要把ai与bi交换一下就可以了

     

    #include<bits/stdc++.h>
    #define maxn 100005
    #define mod 1000000007
    using namespace std;
    typedef long long ll;
    struct sss
    {
        ll a,b,c;
    }q[maxn];
    ll num[maxn];
    int n;
    int cmp(struct sss x,struct sss y)
    {
        return (2*x.a-x.b)<(2*y.a-y.b);
    }
    ll solve(){
        sort(q,q+n,cmp);
        ll sum=0;
        int l=0,r=n-1;
        num[0]=q[0].c;
        for(int i=1;i<n;i++) num[i]=num[i-1]+q[i].c;
        while(r>=0){
            ll t1=2*q[l].a-q[l].b;
            ll t2=2*q[r].a-q[r].b;
            if(t1+t2<=0) break;
            r--;
        } 
        while(l<=r&&l<n&&r>=0){
            sum=(sum+(num[r]-num[l-1])*q[l].c)%mod;
            l++;
            while(r>=0){
                ll t1=2*q[l].a-q[l].b;
                ll t2=2*q[r].a-q[r].b;
                if(t1+t2<=0) break;
                r--;
            } 
        } 
        return sum;
    }
    int main(){
        scanf("%d",&n);
        for(int i=0;i<n;i++){
            scanf("%lld%lld%lld",&q[i].a,&q[i].b,&q[i].c);
        }
        ll sum=solve();
        //printf("%lld
    ",sum);
        for(int i=0;i<n;i++) swap(q[i].a,q[i].b);
        sum=(sum+solve())%mod;
        printf("%lld
    ",sum);
    } 
  • 相关阅读:
    Keras -- 词向量 CNN
    KUDU实时分析
    Keras
    Kalfka
    Linux云
    管理KUDU
    列存储与行存储
    算法笔记 第5章 入门篇(3) --数学问题 学习笔记
    算法笔记 上机训练实战指南 第4章 入门篇(2) --算法初步 4.6two pointers 学习笔记
    算法笔记 上机训练实战指南 第4章 入门篇(2) --算法初步 4.4贪心 学习笔记
  • 原文地址:https://www.cnblogs.com/Lis-/p/11281306.html
Copyright © 2011-2022 走看看