OJ踩坑:使用cout<<endl存在的问题
在完成Codeforces Round #787 (Div. 3)D. Vertical Paths 时发现自己的算法思路和题解相近,但是运算时间却差了好几倍,通过不断地尝试,甚至感觉自己的代码已经跟题解完全一样了,但时间却未改善
突然发现好像dl的代码都有一个共性的地方
他们一般不会使用cout<<endl
相反是使用 cout<<“\n” 或者 cout<<'\n’的方式
经过查阅资料得知,原来在输出比较少的时候,二者区别不大,但是当输出很多的时候,使用cout<<endl会非常地慢
这个时候才发现可能之前写的一些代码不能通过是因为这个原因。。。。
附本题题解加深自己记忆
#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
void solve()
{
int k;
cin>>k;
if (k==1)
{
cin>>k;
cout << "1\n1\n1\n\n";
return ;
}
//out.resize(k+1);
vector<bool> in(k+1,true);
vector<int> p(k+1);
vector<bool> visited(k+1,false);
vector<int> ret[k+1];
for (int j=1;j<=k;j++)
{
cin>>p[j];
in[p[j]]=false;//入度+1
//out[p[k]].push_back(j);
}
ll res=0;
for(int mm=1;mm<=k;mm++)
{
if (in[mm]!=true)
continue;
int now=mm;
ret[res].emplace_back(now);
visited[now]=1;
while(p[now]!=now&&!visited[p[now]])
{
//到底
now=p[now];
ret[res].emplace_back(now);
visited[now]=1;
// vector<int>::iterator p=out[now].begin();
//可以继续往下
}
res++;
}
cout<<res<< '\n';
for (auto &ans: ret)
{
if (ans.empty())
continue;
cout<<ans.size()<< '\n';
reverse(ans.begin(),ans.end());
for (auto &v:ans)
cout<<v<<" ";
cout<< '\n';
}
//下面开始搞
cout<< '\n';
}
//vector<vector<int>> out;
int main()
{
ios::sync_with_stdio(false);
ll n;
cin>> n;
for (int i=0;i<n;i++)
{
solve();
}
system("pause");
return 0;
}