首页 > 编程语言 >[算法题解] Codeforces round 979 --D. QED's Favorite Permutation

[算法题解] Codeforces round 979 --D. QED's Favorite Permutation

时间:2024-10-23 17:00:51浏览次数:5  
标签:ok QED -- 题解 交换 pos int need

题目链接:https://codeforces.com/contest/2030/problem/D

题目:

题解:

  • Favotite Permutation即每个数满足i=p[i];此题中,p数组每次询问后保持不变,s根据询问而改变。因此每次需要进行交换的数的位置是相同的,只需要检验s变更后,操作能否满足交换需求与否。故创建需数组need,预处理need,need[i]>0表示p[i]!=i,需要进行交换;创建哈希集合not_ok_pos表示在该位置是交换需求无法满足。
    (need数组进行差分处理,因为当需要交换的数中间间隔多个数字时,则要保证左右两个需要的数字及中间数字都能进行交换,即从i->j,need[i]->need[j]都要处理,差分简化操作)

  • 关于s的操作,当s[i]满足以下条件 s[i]->s[i+1] 或者 s[i]<-s[i-1] 或者 s[i]<->s[i+1]),才能交换,但是前二者,只是单向意愿的满足,若将是s[i]->s[i+1]中是s[i]='R'变为'L'指向左边则不能交换,第二个式子同理。

  • 预处理not_ok_pos数组,当最开始输入的操作不能满足需要交换的数的需求时,将该位置添加进哈希表中。

  • 处理询问:输入是s中反转的位置,反转当前s[x]会对左右相邻的数可交换性产生影响,故需要根据左右两边是否有需求进行s[i]反转后的操作检验。

    1. need[x-1]>1,需要操作。反转后,若原来当前位不能交换,即s[x-2]<-s[x-1],s[x]->s[x+1],反转后,是s[x-1]<-s[x],可以交换,满足条件,将x-1从not_ok_pos中删去;若原来当前位置能交换,s[x-1]<-s[x],变为,s[x]->s[x+1],不能交换,将x-1添加到not_ok_pos;
      2.与上面同理。
      3.若not_ok_pos不为空,即操作后仍然存在怕p[i]!=i,输出NO;为空,输出YES;

代码如下:

#include <bits/stdc++.h>
using namespace std;

const int N = 2e5 + 10;

#define fi first
#define se second
#define ll long long
#define pii pair<int, int>

bool ok(char l, char r) {
    return l == 'R' || r == 'L';
}

int a[N], q, n, need[N];
char s[N];

void solve() {
    set<int> not_ok_pos;
    vector<pii> v;
    for (int i = 1; i <= n; i++) need[i] = 0;

    cin >> n >> q;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        if (i == a[i]) continue;
        int u = i, v = a[i];
        if (u > v) swap(u, v);
        need[u]++, need[v]--; // 差分
    }

    for (int i = 1; i <= n; i++) need[i] += need[i - 1];

    for (int i = 1; i <= n; i++) cin >> s[i];

    for (int i = 1; i < n; i++) {
        if (need[i] && !ok(s[i], s[i + 1])) not_ok_pos.insert(i);
    }

    while (q--) {
        int x;
        cin >> x;

        if (need[x - 1]) {
            if (!ok(s[x - 1], s[x])) not_ok_pos.erase(x - 1);
            if (ok(s[x - 1], s[x]) && s[x - 1] == 'L') not_ok_pos.insert(x - 1);
        }

        if (need[x]) {
            if (!ok(s[x], s[x + 1])) not_ok_pos.erase(x);
            if (ok(s[x], s[x + 1]) && s[x + 1] == 'R') not_ok_pos.insert(x);
        }

        if (s[x] == 'L')
            s[x] = 'R';
        else
            s[x] = 'L';

        if (not_ok_pos.size()) {
            cout << "NO" << endl;
        } else {
            cout << "YES" << endl;
        }
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int t = 1;
    cin >> t;
    while (t--) { solve(); }
    return 0;
}

标签:ok,QED,--,题解,交换,pos,int,need
From: https://www.cnblogs.com/07bit/p/18496616

