2 条题解

  • 0
    @ 2023-9-29 13:34:56

    #include #include #include using namespace std;

    struct block { int value; int count; int begin; };

    int main() { int n = 0; scanf("%d", &n);

    vector<block> myblocks;
    int intput = 0;
    for (int i=1; i<=n; i++)
    {
    	scanf("%d", &intput);
    	if (0 == myblocks.size())
    	{
    		block first_block;
    		first_block.value = intput;
    		first_block.count = 1;
    		first_block.begin = i;
    		myblocks.push_back(first_block);
    	}
    	else
    	{
    		block &cur_block = myblocks.back();
    
    		if (intput == cur_block.value)
    		{
    			cur_block.count++;
    		}
    		else
    		{
    			block new_block;
    			new_block.value = intput;
    			new_block.begin = i;
    			new_block.count = 1;
    		    myblocks.push_back(new_block);
    		}
    	}
    	
    }
    
    while (0 != myblocks.size())
    {
        vector<block>::iterator iter = myblocks.begin();
        int cur_value = -1;
        while (iter != myblocks.end())
        {
            if (0==(*iter).count)
            {
                iter = myblocks.erase(iter);
                continue;
            }
            else
            {
                if (cur_value != (*iter).value)
                {
                    cout << (*iter).begin << ' ';
                    cur_value = (*iter).value;
                    (*iter).begin++;
                    (*iter).count--;
                }
                iter++;
            }
        }	
        cout << endl;
    }
    
    return 0;
    

    }

    • 0
      @ 2023-6-21 21:09:13

      debug了半小时,结果发现......

      数组开得不够大!!!\color {grey} 数组开得不够大!!!

      想引用一下曾经最近没开longlonglong long时写的:

      image

      不过数据范围1n2×1051≤n≤2×10^5我数组开到200001200001评测只因你告诉我Standard answer longer than user output....

      得了正题

      22个动态数组,tmptmp是局部的,每次存删除后的水果序列,再赋值给最终的veve

      code:

      #include <bits/stdc++.h>
      using namespace std;
      
      int n,a[300000],l[300000],r[300000];//报复性开大
      vector <int> ve;
      vector <int> tmp;
      
      signed main()
      {
      	freopen("fruit.in","r",stdin);
      	freopen("fruit.out","w",stdout);
          scanf("%d",&n);
          a[0] = a[n + 1] = -1;
      	r[0] = 1;
      	l[n + 1] = n;
          for(int i = 1;i <= n;i++)
      	{
              scanf("%d",&a[i]);
              if(a[i] != a[i - 1]) ve.push_back(i);
              l[i] = i - 1;
      		r[i] = i + 1;
          }
          while(r[0] != n + 1)
      	{
      		tmp.clear();
      		for(int i = 0;i < ve.size();i++)
      		{
                  printf("%d ",ve[i]);
                  int u = l[ve[i]];
      			int v = r[ve[i]];
                  r[u] = v;
      			l[v] = u;
      			if(a[ve[i]] != a[u] && a[ve[i]] == a[v]) tmp.push_back(v); 
      		}
      		ve = tmp;
      		printf("\n");
          }
          return 0;
      }
      
      • 1

      信息

      ID
      1478
      时间
      1000ms
      内存
      256MiB
      难度
      8
      标签
      递交数
      66
      已通过
      8
      上传者