比较简单,40分钟就基本ak了t1没啥好说的,判断一下区间写三个if判断下区间是否相交就可以了,不过别忘了初始答案要赋值成-1。#include "bits/stdc++.h"using namespace std;int l1,l2,l3,r1,r2,r3;int main(){    cin>>l1>>r1>>l2>>r2>>l3>>r3;    int ans = -1;    if ((r1 >= l2 && r1<=r2) || (r1 >= l3 && r1 <= r3))        ans = max(ans,r1*2);    if ((r2 >= l1 && r2 <= r1) ||(r2 >= l3 && r2 <= r3))        ans = max(ans,r2*2);    if((r3 >= l1 && r3 <= r1) ||(r3 >= l2 && r3 <=r2))        ans = max(ans,r3*2);    cout<<ans<<endl;}t2 考虑对b排序,然后通过c求一个前缀最大值,然后对每一个a[i] 二分一下最大能满足的b的下标pos,减去pos再全部加起来即可#include "bits/stdc++.h"using namespace std;struct discount{    int b;    int c;}dis[200005];int a[200005],pre[200005];int n,m;bool cmp(discount x,discount y){    return x.b < y.b;}int find(int x){    int l = 1;    int r = m;    int res = 0;    while (l<=r){        int mid = (l+r) >> 1;        if(dis[mid].b <= x){            res = mid;            l = mid + 1;        }        else{            r = mid - 1;        }    }    return res;}int main(){    cin>>n>>m;    for(int i=1;i<=n;i++){        cin>>a[i];    }    for(int i=1;i<=m;i++){        cin>>dis[i].b>>dis[i].c;    }    sort(dis+1,dis+m+1, cmp);    for(int i=1;i<=m;i++){        pre[i] = max(pre[i-1],dis[i].c);    }    long long ans = 0;    for(int i=1;i<=n;i++){        int pos = find(a[i]);        ans = ans + (a[i] - pre[pos]);    }    cout<<ans<<endl;}t3 求一个二维前缀和,然后发现n^3的暴力能过,更优解可以考虑二分一下len(这样铁定能过),就直接提交了。#include "bits/stdc++.h"using namespace std;int a[1005][1005];long long pre[1005][1005];int n,m;int main() {    cin>>n>>m;    for(int i=1;i<=n;i++){        for(int j=1;j<=m;j++){            cin>>a[i][j];        }    }    for(int i=1;i<=n;i++){        for(int j=1;j<=m;j++){            pre[i][j] = pre[i-1][j] + pre[i][j-1] - pre[i-1][j-1] + a[i][j];        }    }    long long ans = 0x3fffffff;    long long sum = 0;    for(int i=1;i<=n;i++){        for(int j=1;j<=m;j++){            sum = sum + a[i][j];        }    }    for(int len=1;len<=min(n,m);len++){        for(int i=1;i<=n-len;i++){            for(int j=1;j<=m-len;j++){                long long now = pre[i+len][j+len] - pre[i+len][j-1] - pre[i-1][j+len] + pre[i-1][j-1];                ans = min(ans,abs(sum - now - now));            }        }    }    cout<<ans<<endl;}// 64 位输出请用 printf("%lld")
点赞 11
评论 11
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务