简述题意 给你N个数对 表示坐标与状态(0/1), M个操作,给定一个区间,区间内的坐标的状态翻转

思路:看到区间修改,很容易想到差分,对数对sort,每个a_i与a_i-1异或构造差分数组b,每次对[l,r]区间操作时,只需要将b[l]与b[r+1]对1异或操作就行了

那么我们如何判断哪些操作需要选择呢,我们可以将每一段有关联的区间操作连边建树,我们知道,当某个点为1时,要异或为0必须操作奇数次,统计每一组操作中差分数组为1的情况,如果有偶数个差分数组为1的情况,那么一定能使每个点变为0,因为每次操作能且只能操作2个点,2个点配对为一组

那我们如何建呢,用并查集建一个生成树,统计每一棵树上的个数到树根上,这样判断树根就可以判断是否有解

如果有解,那我们从每一个树根出发跑dfs,对每个点,如果其子树(包括自己)的差分数组为1的个数为奇数,那么该点就必须进行一次操作,将他与他的父节点转变一次,使得其子树的差分数组为1的个数为偶数,那么必定通过操作将每个点化为0,有点类似点分治找重心的过程,使用后序操作,保证每一个点最后都是0,因为每个点的siz为奇数的话,其子树节点已经全为0,他自身就需要改变,siz为偶数的话,他就是一个与其他奇数节点配对的点,不需要改变,或者说他是配对的1,也就是不需要操作,举个小例子,1-1 0-1,第一个的前驱不需要改变,第二个的需要

#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) ((x)&(-x))
typedef pair<int, int> pii;
typedef long long LL; const int maxm = 1e5+; vector<pii> G[maxm];
vector<int> ans;
pii a[maxm];
int b[maxm], pos[maxm], cnt[maxm], siz[maxm], fa[maxm]; int Find(int x) {
return fa[x] == x?x:fa[x] = Find(fa[x]);
} void dfs(int u, int fa, int id) {
siz[u] = b[u];
for(auto i : G[u]) {
int v = i.first;
if(v == fa) continue;
dfs(v, u, i.second);
siz[u] += siz[v];
}
if(siz[u] & ) ans.push_back(id);
} void run_case() {
int n, m;
cin >> n >> m;
for(int i = ; i <= n; ++i) cin >> a[i].first >> a[i].second;
sort(a+, a++n);
for(int i = ; i <= n; ++i) pos[i] = a[i].first;
for(int i = ; i <= n+; ++i) {
fa[i] = i;
b[i] = a[i].second ^ a[i-].second;
}
for(int i = ; i <= m; ++i) {
int l, r, tl, tr;
cin >> l >> r;
l = lower_bound(pos+, pos++n, l) - pos;
r = upper_bound(pos+, pos++n, r) - pos;
tl = Find(l), tr = Find(r);
if(tl == tr) continue;
fa[tl] = tr;
G[l].push_back(make_pair(r, i));
G[r].push_back(make_pair(l, i));
}
for(int i = ; i <= n+; ++i) if(b[i]) cnt[Find(i)]++;
for(int i = ; i <= n+; ++i)
if(Find(i) == i && (cnt[i]&)) {
cout << "-1";
return;
}
for(int i = ; i <= n+; ++i) {
if(Find(i) == i) dfs(i, , );
}
sort(ans.begin(), ans.end());
cout << ans.size() << "\n";
for(auto i : ans) cout << i << " ";
} int main() {
ios::sync_with_stdio(false), cin.tie();
//cout.setf(ios_base::showpoint);cout.precision(8);
run_case();
cout.flush();
return ;
}