相关文章

  • 手把手教你如何下载有道领世上面已购买的视频课程
    前言:很多小伙伴都想知道有道领世的视频课程怎么下载,但是有道领世上面已购买的视频课程是不提供直接下载方式的,所以下面就教大家如何用学无止下载器下载有道领世上面已购买的视频课程。一、下载器首页输入Y回车,进入有道领世课程下载,然后再输入Y回车登录有道账号二、此时会有弹窗......
  • 【JNPF】关于数据授权
     一、平台设置流程可以参考官方视频的设置:https://www.bilibili.com/video/BV1cE4HexEfZ1、先进入系统管理- 系统菜单,选择应用后点击【菜单管理】: 2、对应展示的每个菜单,选择【数据权限】: 3、业务数据权限配置一、配置数据源连接,选择业务对应的数据源二、配置字段......
  • 高效实现仓库与财务系统数据集成
    仓库旺店通同步金蝶:实现高效数据集成在企业信息化管理中,数据的准确性和时效性至关重要。本文将分享一个实际案例,展示如何通过数据集成平台,实现旺店通·企业奇门的数据无缝对接到金蝶云星空系统。本次集成方案名为“仓库旺店通同步金蝶”,旨在确保仓库管理数据能够快速、准确地传递......
  • CIM+全场景应用,铸就智慧城市发展新篇
    在数字化浪潮的推动下,智慧城市建设正成为全球城市发展的新趋势。而CIM(城市信息模型)作为智慧城市建设的核心,正以其强大的数据集成和分析能力,引领着城市发展的新篇章。今天,让我们一起探讨CIM+全场景应用如何助力智慧城市的建设。1.CIM的定义与重要性CIM是一种集成......
  • 【故障公告】数据库服务器 CPU 100% 造成全站故障
    非常抱歉,今天下午16:03~16:33期间,我们使用的阿里云RDS实例(SQLServer2016标准版,16核32G)出现CPU100%问题,造成全站无法正常访问,由此给您带来很大的麻烦,请您谅解。发现故障后,我们通过阿里云RDS控制台进行了主备切换,由于CPU被占太满,主备切换失败,然后尝试重启实例,重启后......
  • 招聘爬虫工程师(20-30k)
    岗位职责:1、负责设计、开发、维护爬虫系统;2、参与多平台信息的抓取和分析;3、建立完整的数据获取、解析、入库和监控流程,并不断优化迭代完善;4、设计爬虫反屏蔽规则,提升网页抓取的效率和质量;5、利用主流的大数据相关技术,对抓取后的网页数据进行清洗、存储等;并持续优化平台,......
  • 【Vulnhub靶场】DC-1
    DC-1靶场下载链接:https://download.vulnhub.com/dc/DC-1.zip目标本机IP:192.168.118.128靶机IP:192.168.118.0/24信息收集通过nmap扫存活主机,得到目标ip,扫出其端口信息及服务nmap-sP192.168.118.0/24nmap-p-192.168.118.138nmap-sV-A192.168.118.138这里......
  • 【CryptoJS】解密/加密
    解密/加密方法:Decrypt,EncryptimportCryptoJSfrom'crypto-js';//引用AES源码jsimportmomentfrom'moment';//constCryptoJS=require('crypto-js')constkey=CryptoJS.enc.Utf8.parse('dPCtSgMDTKAgWjY1');//十六位十六进制数作为密钥......
  • 二、KNN算法详解
    KNN算法详解前言一、KNN算法思想二、实现步骤2.1收集数据2.2准备数据2.3选择K值2.4计算距离2.5找到最近的邻居2.6决策三、关键要素(细节)3.1K值的选择3.2距离的计算3.2.1欧氏距离3.2.2曼哈顿距离3.2.3切比雪夫距离3.2.4闵氏距离3.3决策规则四、API介绍4.......
  • 《Python游戏编程入门》注-第3章2
    《Python游戏编程入门》的“3.2.2获取用户输入”部分介绍了input()函数的用法;“3.2.3异常处理”部分介绍了try...except语句的用法。1input()函数的用法input()函数用于接受用户的输入,该函数的参数可以在等待用户输入之前显示文本。该函数主要有两种用法:第一个是将当前程......