Codeforces 400C Inna and Huge Candy Matrix

本文介绍了一个在 Codeforces 平台上的中等难度编程挑战题目的解决策略。通过细致分析题目要求,本文揭示了如何利用规律寻找最优解。包括翻转操作的细节和行列交换的技巧,帮助读者理解和解决此类问题。

题目链接:Codeforces 400C Inna and Huge Candy Matrix

不是难题,需要耐心找规律。

记得某些翻转后需要交换行列值。

#include <iostream>

using namespace std;

const int MAX_N = 100000 + 1000;
struct Point
{
    int x,y;
};
int n,m,x,y,z,p;

Point point[MAX_N];

void clockwise(int k)
{
    k = k % 4;
    if(k == 1)
    {
        for(int i = 0;i < p;i++)
        {
            int temp_x = point[i].x;
            int temp_y = point[i].y;
            point[i].x = temp_y;
            point[i].y = n + 1 - temp_x;
        }
        int temp = n;
        n = m;
        m = temp;
    }
    else if(k == 2)
    {
        for(int i = 0;i < p;i++)
        {
            int temp_x = point[i].x;
            int temp_y = point[i].y;
            point[i].x = n + 1 - temp_x;
            point[i].y = m + 1 - temp_y;
        }
    }
    else if(k == 3)
    {
        for(int i = 0;i < p;i++)
        {
            int temp_x = point[i].x;
            int temp_y = point[i].y;
            point[i].x = m + 1 - temp_y;
            point[i].y = temp_x;
        }
        int temp = n;
        n = m;
        m = temp;
    }
}
void horizontal_rotate(int k)
{
    k = k % 2;
    if(k == 0)
        return;
    for(int i = 0;i < p;i++)
        point[i].y = m + 1 - point[i].y;
}
void counterclockwise (int k)
{
    k = k % 4;
    if(k == 1)
    {
        for(int i = 0;i < p;i++)
        {
            int temp_x = point[i].x;
            int temp_y = point[i].y;
            point[i].x = m + 1 - temp_y;
            point[i].y = temp_x;
        }
        int temp = n;
        n = m;
        m = temp;
    }
    else if(k == 2)
    {
        for(int i = 0;i < p;i++)
        {
            int temp_x = point[i].x;
            int temp_y = point[i].y;
            point[i].x = n + 1 - temp_x;
            point[i].y = m + 1 - temp_y;
        }
    }
    else if(k == 3)
    {
        for(int i = 0;i < p;i++)
        {
            int temp_x = point[i].x;
            int temp_y = point[i].y;
            point[i].x = temp_y;
            point[i].y = n + 1 - temp_x;
        }
        int temp = n;
        n = m;
        m = temp;
    }
}
int main()
{
    while(cin >> n >> m >> x >> y >> z >> p)
    {
        for(int i = 0;i < p;i++)
            cin >> point[i].x >> point[i].y;
        clockwise(x);
        horizontal_rotate(y);
        counterclockwise(z);
        for(int i = 0;i < p;i++)
            cout << point[i].x << " " << point[i].y << endl;
    }
    return 0;
}


虽然给定引用中未直接提及“Kuroni and Simple Strings”题目的详细信息,但通常这类题目可能与字符串处理、括号匹配等相关。一般而言,题目可能会给出一个由括号组成的字符串,要求找出能移除的最大数量的不相交的合法括号对,并输出移除这些括号对后的相关信息。 ### 解法分析 #### 栈解法 栈解法是处理括号匹配问题的经典方法。通过遍历字符串,将左括号压入栈中,遇到右括号时,若栈顶为左括号,则将栈顶元素弹出,表示这是一对匹配的括号。 ```python s = input() stack = [] pairs = [] for i, char in enumerate(s): if char == '(': stack.append(i) else: if stack: left_index = stack.pop() pairs.append((left_index + 1, i + 1)) if not pairs: print(0) else: print(1) print(len(pairs) * 2) result = [] for l, r in pairs: result.extend([l, r]) result.sort() print(" ".join(map(str, result))) ``` #### 双指针解法 双指针解法从字符串的两端向中间遍历,分别使用两个指针 `left` 和 `right`。`left` 指针从左向右寻找 `(`,`right` 指针从右向左寻找 `)`,当找到一对匹配的括号时,将它们标记为已移除,继续寻找下一对匹配的括号,直到无法再找到匹配的括号为止。 ```python s = input() n = len(s) left = 0 right = n - 1 pairs = [] while left < right: while left < right and s[left] != '(': left += 1 while left < right and s[right] != ')': right -= 1 if left < right: pairs.append((left + 1, right + 1)) left += 1 right -= 1 if not pairs: print(0) else: print(1) print(len(pairs) * 2) result = [] for l, r in pairs: result.extend([l, r]) result.sort() print(" ".join(map(str, result))) ``` ### 复杂度分析 - **栈解法**:时间复杂度为 $O(n)$,其中 $n$ 是字符串的长度。空间复杂度为 $O(n)$,主要用于栈的空间开销。 - **双指针解法**:时间复杂度为 $O(n)$,空间复杂度为 $O(n)$,主要用于存储匹配的括号对。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值