【问题标题】:tle error in algorithm design算法设计中的小错误
【发布时间】:2017-12-02 18:30:06
【问题描述】:

给定大小为 n 的二进制字符串,有两种类型的查询

1.D为输入字符串D显示连续1的最长子数组长度

2.C X 用于输入字符串 C 和整数 x 如果为零,则将字符串位置 x 更改为 1

我的尝试

int main(){
    int n,k,i,j,y,count=0;
    string s,x;
    int maxcount=0;
    cin>>n>>k;
    cin>>s;
    for(j=0;j<k;j++)
    {
        cin>>x;
        if(x=='D')
        {
            maxcount=0;
            for(i=0;i<n;i++)
            {
                if(s[i]=='1')
                {
                    count++;
                } else{
                    maxcount = max(maxcount,count);
                    count=0;
                }
            }
            maxcount = max(maxcount,count);
            cout<<maxcount<<endl;

        } else{
            cin>>x;
            s[x-1] = '1';

        }
    }
return 0;
}

我认为可以使用离线查询来完成,任何人都可以提出方法或解决方案

【问题讨论】:

  • 你有一些看起来非常 O(N^2) 的东西。比赛通常希望您知道或寻找将时间复杂度降低到更易于管理的“技巧”
  • @user4581301 你能建议我的方法吗
  • 这样做有什么意义?然后我赢得了比赛,而不是你。
  • @user4581301 你觉得哪场比赛不是来自比赛兄弟
  • 那你的编译器坏了:ideone.com/Q0YajF

标签: c++ algorithm math


【解决方案1】:

您可以使用不相交的集合数据结构来解决您的问题。连续 '1' 的每个子串将是一个组件。当您将某些字符 '0' 更改为 '1' 时,您可以使用这个单个元素创建一个新集合。可能有几种情况:

  1. 前一个字符和下一个字符是“1”。所以你可以合并这三个集合。
  2. 之前是“1”。您可以将这个与之前的集合合并。
  3. 接下来是“1”。您可以将其与下一组合并。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    相关资源
    最近更新 更多