热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Paritygame(poj1733)题解及思路分析

本文是对题目"Paritygame(poj1733)"的解题思路进行分析。题目要求判断每次给出的区间内1的个数是否和之前的询问相冲突,如果冲突则结束。本文首先介绍了离线算法的思路,然后详细解释了带权并查集的基本操作。同时,本文还对异或运算进行了学习,并给出了具体的操作步骤。最后,本文给出了完整的代码实现,并进行了测试。
Parity game(poj1733)

在这里插入图片描述
在这里插入图片描述

题意:

有以个串,每次给出【i,j】之间的1的个数,
有m次询问,判断当前询问是否和之前的询问相冲突,冲突就break。

思路:

由于本题的区间范围有点大,所以要先离线。

  1. 本每次输入的左右区间依次存入一个 数组 中。
  2. 之后把重复的出现去掉unique(为了后面的二分查找)
  3. 之后就是带权并查集的基本操作,
  4. 本题的dis【】稍微改变一下,就可以了(本题even为0,odd为1)
  5. 所以find中的dis

dis[x]^=dis[f[x]];

  1. merge中的

f[A]=B;dis[A]=dis[x]^dis[y]^p[i].op;

反思


  1. 离线的学习。

For(i,1,q){int l,r;char s[10];scanf("%d%d%s", &l, &r, s);p[i].l=a[++cnt]=l-1;p[i].r=a[++cnt]=r;p[i].op=(s[0]=='o')?1:0;}

离线后之后直接访问第几个即可。
2. 异或运算的学习。
本题的操作和异或运算给很像
本题的路径并不是dis[A]=dis【b】- dis【a】+ x;

因为:

odd+odd=even;
odd-odd=even;
even+even=even;
even-even=even;
odd+even=odd;
odd-even=odd;
所以无关加减了,直接异或走起

AC

#include
#include
#include
#define For(i,x,y) for(register int i&#61;(x); i<&#61;(y); i&#43;&#43;)
using namespace std;
const int maxn&#61;1e4&#43;10;
struct point
{int l,r;int op;
}p[maxn];
int f[maxn<<1], dis[maxn<<1], a[maxn<<1],cnt,n,q,x;
int find(int x)
{if(x&#61;&#61;f[x])return x;int root&#61;find(f[x]);dis[x]^&#61;dis[f[x]];return f[x]&#61;root;
}
int main()
{scanf("%d", &n);scanf("%d", &q);For(i,1,q){int l,r;char s[10];scanf("%d%d%s", &l, &r, s);p[i].l&#61;a[&#43;&#43;cnt]&#61;l-1;p[i].r&#61;a[&#43;&#43;cnt]&#61;r;p[i].op&#61;(s[0]&#61;&#61;&#39;o&#39;)?1:0;}For(i,1,2*q)f[i]&#61;i;// For(i,1,n)cout<int ans&#61;0;sort(a&#43;1,a&#43;1&#43;cnt);n&#61;unique(a&#43;1,a&#43;1&#43;cnt)-(a&#43;1);//cout<For(i,1,q){ans&#61;i;//cout<int x&#61;lower_bound(a&#43;1,a&#43;1&#43;n,p[i].l)-a-1;int y&#61;lower_bound(a&#43;1,a&#43;1&#43;n,p[i].r)-a-1;// cout<int A&#61;find(x);int B&#61;find(y);if(A&#61;&#61;B){if(dis[x]^dis[y]!&#61;p[i].op){ans--;break;}}else{f[A]&#61;B;dis[A]&#61;dis[x]^dis[y]^p[i].op;}}cout<<ans<<endl;return 0;
}


推荐阅读
  • ED Tree HDU4812 点分治+逆元
    这道题非常巧妙!!!我们进行点分治的时候,算出当前子节点的所有子树中的节点,到当前节点节点的儿子节点的距离,如下图意思就是当前节点的红色节点,我们要求出红色节点的儿子节点绿色节点, ... [详细]
  • 2022年4月15日的算法练习题,包括最长公共子序列和线段树的应用。 ... [详细]
  • 题面:P3178[HAOI2015]树上操作好像其他人都嫌这道题太容易了懒得讲,好吧那我讲。题解:第一个操作和第二个操作本质上是一样的&# ... [详细]
  • ZOJ 2760 - 最大流问题
    题目链接:How Many Shortest Paths。题目描述:给定一个包含n个节点的有向图,通过一个n*n的矩阵来表示。矩阵中的a[i][j]值为-1表示从节点i到节点j无直接路径;否则,该值表示从i到j的路径长度。输入起点vs和终点vt,计算从vs到vt的所有不共享任何边的最短路径数量。如果起点和终点相同,则输出无穷大。 ... [详细]
  • 基于51单片机的多项目设计实现与优化
    本文探讨了基于51单片机的多个项目的设计与实现,包括PID控制算法的开关电源设计、八音电子琴仿真设计、智能抽奖系统控制设计及停车场车位管理系统设计。每个项目均采用先进的控制技术和算法,旨在提升系统的效率、稳定性和用户体验。 ... [详细]
  • 来自FallDream的博客,未经允许,请勿转载,谢谢。一天一套noi简直了.昨天勉强做完了noi2011今天教练又丢出来一套noi ... [详细]
  • 1.打印日历打印日历判断是否是闰年#include<stdio.h>inta[]{0,31,28,31,30,31,30,31,31 ... [详细]
  • 在进行模型和动画的导出过程中,需要注意隐藏不必要的场景元素,并确保所需导出的对象位于顶级节点。此外,在导出设置中正确选择节点配置,并为带有动画的对象添加Animator控制器组件,以确保动画能够正常播放。 ... [详细]
  • 本文探讨了如何利用数组来构建二叉树,并介绍了通过队列实现的二叉树层次遍历方法。通过具体的C++代码示例,详细说明了构建及打印二叉树的过程。 ... [详细]
  • 本文详细探讨了如何处理包含多种分隔符的字符串分割问题,并提供了一个高效的C++实现方案。 ... [详细]
  • 本题要求计算从起点到终点所有最短路径的总权重,使用SPFA算法进行求解。 ... [详细]
  • 深入解析mt_allocator内存分配器(二):多线程与单线程场景下的实现
    本文详细介绍了mt_allocator内存分配器在多线程和单线程环境下的实现机制。该分配器以2的幂次方字节为单位分配内存,支持灵活的配置和高效的性能。文章分为内存池特性描述、内存池实现、单线程内存池实现、内存池策略类实现及多线程内存池实现等部分,深入探讨了内存池的初始化、内存分配与回收的具体实现。 ... [详细]
  • 深入解析C++ Atomic编程中的内存顺序
    在多线程环境中,为了防止多个线程同时修改同一数据导致的竞争条件,通常会使用内核级同步对象,如事件、互斥锁和信号量等。然而,这些方法往往伴随着高昂的上下文切换成本。本文将探讨如何利用C++11中的原子操作和内存顺序来优化多线程编程,减少不必要的开销。 ... [详细]
  • 本文将作为我硕士论文的一部分,但鉴于其内容的独特性和趣味性,决定单独发布。文中将定义一些皮亚诺公理,并介绍如何使用这些公理进行等式替换,以证明定理。 ... [详细]
  • 本文介绍了一种使用链剖分(Link-Cut Tree, LCT)来维护动态树结构的方法,特别是如何通过 LCT 来高效地管理子树的信息,如子树大小等。 ... [详细]
author-avatar
荣媛厉4
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有