萌新刚学OI1ms不会贪心求条
查看原帖
萌新刚学OI1ms不会贪心求条
608410
封禁用户楼主2024/12/2 16:31

RT,wtcl

#include<bits/stdc++.h>

namespace IO {
    inline int read() {
        int ret = 0, f = 1;char ch = getchar();
        while (ch < '0' || ch > '9') {
            if (ch == '-') f = -f;
            ch = getchar();
        }
        while (ch >= '0' && ch <= '9') {
            ret = (ret << 1) + (ret << 3) + (ch ^ 48);
            ch = getchar();
        }
        return ret * f;
    }
    void write(int x) {
        if (x < 0) putchar('-'), x = -x;
        if (x > 9) write(x / 10);
        putchar(x % 10 + '0');
    }
}

using namespace std;
using namespace IO;

const int maxn = 1e5 + 5;

int T, n, ans;
int ax[maxn], bx[maxn];
int a[maxn], b[maxn], mova[maxn], movb[maxn], numa[maxn][2], numb[maxn][2], govis[maxn][2];
/*
ax,bx : 两个序列的i号能否移动 
mova,movb : 如果能移动,所在区块编号是多少(能移动的点组成的区块
numa, munb : 每个区块里0/1的个数
govis : (两个串里面都可以交换的地方需要最后处理)这样的地方上下区块各自的编号 
*/

int main() {
    T = read();
    while (T--) {
        n = read();
        for (int i = 1;i <= n;i++) a[i] = getchar() - '0';
        getchar();
        for (int i = 1;i <= n;i++) b[i] = getchar() - '0';
        getchar();
        
        ans = 0;
        memset(mova, 0, sizeof(mova));
        memset(movb, 0, sizeof(movb));
        memset(numa, 0, sizeof(numa));
        memset(numb, 0, sizeof(numb));
        memset(govis, 0, sizeof(govis));
        
        int tot = 0;
        for (int i = 1;i <= n;i++) ax[i] = getchar() - '0';
        getchar();

        // for (int i = 1;i <= n;i++) {
        //     cout << a[i];
        // }puts("");
        // for (int i = 1;i <= n;i++) {
        //     cout << mova[i];
        // }puts("");
        // for (int i = 1;i <= tot;i++) cout << numa[i][0] << ' ' << numa[i][1] << '\n';

        tot = 0;
        for (int i = 1;i <= n;i++) bx[i] = getchar() - '0';
        getchar();
        
        for (int i = 1;i <= n;i++) {
        	if (!ax[i - 1] && !ax[i + 1]) continue;
        	if (!ax[i - 1]) ax[i] = ++tot;
		} 
		
		for (int i = 1;i <= n;i++) {
			if (!bx[i - 1] && !bx[i + 1]) continue;
			if (!bx[i - 1]) bx[i] = ++tot;
		}

        // for (int i = 1;i <= n;i++) {
        //     cout << b[i];
        // }puts("");
        // for (int i = 1;i <= n;i++) {
        //     cout << movb[i];
        // }puts("");
        // for (int i = 1;i <= tot;i++) cout << numb[i][0] << ' ' << numb[i][1] << '\n';
        int total = 0;
        for (int i = 1;i <= n;i++) {
            if (mova[i] && !movb[i]) {
                if (numa[mova[i]][b[i]]) numa[mova[i]][b[i]], ans++;
                else numa[mova[i]][!b[i]]--;
            }
            if (movb[i] && !mova[i]) {
                if (numb[movb[i]][a[i]]) numb[movb[i]][a[i]], ans++;
                else numb[movb[i]][!a[i]]--;
            }
            if (movb[i] && mova[i]) {
                if (govis[total][0] == mova[i] && govis[total][1] == movb[i]) continue;
                govis[++total][0] = mova[i];
                govis[total][1] = movb[i];
            }
            else ans += (a[i] == b[i]);
        }

        for (int i = 1;i <= tot;i++) cout << numa[i][0] << ' ' << numa[i][1] << '\n';
        for (int i = 1;i <= tot;i++) cout << numb[i][0] << ' ' << numb[i][1] << '\n';
//        for (int i = 1;i <= total;i++) cout << govis[i][0] << ' ' << govis[i][1];puts(""); 

        for (int i = 1;i <= tot;i++) {
            // if (!govis[i]) continue;
            int num0 = min(numa[govis[i][0]][0], numb[govis[i][1]][0]);
            int num1 = min(numa[govis[i][0]][1], numb[govis[i][1]][1]);
            ans += num0 + num1;
            numa[govis[i][0]][0] -= num0, numa[govis[i][0]][1] -= num1;
            numb[govis[i][1]][0] -= num0, numb[govis[i][1]][1] -= num1;
        }

        write(ans), puts("");
    }
    return 0;
}
2024/12/2 16:31
加载中...