sgu211:Strange Counter(构造)

来源:互联网 发布:java构造方法特点 编辑:程序博客网 时间:2024/06/10 02:39

Orz 想出题解的神犇。。。

其实思想挺简单,就是保证没有连续的2即可,分两种情况:

假设当前加上2p
(1)找到p之后的第一个2的位置x,再找到x之前第一个0的位置y,若yp,说明px之间有若干个1(可以是0),我们把2进一位,再把当前位进一位即可。若不把2进一位,那么之后出现同样的情况也不会把2进一位,这样就可能连续的1变成连续的2,然后就duang了。
(2)不满足情况(1)的话,直接进当前位即可。

这样最大单词操作次数3,满足题意。

Ac Code:

#include <cstdio>#include <set>using namespace std;const int MAXN = 1009;const int INF = 1e9;int n, m;int v[MAXN];set<int> zero, two;set<int>::iterator t0, t2;void update(int p, int add){    if(v[p] == 0) zero.erase(p);    if(v[p] == 2) two.erase(p);    v[p] += add;    printf(" %d %d", p, v[p]);    if(v[p] == 0) zero.insert(p);    if(v[p] == 2) two.insert(p);}int main(){    scanf("%d%d", &n, &m);    for(int i = 0; i <= n; ++i)        zero.insert(i);    two.insert(n);    while(m--)    {        int p;        scanf("%d", &p);        t2 = two.upper_bound(p);        t0 = zero.upper_bound(*t2);        if(p >= *(--t0))        {            printf("3");            update(p, 1);            update(*t2, -2);            update(*t2+1, 1);           }        else if(v[p] > 0)        {            printf("2");            update(p, -1);            update(p+1, 1);        }        else        {            printf("1");            update(p, 1);           }        puts("");    }    return 0;}
0 0
原创粉丝点击