• 【bzoj2821】作诗(Poetize)


    *题目描述:
    神犇SJY虐完HEOI之后给傻×LYD出了一题:SHY是T国的公主,平时的一大爱好是作诗。由于时间紧迫,SHY作完诗
    之后还要虐OI,于是SHY找来一篇长度为N的文章,阅读M次,每次只阅读其中连续的一段[l,r],从这一段中选出一
    些汉字构成诗。因为SHY喜欢对偶,所以SHY规定最后选出的每个汉字都必须在[l,r]里出现了正偶数次。而且SHY认
    为选出的汉字的种类数(两个一样的汉字称为同一种)越多越好(为了拿到更多的素材!)。于是SHY请LYD安排选
    法。LYD这种傻×当然不会了,于是向你请教……问题简述:N个数,M组询问,每次问[l,r]中有多少个数出现正偶
    数次。
    *输入:
    输入第一行三个整数n、c以及m。表示文章字数、汉字的种类数、要选择M次。第二行有n个整数,每个数Ai在[1, c
    ]间,代表一个编码为Ai的汉字。接下来m行每行两个整数l和r,设上一个询问的答案为ans(第一个询问时ans=0),
    令L=(l+ans)mod n+1, R=(r+ans)mod n+1,若L>R,交换L和R,则本次询问为[L,R]。
    *输出:
    输出共m行,每行一个整数,第i个数表示SHY第i次能选出的汉字的最多种类数。
    *样例输入:
    5 3 5
    1 2 2 3 1
    0 4
    1 2
    2 2
    2 3
    3 5
    *样例输出:
    2
    0
    0
    0
    1
    *提示:
    对于100%的数据,1<=n,c,m<=10^5
    *题解:
    和区间众数一样地做。统计答案的时候就是看区间内出现了多少次,如果是奇数且大于1,那么答案-1,如果是偶数答案+1. (这题貌似有点卡内存,我sqrt的块被卡MLE了,变3倍就ac了,然而跑得巨慢)
    *代码:

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    
    #ifdef WIN32
        #define LL "%I64d"
    #else
        #define LL "%lld"
    #endif
    
    #ifdef CT
        #define debug(...) printf(__VA_ARGS__)
        #define setfile() 
    #else
        #define debug(...)
        #define filename ""
        #define setfile() freopen(filename".in", "r", stdin); freopen(filename".out", "w", stdout);
    #endif
    
    #define R register
    #define getc() (S == T && (T = (S = B) + fread(B, 1, 1 << 15, stdin), S == T) ? EOF : *S++)
    #define dmax(_a, _b) ((_a) > (_b) ? (_a) : (_b))
    #define dmin(_a, _b) ((_a) < (_b) ? (_a) : (_b))
    #define cmax(_a, _b) (_a < (_b) ? _a = (_b) : 0)
    #define cmin(_a, _b) (_a > (_b) ? _a = (_b) : 0)
    char B[1 << 15], *S = B, *T = B;
    inline int FastIn()
    {
        R char ch; R int cnt = 0; R bool minus = 0;
        while (ch = getc(), (ch < '0' || ch > '9') && ch != '-') ;
        ch == '-' ? minus = 1 : cnt = ch - '0';
        while (ch = getc(), ch >= '0' && ch <= '9') cnt = cnt * 10 + ch - '0';
        return minus ? -cnt : cnt;
    }
    #define maxn 100010
    #define maxc 300
    int Ans[maxc][maxc], Cnt[maxc][maxn], a[maxn], id[maxn], block, num, ans;
    int cnt[maxn];
    int main()
    {
    //  setfile();
        R int n = FastIn(), c = FastIn(), m = FastIn();
        block = sqrt(n) * 3; num = (n - 1) / block;
        for (R int i = 0; i < n; ++i)
        {
            a[i] = FastIn();
            id[i] = i / block;
        }
        for (R int i = 0; i <= num; ++i)
            for (R int j = 0; j < (i + 1) * block; ++j)
                ++Cnt[i][a[j]];
        for (R int i = 0; i <= num; ++i)
        {
            ans = 0;
            for (R int j = i; j <= num; ++j)
            {
                for (R int k = j * block; k < (j + 1) * block; ++k)
                    (++cnt[a[k]] & 1) && cnt[a[k]] > 1
                        ? --ans
                        : ~cnt[a[k]] & 1
                            ? ++ans
                            : 0;
                Ans[i][j] = ans;
            }
            memset(cnt, 0, sizeof(cnt));
        }
        ans = 0;
        for (; m; --m)
        {
            R int ql = (FastIn() + ans) % n, qr = (FastIn() + ans) % n;
            if (ql > qr) std::swap(ql, qr);
            if (id[ql] == id[qr])
            {
                ans = 0;
                for (R int i = ql; i <= qr; ++i)
                    (++cnt[a[i]] & 1) && cnt[a[i]] > 1
                        ? --ans
                        : ~cnt[a[i]] & 1
                            ? ++ans
                            : 0;
                for (R int i = ql; i <= qr; ++i) cnt[a[i]] = 0;
            }
            else
            {
                R int l = id[ql] + 1, r = id[qr] - 1;
                ans = Ans[l][r];
                for (R int i = ql; i < l * block; ++i)
                {
                    R int tmp = ++cnt[a[i]] + Cnt[r][a[i]] - Cnt[l - 1][a[i]];
                    (tmp & 1) && tmp > 1
                        ? --ans
                        : ~tmp & 1
                            ? ++ans
                            : 0;
                }
                for (R int i = id[qr] * block; i <= qr; ++i)
                {
                    R int tmp = ++cnt[a[i]] + Cnt[r][a[i]] - Cnt[l - 1][a[i]];
                    (tmp & 1) && tmp > 1
                        ? --ans
                        : ~tmp & 1
                            ? ++ans
                            : 0;
                }
                for (R int i = ql; i < l * block; ++i) cnt[a[i]] = 0;
                for (R int i = id[qr] * block; i <= qr; ++i) cnt[a[i]] = 0;
            }
            printf("%d
    ", ans );
        }
        return 0;
    }
  • 相关阅读:
    SpringCloud-Hystrix Dashboard 之 Unable to connect to Command Metric Stream
    try() catch{}
    git使用和操作
    外部服务器使用jedis操作redis数据库
    Tomcat部署spring boot项目
    java成神之路截图
    innodb 死锁分析之相关表结构说明
    mysql 死锁案例及分析过程
    Head First设计模式之观察者(Observer)模式(二)
    Head First设计模式之策略模式(Strategy)
  • 原文地址:https://www.cnblogs.com/cocottt/p/5550951.html
Copyright © 2020-2023  润新知