1. 你的下标很混乱,输入的时候是0~n,计算的时候??
2. 别用accmulate了,会超时。你在每次b[a[i]]从0到1的时候弄个变量+1能降时间复杂度的
by ygkl9698 @ 2023-09-20 13:27:02
@[ygkl9698](/user/553673) 大佬我把这些都改了还是有问题,而且本来这个差不多能运行就行的代码就该从第二个开始,不然会有问题
下面的是我改过的代码,求修正```cpp
#include<bits/stdc++.h>
using namespace std;
int n,m,a[1000009],b[1000009],sum;
int main(){
cin>>n>>m;
int x=0,y=0;//从第一个画家开始
for(int i=0;i<n;i++){
cin>>a[i];//输入每幅画的画家编号
}
for(int i=1;i<n;i++){
if(sum>=m)//如果每个画家都有画,结束循环
break;
else
{
if(a[x]==a[i]){//若这幅画作者与开头画作作者相同
x++;//开始处向后移动
}
if(b[a[i]]==0){
b[a[i]]=1;
sum++;
}//标记目前这幅画的画家已经有画出现
y++;//结束位置往后移动
}
}
cout<<x+1<<" "<<y+1;
return 0;
}
```
by Zoeli @ 2023-09-21 12:24:04
@[Zoeli](/user/1081864)
调了一中午……
```cpp
#include<bits/stdc++.h>
using namespace std;
int n,m,a[1000009],b[1000009],sum=1,xx,yy,minn=0x3f3f3f3f;
int main(){
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>a[i];//输入每幅画的画家编号
}
int x=0,y=0;//从第一个画家开始
b[a[0]]++; //记录第一幅画
for(int i=1;i<n;i++){
if(sum>=m){//题目中要找票价最小的,所以不能找到就break
if(y-x<minn){//判断是不是最小的
xx=x,yy=y,minn=y-x;
}
}
y++; //先计入
if(b[a[i]]==0){
sum++;
}//标记目前这幅画的画家已经有画出现
b[a[i]]++;
while(b[a[x]]>1){//第一幅画的作者除了这幅画还有别的
b[a[x]]--;
x++;//开始处向后移动
}
}
if(sum>=m){//防止答案包括最后一幅画
if(y-x<minn){
xx=x,yy=y,minn=y-x;
}
}
cout<<xx+1<<" "<<yy+1;
return 0;
}
```
by ygkl9698 @ 2023-09-21 13:19:40
@[ygkl9698](/user/553673) 大佬,minn=0x3f3f3f3f是啥意思
by Zoeli @ 2023-09-22 11:34:18
@[Zoeli](/user/1081864) 就是int中接近无穷大的数
by ygkl9698 @ 2023-09-22 19:42:09