首页 > 其他分享 >CF1168C And Reachability 题解 线性dp

CF1168C And Reachability 题解 线性dp

时间:2023-03-24 10:36:13浏览次数:54  
标签:下标 19 int 题解 ++ Reachability go last CF1168C

题目链接

https://codeforces.com/problemset/problem/1168/C

题目大意

给定一个数组 \(a\),从下标 \(x\) 能够转移到下标 \(y\) 要满足 \(x \lt y\) 且 \(a_{p_i}\, \&\, a_{p_{i+1}} > 0\),其中 \(\&\) 表示逻辑与。多次询问,每次询问给出 \(x\) 和 \(y\),你需要回答出能够通过若干次转移从下标 \(x\) 到达下标 \(y\)。

解题思路

定义 \(go_{i, k}\) 表示从下标 \(i\) 能够到达的最小的下标 \(j\),且满足 \(a_j\) 的第 \(k\) 位为 \(1\)(这里 \(j \ge i\))。

如何计算它呢?再定义一个 \(last_{i,k}\) 表示满足 \(j \gt i\) 且 \(a_j\) 的第 \(k\) 位为 \(1\) 的最小下标 \(j\)。

可以证明 \(go_{i,k}\) 等于 \(i\) 或者 \(\min{(go_{last_{i,j},k})}\) (其中 \(j\) 对应的是 \(a_i\) 为 \(1\) 的所有那些位)。

所以在 \(O(n \log \max\{a_i\})\) 时间复杂度只能能够求出所有的状态 \(go_{i, k}\)。然后只要对于 \(a_y\) 中为 \(1\) 的任意一位 \(j\) 来说,只要满足 \(go_{x, j} \leq y\) 就能从下标 \(x\) 转移到下标 \(y\)。

示例程序

#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5 + 5;

int n, q, a[maxn], last[19], go[maxn][19];

bool check(int x, int y) {
    for (int i = 0; i < 19; i++)
        if (go[x][i] <= y && (a[y] & (1 << i)))
            return true;
    return false;
}

int main() {
    scanf("%d%d", &n, &q);
    for (int i = 1; i <= n; i++) scanf("%d", a+i);
    for (int i = 0; i < 19; i++) go[n+1][i] = last[i] = n+1;
    for (int i = n; i >= 1; i--) {
        for (int j = 0; j < 19; j++)
            go[i][j] = n + 1;
        for (int j = 0; j < 19; j++) {
            if (a[i] & (1 << j)) {
                for (int k = 0; k < 19; k++) {
                    go[i][k] = min(go[i][k], go[ last[j] ][k]);
                }
                last[j] = i;
                go[i][j] = i;
            }
        }
    }
    while (q--) {
        int x, y;
        scanf("%d%d", &x, &y);
        puts(check(x, y) ? "Shi" : "Fou");
    }
    return 0;
}

参考资料

https://codeforces.com/blog/entry/67241

标签:下标,19,int,题解,++,Reachability,go,last,CF1168C
From: https://www.cnblogs.com/quanjun/p/17250513.html

相关文章

  • P3489 [POI2009]WIE-Hexer 题解
    一、题目描述:大陆上有 n 个村庄,m 条双向道路,p 种怪物,k 个铁匠,铁匠都在一个村庄里,他可会给你打造他所能打造的所有剑,特定的剑可以对付特定的怪物,每条道路上都可......
  • P4221 [WC2018]州区划分 题解
    题目链接题目描述给出\(n\)个城市,\(m\)条边,一个划分合法当且仅当所有划分中的点集和集合中点之间存在的边集所构成的图不构成欧拉回路且联通。定义一个点集的值为......
  • 【ACM算法竞赛日常训练】DAY1题解与分析
    DAY1共四题:月月查华华的手机:https://ac.nowcoder.com/acm/problem/23053RinneLovesEdges:https://ac.nowcoder.com/acm/problem/22598逆序对:https://ac.nowcoder.com......
  • CF1630E 题解
    题意传送门一个长度为$n$的环状序列${a_i}$,其中的数值满足$1\leqa_i\leqn$,序列中可能有相等的数。序列${a_i}$的一个排列和另外一个排列本质相同,当且......
  • LDAP - 题解【模拟】
    题面该题为CCF-CSP认证考试真题,试题编号为202303-3。我参加了这次CSP认证(虽然说认证成绩没有达到预期emmm),原题链接见:202303-3。下面搬运题面如下:题目背景西西艾弗岛运营......
  • Nacos 2.2.1 版本下载启动报错问题解决
    先上错误问题这个报错我在网上找了~~~每个人都在说五花八门的,接近真相但却不是!!!!!接下来由我补充nacos-server-2.2.1\nacos\bin\startup.cmd文件修......
  • 单链表OJ题解析1
    1.移除链表元素题目链接题目描述 解题思路这道题较好的解法是创建一个新链表,把不等于val的节点链接到一起,然后返回新链表的头结点structListNode*removeEle......
  • 关于airtest无法连接模拟器问题解决思路
    背景:死活打开airtestIDE死活识别不了夜神模拟器。官网下载最新airtest之后,自己电脑Androidsdk是最新的版本,也用adbversion检查了本地版本、夜神模拟器版本。确实发现夜......
  • 微信小程序之wx.getLocation再次授权问题解决
    首先,在page外定义一个公共函数用于发送获取位置的请求vargetLocation=function(that){wx.getLocation({type:'wgs84',success:function(res){......
  • SuperMicro X10SDV 主板 + ESXi 8.0 不认网卡的问题解决
    问题描述超微主板X10SDV:17cm*17cm板载2个万兆电口[email protected](最高2133MHz、最多32GB*4=128GB)内存槽:注意:只支持2R,不支持淘宝上的诸如三星DDR4......