蒟蒻T飞求调
  • 板块CF240F TorCoder
  • 楼主Monaco
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/10/4 17:23
  • 上次更新2023/11/4 04:52:28
查看原帖
蒟蒻T飞求调
236929
Monaco楼主2021/10/4 17:23

Rt,TLE on test 14

#include <bits/stdc++.h>
#define mid (((l) + (r)) >> 1)
#define lson rt << 1, l, mid
#define rson rt << 1 | 1, mid + 1, r
using namespace std;
const int N = 1e5 + 10;
struct node
{
    int sum, lazy;
} tr[26][N << 2];
string ch;
void build(int cl, int rt, int l, int r)
{
    if (l == r)
    {
        tr[cl][rt].sum = ch[l - 1] == 'a' + cl, tr[cl][rt].lazy = -1;
        return;
    }
    build(cl, lson);
    build(cl, rson);
    tr[cl][rt].sum = tr[cl][rt << 1].sum + tr[cl][rt << 1 | 1].sum;
    tr[cl][rt].lazy = -1;
}
void pushdown(int cl, int rt, int l, int r)
{
    if (tr[cl][rt].lazy != -1)
    {
        tr[cl][rt << 1].lazy = tr[cl][rt].lazy, tr[cl][rt << 1].sum = (mid - l + 1) * tr[cl][rt].lazy;
        tr[cl][rt << 1 | 1].lazy = tr[cl][rt].lazy, tr[cl][rt << 1 | 1].sum = (r - mid) * tr[cl][rt].lazy;
        tr[cl][rt].lazy = -1;
    }
}
void change(int cl, int rt, int l, int r, int L, int R, int K)
{
    if (L <= l && R >= r)
    {
        tr[cl][rt].sum = (r - l + 1) * K;
        tr[cl][rt].lazy = K;
        return;
    }
    pushdown(cl, rt, l, r);
    if (L <= mid)
        change(cl, lson, L, R, K);
    if (R > mid)
        change(cl, rson, L, R, K);
    tr[cl][rt].sum = tr[cl][rt << 1].sum + tr[cl][rt << 1 | 1].sum;
}
void modify(int cl, int rt, int l, int r, int T, int K)
{
    if (l == r)
    {
        tr[cl][rt].sum = K;
        tr[cl][rt].lazy = -1;
        return;
    }
    pushdown(cl, rt, l, r);
    if (T <= mid)
        modify(cl, lson, T, K);
    else
        modify(cl, rson, T, K);
    tr[cl][rt].sum = tr[cl][rt << 1].sum + tr[cl][rt << 1 | 1].sum;
}
int query(int cl, int rt, int l, int r, int L, int R)
{
    if (L <= l && R >= r)
        return tr[cl][rt].sum;
    int ans = 0;
    pushdown(cl, rt, l, r);
    if (L <= mid)
        ans += query(cl, lson, L, R);
    if (R > mid)
        ans += query(cl, rson, L, R);
    return ans;
}
int main()
{
    //    freopen("input.in", "r", stdin);
    //     freopen("output.out", "w", stdout);
    int n, m;
    cin >> n >> m;

    cin >> ch;
    for (int i = 0; i < 26; ++i)
    {
        build(i, 1, 1, n);
    }
    //    for (int i = 1; i <= n; ++i)
    //    {
    //        for (int j = 0; j < 26; ++j)
    //        {
    //            if (query(j, 1, 1, n, i, i))
    //            {
    //                putchar('a' + j);
    //                break;
    //            }
    //        }
    //    }
    // cout << "nmsl" << endl;
    for (int i = 1; i <= m; ++i)
    {
        int l, r;
        int odd = 0, t;
        cin >> l >> r;
        int pd[26], pd_r[26];
        memset(pd, 0, sizeof(pd));
        for (int j = 0; j < 26; ++j)
        {
            pd[j] = query(j, 1, 1, n, l, r);
            if (pd[j] & 1)
                ++odd, t = j;
        }
        //        for (int j = 0; j < 26; ++j)
        //            printf("%d ", pd[j]);
        //        puts("");
        if (odd > 1 || (odd == 0 && l % 2 == r % 2) || (odd == 1 && l % 2 != r % 2))
            continue;
        //        cout << " " << l << " " << r << endl;
        for (int j = 0; j < 26; ++j)
            change(j, 1, 1, n, l, r, 0);
        if (odd == 1)
        {
            modify(t, 1, 1, n, (l + r) >> 1, 1);
            pd[t]--;
        }
        for (int j = 0; j < 26; ++j)
            pd[j] /= 2, pd_r[j] = pd[j];
        int reg = 0;
        for (int j = l; j < (l + r) >> 1; ++j)
        {
            while (!pd[reg])
                ++reg;
            modify(reg, 1, 1, n, j, 1);
            --pd[reg];
        }
        
        if(odd==0)
        {
            while(!pd[reg]) ++reg;
            modify(reg, 1, 1, n, (l + r) >> 1, 1);
            --pd[reg]; 
        }
        reg = 25;
        for (int j = ((l + r) >> 1) + 1; j <= r; ++j)
        {
            while (!pd_r[reg])
                --reg;
            modify(reg, 1, 1, n, j, 1);
            --pd_r[reg];
        }
    }
    for (int i = 1; i <= n; ++i)
    {
        for (int j = 0; j < 26; ++j)
        {
            if (query(j, 1, 1, n, i, i))
            {
                putchar('a' + j);
                break;
            }
        }
    }
    return 0;
}
2021/10/4 17:23
加载中...