大佬们我把语法错误改了但内容还是有问题

P1638 逛画展

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


|