求分析时间复杂度 & 讲解做法
  • 板块学术版
  • 楼主Devsong_
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/8/10 12:55
  • 上次更新2023/10/27 16:08:48
查看原帖
求分析时间复杂度 & 讲解做法
536597
Devsong_楼主2022/8/10 12:55

题目:https://www.luogu.com.cn/problem/P7913

代码:

#include<bits/stdc++.h>
using namespace std;
int n,m1,m2,s,v;
int b,c[150000],d[150000];
int c2[150000],d2[150000];
int ans=-1;
struct node{
    int x,y;
    }a[150000];
int cmp(node p,node q){
    if(p.x!=q.x)
        return p.x<q.x;
    else
        return p.y<q.y;
    }
void work1(int aaa){
    for(int i=1;i<=s;i++)
        if(c[i]<a[aaa].x){
            c[i]=a[aaa].y;
            c2[i]++;
            return;}
    s++;
    c[s]=a[aaa].y;
    c2[s]=1;}
void work2(int bbb){
    for(int i=1;i<=v;i++)
        if(d[i]<a[bbb].x){
            d[i]=a[bbb].y;
            d2[i]++;
            return;}
    v++;
    d[v]=a[bbb].y;
    d2[v]=1;}
void work3(){
    for(int i=0;i<=n;i++)
        ans=max(ans,c2[i]+d2[n-i]);
    cout<<ans;}
int main()
{
 //   freopen("airport.in","r",stdin);
 //   freopen("airport.out","w",stdout);
    cin>>n>>m1>>m2;
    for(int i=1;i<=m1;i++)
        cin>>a[i].x>>a[i].y;
    s=1;
    sort(a+1,a+m1+1,cmp);
    c[1]=a[1].y;
    c2[1]=1;
    for(int i=2;i<=m1;i++)
        work1(i);
    for(int i=2;i<=n;i++)
        c2[i]=c2[i-1]+c2[i];
    for(int i=1;i<=m2;i++)
        cin>>a[i].x>>a[i].y;
    v=1;
    sort(a+1,a+m2+1,cmp);
    d[1]=a[1].y;
    d2[1]=1;
    for(int i=2;i<=m2;i++)
        work2(i);
    for(int i=2;i<=n;i++)
        d2[i]=d2[i-1]+d2[i];
    work3();
    return 0;}

不是我写的,是同机房大佬写的考场代码。

一开始看到两重循环以为是暴力 AC 的,后来一想不对,因为当时民间数据和官方数据都过了。仔细一看代码好像又不是 n2n^2,但又看不出来。

或者说这是不是一个平均时间复杂度能 AC,但是可以构造出一些极限数据卡掉这个程序?反正洛谷上 AC,跑得最多的点是 800ms,可是 CCF 是 96pts,大概率是 TLE 了一个点吧。

在题目的讨论区发了两遍,但是没什么人看/kk

2022/8/10 12:55
加载中...