简述题意 给你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. idea左侧出现日期和文件大小怎么关闭

    shift+alt+\

  2. javascript中offsetWidth、clientWidth、width、scrollWidth、clientX、screenX、offsetX、pageX

    原文:https://www.cnblogs.com/ifworld/p/7605954.html 元素宽高 offsetWidth //返回元素的宽度(包括元素宽度.内边距和边框,不包括外边距) o ...

  3. python-turtle-画雪花-2种方法及效果的详解

    1.方法一: 代码: #python3.8 #xuguojun #2020.1.30 #导出模块 import turtle as t import random as r #定义画雪 def dra ...

  4. 【转载】巴塞尔问题(Basel Problem)的多种解法

    如何计算 \(\displaystyle \zeta \left ( 2 \right )=\frac{1}{1^{2}}+\frac{1}{2^{2}}+\frac{1}{3^{2}}+\cdots ...

  5. Tomcat笔试题!

    1.企业常见的中间件产品有哪些? 商业:nginx企业版,jobss开源:nginx社区版,tomcat,apache 2.Tomcat软件早期名字及其主要作用? Tomcat的前身为Catalina ...

  6. 不要在mutation回调函数之外,修改vuex仓库里属性的状态

    [vuex] do not mutate vuex store state outside mutation handlers. import * as types from './mutation- ...

  7. [JLOI2009]神秘的生物

    题目链接 题目大意 给定一个\(n*n\)的矩阵,从其中选取恰好一个连通块,使选取的格子所对应的权值和最大. \(n\leq 9\) 解题思路 由于\(n\)特别小,考虑插头dp. 和一般的插头dp不 ...

  8. python基础(二)---第一个程序

    1. 第一个程序 1.1 Hello Python书写步骤 步骤一:新建文本文档文件,修改名称为hello.py 步骤二:使用记事本打开文件,书写程序内容如下: 步骤三:打开命令行,输入执行指令:py ...

  9. JS--easyui通用验证

    // JavaScript Document $.extend($.fn.validatebox.defaults.rules, { Composite_validation: { validator ...

  10. 翻页插件 jquery

    //css <style> * { padding:; margin:; list-style: none; } .wrapper { width: 100%; cursor: point ...