• Codeforces Round #455 (Div. 2) 909D. Colorful Points


      OvO http://codeforces.com/contest/909/problem/D

      CF 455 div2 D

      CF 909D

      算出模拟的复杂度之后就是一个很水的模拟题

      把字符串按照类似于行程编码的方式来表示,例如把 aaaabbccc 表示成 [4*a] [2*b] [3*c] 这样的形式([4*a] 这个用一个结构体表示)

      接下去就可以开心地敲模拟了,

      例如对于 [5*a] [4*b] [2*c] [4*b]  这样一个表,

      运行一次之后就变成了  [4*a] [2*b] [0*c] [3*b]

      然后进行压缩 变成 [4*a] [5*b]

      重点是复杂度的计算,每当你进行一次 O(1) 的操作(遍历数组,删除元素)时候,元素的总量(按 aabbc 5 个元素这样算)也会减1,所以总的复杂度是 O(n) 的,并不会超时

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    
    using namespace std;
    
    const int M=1e6+44;
    
    struct Node
    {
    	int val,num;
    } q[M];
    
    int lq;
    char str[M];
    
    void cps()
    {
    	int k=lq;
    	lq=0;
    	for(int i=1;i<=k;i++)
    		if(q[i].num>0)
    		{
    			if(q[i].val==q[lq].val)
    				q[lq].num+=q[i].num;
    			else
    				q[++lq]=q[i];
    		}
    }
    
    void solve()
    {
    	int ans=0;
    	while(lq>1)
    	{
    		ans++;
    		for(int i=2;i<lq;i++)
    			q[i].num-=2;
    		q[1].num--,q[lq].num--;
    		cps();
    	}
    	printf("%d
    ",ans);
    }
    
    int main()
    {
    	scanf("%s",str+1);
    	lq=strlen(str+1);
    	q[0].val=-1;
    	for(int i=1;i<=lq;i++)
    		q[i].val=str[i]-'a',q[i].num=1;
    	cps();
    	solve();
    	return 0;
    }
    

      

  • 相关阅读:
    bzoj3653: 谈笑风生
    bzoj1858: [Scoi2010]序列操作
    bzoj1857: [Scoi2010]传送带
    bzoj1856: [Scoi2010]字符串
    bzoj1855: [Scoi2010]股票交易
    bzoj1854: [Scoi2010]游戏
    bzoj1853: [Scoi2010]幸运数字
    斜堆,非旋转treap,替罪羊树
    NOI2003 文本编辑器
    A_star poj2449 k短路
  • 原文地址:https://www.cnblogs.com/FxxL/p/8137641.html
Copyright © 2020-2023  润新知