OJ踩坑:使用cout<<endl存在的问题

OJ踩坑:使用cout<<endl存在的问题

在完成Codeforces Round #787 (Div. 3)D. Vertical Paths 时发现自己的算法思路和题解相近,但是运算时间却差了好几倍,通过不断地尝试,甚至感觉自己的代码已经跟题解完全一样了,但时间却未改善

image-20220508153723602

image-20220508153730649

突然发现好像dl的代码都有一个共性的地方

他们一般不会使用cout<<endl

相反是使用 cout<<“\n” 或者 cout<<'\n’的方式

经过查阅资料得知,原来在输出比较少的时候,二者区别不大,但是当输出很多的时候,使用cout<<endl会非常地慢

image-20220508153959780

这个时候才发现可能之前写的一些代码不能通过是因为这个原因。。。。

附本题题解加深自己记忆

#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;

}
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值