蒟蒻求助·-·
  • 板块学术版
  • 楼主luogu_li4zi3
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/3 20:20
  • 上次更新2024/8/3 20:30:26
查看原帖
蒟蒻求助·-·
1312687
luogu_li4zi3楼主2024/8/3 20:20

千千蓝鲸的题,莫名TLE,把change函数的内容去了就不超时了,但是选择结构都算时间复杂度的吧 开O2还是TLE 但是理论上这个题时间判得很松啊·-·? 题干: 时间限制: 1000MS 内存限制: 128MB

描述

某校大门外长度为 L 的马路上有一排路灯,每两个相邻的灯之间的间隔都是 1 米。我们可以把马路看成一个数轴,马路的一端在数轴 0 的位置,另一端在 L 的位置;数轴上的每个整数点,即 0,1,2,…,L 都有一个路灯,依次编号为 0,1…,L。 每个灯拉动开关可以按照,关-红-黄-绿-蓝-关的顺序变化,最初所有路灯都是关着的。现在有 n 次行动顺序,每次标出当前行动的含义以及开始和结束位置。每种行动的具体含义如下: 1 s t:把编号 s 灯到编号 t 灯之间所有的灯(包含编号 s 灯和编号 t 灯)都变成关闭状态; 2 s t:把编号 s 灯到编号 t 灯之间所有的开着的灯(包含编号 s 灯和编号 t 灯)都变成红色或绿色,只要灯变成红色或绿色时就停止拉动开关; 3 s t:把编号 s 灯到编号 t 灯之间所有的灯(包含编号 s 灯和编号 t 灯)都变成蓝色或黄色,只要灯变成蓝色或黄色时就停止拉动开关; 4 s t:把编号 s 灯到编号 t 灯之间所有的灯(包含编号 s 灯和编号 t 灯),按照是第几个灯按几下的顺序拉动开关,本次行动中位置 s 上的灯是第一个灯,位置 t 上的灯是最后一个灯。 请计算:当所有行动顺序结束后处于关闭状态的灯的数量。

输入描述

第一行,包含两个整数 L,n。 接下来 n 行,每行包含三个整数 op,s,t,其中 op 表示是那种行动,s,t 分别表示行动的开始和结束位置。

输出描述

输出一行,包含一个整数,表示当所有行动顺序结束后处于关闭状态的灯的数量。

样例输入 1

10 2 4 2 8 2 1 9

样例输出 1

5

数据范围与提示

1<L≤10000,n≤10000

我的代码

#include<bits/stdc++.h>
using namespace std;
int l,n,ans;
vector<int> lights(10001);//0关1红2黄3绿4蓝5关
void change(int pos) {//模拟拉动一次开关
    if(lights[pos]<=3) lights[pos]++;
    else lights[pos]=0;
}
void change1(int s,int t) {//全关
    for(int i=s;i<=t;i++) {
        lights[i]=0;
    }
}
void change2(int s,int t) {//全红或绿
    for(int i=s;i<=t;i++) {
        //一直拉动开关直到变成红或绿
        while(lights[i]==1||lights[i]==3) change(i);
    }
}
void change3(int s,int t) {
    for(int i=s;i<=t;i++) {
        //一直拉动开关直到变成蓝或黄
        while(lights[i]==2||lights[i]==4) change(i);
    }
}
void change4(int s,int t) {//第i个路灯拉动i+1-s次
    for(int i=s;i<=t;i++) {
        for(int j=1;j<=i-s+1;j++) {
            change(i);
        }
    }
}

int main() {
    cin>>l>>n;
    for(int i=0;i<n;i++) {
        int op,s,t;
        cin>>op>>s>>t;
        switch(op) {
            case 1:change1(s,t);
                break;
            case 2:change2(s,t);
                break;
            case 3:change3(s,t);
                break;
            case 4:change4(s,t);
                break;
        }
    }
    for(int i=0;i<=l;i++) {
        if(!lights[i]) ans++;
    }
    cout<<ans;
    return 0;
}

样例我试过了的·-· 我导师说我思路没问题(不过我希望我思路有问题) 蒟蒻再次求助

2024/8/3 20:20
加载中...