ABC155F - Perils in Parallel的更多相关文章

  1. .Net多线程编程—System.Threading.Tasks.Parallel

    System.Threading.Tasks.Parallel类提供了Parallel.Invoke,Parallel.For,Parallel.ForEach这三个静态方法. 1 Parallel. ...

  2. Java 8函数编程轻松入门(五)并行化(parallel)

    1.并发与并行的区别 并发: 一个时间段内有几个程序都处于已启动到运行完毕之间,且这几个程序都是在同一个处理机上运行.但在任一个时刻点只有一个程序在处理机上运行 并行: 在同一个时刻,多核处理多个任务 ...

  3. Parallel并行之乱用

    关于Parallel我也不细说了,一则微软封装的很好用,二来介绍这个的遍地都是. 我要说的是,要想成为一个优秀的标题党,一定要把重点放到别的地方,为了节省大家阅读时间,我先把结论说了,然后再慢慢从头说 ...

  4. 代码的坏味道(12)——平行继承体系(Parallel Inheritance Hierarchies)

    坏味道--平行继承体系(Parallel Inheritance Hierarchies) 平行继承体系(Parallel Inheritance Hierarchies) 其实是 霰弹式修改(Sho ...

  5. 多线程之任务: Task 基础, 多任务并行执行, 并行运算(Parallel)

    Task - 基于线程池的任务(在 System.Threading.Tasks 命名空间下) 多 Task 的并行执行 Parallel - 并行计算(在 System.Threading.Task ...

  6. Parallel.Foreach

    随着多核时代的到来,并行开发越来越展示出它的强大威力! 使用并行程序,充分的利用系统资源,提高程序的性能.在.net 4.0中,微软给我们提供了一个新的命名空间:System.Threading.Ta ...

  7. 在Parallel中使用DbSet.Add()发现的一系列多线程问题和解决过程

    发现问题 需求很简单,大致就是要批量往数据库写数据,于是打算用Parallel并行的方式写入,希望能利用计算机多核特性加快程序执行速度.想的很美好,于是快速撸了类似下面的一串代码: using (va ...

  8. Intel.parallel.studio.xe.2015.Update.2.ISO-TBE 下载

    磁力链下载点我 还有linux版本 Intel.parallel.studio.xe.2015.Update.1.LINUX.ISO-TBE 收集自网络,要跨请跨原作者,谢谢.

  9. Parallel并行编程初步

    Parallel并行编程可以让我们使用极致的使用CPU.并行编程与多线程编程不同,多线程编程无论怎样开启线程,也是在同一个CPU上切换时间片.而并行编程则是多CPU核心同时工作.耗时的CPU计算操作选 ...

随机推荐

  1. Django框架之ORM的相关操作之分页(六)

    分页是每个项目必不可少要写的一个功能,该篇文章就将记录一下使用ORM写分页的过程. 假设我们的数据库里面需要显示一些数据,而这个表中的数据大约有几千条数据,那么我们不可能将所有的数据都显示出来,那么就 ...

  2. 13,viewport

    set viewport:~是一种函数,功能是为图形输出设置当前视口. 怎样处理移动端1px被渲染成2px的问题(略)

  3. excel表格 筛选 通过mysql语句

    1.整理excel表格的数据 类似的 前面有其他符号的 都可以处理. 注意下一步是2个操纵:分别设置左右: 结果: 2.在复制粘贴到excel的时候,会有一些数字被设置成了科学计数法, 例如复制到ex ...

  4. Fedora以root用户自动登陆

    目录 Fedora以root用户自动登陆 参考 配置自动登陆 Fedora以root用户自动登陆 Fedora Workstation Version: 31

  5. C++基础之迭代器iterator

    C++基础之迭代器iterator 我们已经知道可以使用下标运算符来访问string对象的字符或vector对象的元素,还有另一种更通用的机制也可以实现同样的目的,这就是迭代器(iterator). ...

  6. Spring Boot 2.x 入门前的准备-IntelliJ IDEA 开发工具的安装与使用

    常用的用于开发 spring boot 项目的开发工具有 eclipse 和 IntelliJ IDEA 两种,最近有声音提出 visual code 也开始流行开发 java,而且确实如此, vs ...

  7. webpack使用devtool :source map插件

    链接 : https://www.cnblogs.com/chris-oil/p/8856020.html

  8. 关于null和空指针异常

    1,null是一个标识符,用来表示不确定的对象,可以将null赋给引用类型变量,但不可以将null赋给基本类型变量 2,null本身不是对象,也不是object的实例,也不知道是什么类型 3,对于集合 ...

  9. 吴裕雄--天生自然Numpy库学习笔记:Numpy 数组操作

    import numpy as np a = np.arange(8) print ('原始数组:') print (a) print ('\n') b = a.reshape(4,2) print ...

  10. UI UED设计

    Element: https://element.eleme.cn/#/zh-CN/guide/design