首页 > 其他分享 >洛谷 P5937 [CEOI1999] Parity Game

洛谷 P5937 [CEOI1999] Parity Game

时间:2024-03-27 10:34:04浏览次数:18  
标签:P5937 begin dist int CEOI1999 xx fa Game return

题意:区间长度为n,m个查询。每次查询给出区间与一个数值0或者1,代表区间内的1的个数。找出不矛盾的最后一个询问。

思路:首先用到区间压缩,排序后去重即可。使用带权dsu,如果是同一个root,那么xor运算看是否符合输入。如果不是同一个root,直接合并。这里合并区间的时候权重更新有点抽象,xx合并到yy,使用的是x->xx的权重和y->yy的权重以及设定的op。相较于路径权重是长度时,稍微难理解一点。

class DisjointSet{
public:
    DisjointSet(int sz) : sz_(sz){
        fa_.resize(sz_);
        iota(fa_.begin(), fa_.end(), 0);
        dist_.resize(sz_);
    }

    int findSet(int x){
        updateDist(x);
        return fa_[x];
    }

    bool unionSet(int x, int y, int value){
        int xx = findSet(x);
        int yy = findSet(y);
        if (xx == yy){ return false; }
        fa_[xx] = yy;
        dist_[xx] = dist_[x] ^ dist_[y] ^ value;
        return true;
    }

    int getDist(int x){ updateDist(x); return dist_[x]; }


private:
    vector<int> fa_;
    vector<int> dist_;
    int sz_;

    inline void updateDist(int x){
        if (fa_[x] == x) { return; }
        int parent = fa_[x];
        fa_[x] = findSet(parent);
        dist_[x] ^= dist_[parent];
        return;
    }
};

void solve(){
    int n, m;
    cin >> n >> m;

    set<int> sett;
    vector<pair<int, int>> a(m);
    vector<int> op(m);
    vector<int> b(2 * m, 0);
    for (int i = 0; i < m; ++i){
        cin >> a[i].first >> a[i].second;
        string s;
        cin >> s;
        op[i] = static_cast<int>(s[0] == 'o');
        b[i * 2] = a[i].first;
        b[i * 2 + 1] = a[i].second;
    }

    sort(b.begin(), b.end());
    b.erase(unique(b.begin(), b.end()), b.end());

    DisjointSet dsu(b.size() + 1);
    int index = 0;
    for (int i = 0; i < m; ++i){
        const auto& [x, y] = a[i];
        int l = lower_bound(b.begin(), b.end(), x - 1) - b.begin();
        int r = lower_bound(b.begin(), b.end(), y) - b.begin();
        if (dsu.unionSet(l, r, op[i])){
            continue;
        }
        else if ((dsu.getDist(l) ^ dsu.getDist(r)) != op[i]){
            cout << i << '\n';
            return;
        }
    }

    cout << m << endl;
}

标签:P5937,begin,dist,int,CEOI1999,xx,fa,Game,return
From: https://www.cnblogs.com/yxcblogs/p/18098367

相关文章

  • Galgame 引擎免封包略谈
    Galgame引擎免封包略谈关于免封包现在的Gal引擎解包工具是比较全的,基本上很多引擎你或多或少都能找到解包的工具、源码。虽然有些并非全自动,甚至需要找密钥,但是总的来说99%的Gal引擎基解包本是不成问题的。那么对于汉化或者别的操作来说,封包,或是说让游戏读取我们修改过的文件,......
  • Windows 10无法登录Xbox及其附属产品(包括但不限于Game Bar,Minecraft Launcher)
     1. 问题描述:打开Xbox(如下图) 或GameBar(如下图)  后,单击登录,会弹出一个窗口,印有自己账户的头像,下方一行小字“欢迎回来,$昵称$”,如下图所示:  单击唯一的绿色按钮“现在就开始吧”,该窗口消失,马上又回到点击登录前的界面。循环尝试结果都不变。2.解决方法第一步......
  • CF1943E2 MEX Game 2 (Hard Version)
    CF1943E2MEXGame2(HardVersion)更好的阅读体验好难啊好难啊好难啊,完全想不到QAQ。显然满足单调性,进行二分答案\(mid\),表示答案在双方最优策略下能否达到\(mid\)。Alice的策略很简单,每次选取\([0,mid-1]\)中\(f\)最小的没有选过的元素即可。而Bob应当尽量把操......
  • CF1628D1 Game on Sum (Easy Version) 题解
    题目传送门(EasyVersion)|题目传送门(HardVersion)前置知识博弈论解法CF1628D1GameonSum(EasyVersion)设\(x_{i}\)表示第\(i\)轮时Alice选择的数。设\(f_{i,j}\)表示已经进行了\(i\)轮,且使用了\(j\)次加法时的最大得分,状态转移方程为\(f_{i,j}=\ma......
  • 一个pygame小练习
    如果不想看过程,可直接跳到结尾有完整代码游戏截图:第一部分代码#最开始的方框矩形代码importpygamepygame.init()win=pygame.display.set_mode((500,500))pygame.display.set_caption("FirstGame")x=50y=50width=40height=60vel=5isJump=False......
  • 「ABC221D」 Online games
    题意给\(n\)组整数\(a_i\)和\(b_i\),表示有一个人在\([a_i,a_i+b_i)\)登录。求\(\forallk\in[1,n]\),有\(k\)个玩家登录的天数。分析很明显的差分,但是因为\(a_i,b_i\le10^9\),不能直接开差分数组。注意到\(n\le2\times10^5\),所以可以用pair数组代替差分数组,......
  • 使用Pygame做一个乒乓球游戏
    项目介绍使用Pygame做一个乒乓球游戏。左侧为电脑,右侧为玩家。视频地址-YT视频搬运-B站视频教程约90分钟。代码地址环境:需要pygame库,可用pip安装:pipinstallpygame1.基础版本首先进行一些初始化,初始化pygame以及物体的初始状态。然后是主循环,游戏的主循环主要......
  • python27安装pygame
    参考:https://cloud.tencent.com/developer/article/2089701我安装的是1.9.3版本https://pypi.org/project/pygame/1.9.3/#files按照自己本地的环境下载,比如我的是python27,windows64,我安装的就是 pygame-1.9.3-cp27-cp27m-win_amd64.whl安装命令:pipinstallxxxx.whl 试......
  • python/pygame坦克游戏边学边写笔记(六)
    一、给玩家坦克一个脆弱的家测试玩了一下,才发现玩家的家还没安排。1、载入家的图片。2、地图字典索引,生命值设为1,生命脆弱哦。3、wall_map方法中设定家的位置。ifdata.iloc[row,colum]=='家':wall_type='home'......
  • D. Rudolf and the Ball Game
    题解:模拟+去重每一次扔球都将所有可能性加入队列,并设为一层;然后将一层的可能性挨个出列并进行 ((qj+ri−1) mod n+1),((qj−ri−1+n) mod n+1)操作,然后去重后入列。code #include<bits/stdc++.h>usingnamespacestd;constintN=2e5+5;inta[N],b[1005];intmain()......