codeforces 1476 D

在这里插入图片描述
可以这样
在这里插入图片描述
可以很清楚的发现同一个折线上的点的贡献是相同的。由于都是从f1那条线开始走,所以把f1上的点的贡献算出来就行,然后想写dp,结果没写出来,搜索也不慢,复杂度o(2n),哎,菜鸡还是老实写搜索吧。然后,这道题还遇见了一个奇葩的事,在vscode 的上,ios::sync 后自己写的read()和cin混在一起用没事,但是到了codeforces上混着用就不行,而且,signed main()这种写法在codeforces上用c++11以上去交。最后一句废话,想好在写。

#include<bits/stdc++.h>
//#define int long long 
#define ioss ios::sync_with_stdio(0),cin.tie(0)
using namespace std;
template<class cl>void read(cl& x)
{
    x=0;int f=0;char ch;ch=getchar();
    while(!isdigit(ch)){f=f|(ch=='-'),ch=getchar();}
    while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    x=f?-x:x;
    return ;
}
template<class cl>void put(cl x)
{
    if(x<0) putchar('-'),x=-x;
    if(x>9) put(x/10);
    putchar(x%10+'0');
    return;
}
const int N=3e5+20;
int f[3][N];
set<pair<int,int> >p;
int n;
int ans[N];
int vis[3][N];
void dfs(int i,int z)
{
    if(i<1||i>n+1) return ;//是n+1,点要多一个
    if(vis[z][i]) return ;
    vis[z][i]=1;//  这里要分是第一条线还是第二条线,开二维。
    p.insert({i,z});
   if(i!=1&&f[z][i-1]==0)
   {
       if(z==1)
       {
           dfs(i-1,2);
       }
       else dfs(i-1,1);
   }
   if(i!=n+1&&f[z][i]==1) //是i不是i+1
   {
       if(z==1)
       {
           dfs(i+1,2);
       }
       else 
       {
           dfs(i+1,1);
       }
   }
   return ;
}
signed main()
{
    int t;
    //read(t);
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0); //这个时候最好都写cin,read(),和cin混用毒瘤评测可能不行。
    cin>>t;
    while(t--)
    {
        //read(n);
        cin>>n;
        string s;
        cin>>s;
      //  cout<<s<<endl;
        for(int i=1;i<=n;i++)
        {
           if(s[i-1]=='R')
           {
               f[1][i]=1;
               f[2][i]=0;
           }
           else 
           {
               f[1][i]=0;
               f[2][i]=1; //f[2],不是f[1]
           }
        }
        for(int i=0;i<n+5;i++)
        {
            vis[1][i]=0;
            vis[2][i]=0;
        }
        int tt=0;
        for(int i=1;i<=n+1;i++)
        {
          //  tt=1;
            if(vis[1][i]) continue;
            p.clear();
           // cout<<p.size()<<endl;
            dfs(i,1);
          //  cout<<p.size()<<endl;
            tt=p.size();
            for(auto it=p.begin();it!=p.end();it++)
            {
               // cout<<(*it).first<<" ";
                if((*it).second==1)
                {
                    ans[(*it).first]=tt;
                }
            }
          //  cout<<endl;
          //  p.clear();
        }
     //   cout<<endl;
        for(int i=1;i<=n;i++)//
        {
            cout<<ans[i]<<" ";//这个地方要注意,有些毒瘤评测会卡这个地方多一个空格。
        }
        cout<<ans[n+1]<<endl;
        
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值