千千蓝鲸的题,莫名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 分别表示行动的开始和结束位置。
输出一行,包含一个整数,表示当所有行动顺序结束后处于关闭状态的灯的数量。
10 2 4 2 8 2 1 9
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;
}
样例我试过了的·-· 我导师说我思路没问题(不过我希望我思路有问题) 蒟蒻再次求助