题目大意:给出一张有向图,保证任何时候边都是从编号大的向编号小连。两个操作:

  1. $1\;l\;r:$表示若编号在区间$[l,r]$内的点被染色了,问至少还需要染多少个点才可以使得整张图被染色。一个点会被染色的要求是:要么直接被染色,要么它所连向的点中至少一个被染色
  2. $2\;l\;r\;x:$表示编号在区间$[l,r]$中的所有点都向$x$连一条边,保证$x<l$

题解:发现这张图是一个$DAG$,然后只要把所有出度为$0$的点染色就一定可以把所有点染色。

于是就记录每个点是否出度为$0$,询问是区间$[1,l)\cup(r,n]$中出度为$0$的点的个数,修改就把区间$[l,r]$中出度为$0$的点改为非$0$。可以用线段树维护

卡点:

C++ Code:

#include <cstdio>
#include <cctype>
namespace std {
struct istream {
#define M (1 << 24 | 3)
char buf[M], *ch = buf - 1;
inline istream() {
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
fread(buf, 1, M, stdin);
}
inline istream& operator >> (int &x) {
while (isspace(*++ch));
for (x = *ch & 15; isdigit(*++ch); ) x = x * 10 + (*ch & 15);
return *this;
}
#undef M
} cin;
struct ostream {
#define M (1 << 23 | 3)
char buf[M], *ch = buf - 1;
inline ostream& operator << (int x) {
if (!x) {
*++ch = '0';
return *this;
}
static int S[20], *top; top = S;
while (x) {
*++top = x % 10 ^ 48;
x /= 10;
}
for (; top != S; --top) *++ch = *top;
return *this;
}
inline ostream& operator << (const char x) { *++ch = x; return *this; }
inline ~ostream() {
#ifndef ONLINE_JUDGE
freopen("output.txt", "w", stdout);
#endif
fwrite(buf, 1, ch - buf + 1, stdout);
}
#undef M
} cout;
} #define maxn 300010
int n, m;
bool notice[maxn]; namespace SgT {
bool tg[maxn << 2];
int V[maxn << 2];
void build(int rt, int l, int r) {
if (l == r) {
V[rt] = !notice[l];
return ;
}
int mid = l + r >> 1;
build(rt << 1, l, mid), build(rt << 1 | 1, mid + 1, r);
V[rt] = V[rt << 1] + V[rt << 1 | 1];
} int L, R;
inline void pushdown(int rt) {
V[rt << 1] = V[rt << 1 | 1] = 0;
tg[rt << 1] = tg[rt << 1 | 1] = true;
tg[rt] = false;
}
void __modify(const int rt, const int l, const int r) {
if (L <= l && R >= r) {
V[rt] = 0;
tg[rt] = true;
return ;
}
if (tg[rt]) pushdown(rt);
const int mid = l + r >> 1;
if (L <= mid) __modify(rt << 1, l, mid);
if (R > mid) __modify(rt << 1 | 1, mid + 1, r);
V[rt] = V[rt << 1] + V[rt << 1 | 1];
}
void modify(const int __L, const int __R) {
L = __L, R = __R;
__modify(1, 1, n);
} int res;
void __query(const int rt, const int l, const int r) {
if (L <= l && R >= r) {
res += V[rt];
return ;
}
if (tg[rt]) pushdown(rt);
const int mid = l + r >> 1;
if (L <= mid) __query(rt << 1, l, mid);
if (R > mid) __query(rt << 1 | 1, mid + 1, r);
}
int query(const int __L, const int __R) {
if (__L > __R) return 0;
L = __L, R = __R, res = 0;
__query(1, 1, n);
return res;
}
} int main() {
std::cin >> n >> m;
for (int i = 1, k; i <= n; ++i) {
std::cin >> k;
for (int j = 0, x; j < k; ++j) std::cin >> x, notice[x] = true;
}
SgT::build(1, 1, n);
while (m --> 0) {
static int op, l, r, x;
std::cin >> op >> l >> r;
if (op == 1) std::cout << SgT::query(1, l - 1) + SgT::query(r + 1, n) << '\n';
else std::cin >> x, SgT::modify(l, r);
}
return 0;
}

  

[洛谷P5166]xtq的口令的更多相关文章

  1. [洛谷P1709] 隐藏的口令

    问题描述 有时候程序员有很奇怪的方法来隐藏他们的口令.Binny会选择一个字符串S(由N个小写字母组成,5<=N<=5,000,000),然后他把S顺时针绕成一个圈,每次取一个做开头字母并 ...

  2. [洛谷P5169]xtq的异或和

    题目大意:给你一张$n(n\leqslant10^5)$个点$m(m\leqslant3\times10^5)$条边的无向图,每条边有一个权值,$q(q\leqslant2^{18})$次询问,每次询 ...

  3. P5166 xtq的口令

    传送门 这题要是搞懂在干什么其实不难(虽然某个花了几个小时才搞明白的家伙似乎没资格这么说--) 假设所有人都没有听到老师的命令,我们从左到右考虑,对于当前的人,如果它没有观察者,那么肯定要让它听到老师 ...

  4. [洛谷P1709] [USACO5.5]隐藏口令Hidden Password

    洛谷题目链接:[USACO5.5]隐藏口令Hidden Password 题目描述 有时候程序员有很奇怪的方法来隐藏他们的口令.Binny会选择一个字符串S(由N个小写字母组成,5<=N< ...

  5. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  6. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  7. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  8. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

  9. 洛谷P1710 地铁涨价

    P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交  讨论  题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...

随机推荐

  1. OpenCV 3.2 Tracking 物体跟踪

    跟踪就是在连续视频帧中定位物体,通常的跟踪算法包括以下几类: 1. Dense Optical Flow 稠密光流 2. Sparse Optical Flow 稀疏光流 最典型的如KLT算法(Kan ...

  2. 4、Java并发编程:synchronized

    Java并发编程:synchronized 虽然多线程编程极大地提高了效率,但是也会带来一定的隐患.比如说两个线程同时往一个数据库表中插入不重复的数据,就可能会导致数据库中插入了相同的数据.今天我们就 ...

  3. LWM2M简介-学习记录

    1. Lightweight M2M 基础,谁搞出来的 OMA是一家国际组织,因为物联网的兴起, OMA在传统的OMA-DM协议基础之上,提出了LWM2M协议.这个协议基于COAP协议,COAP协议基 ...

  4. leetcode笔记--7 Find the Difference

    question: Given two strings s and t which consist of only lowercase letters. String t is generated b ...

  5. Python对象引用问题总结

    对于对象引用问题,一直是一知半解的状态,现整理以备使用. 操作不可变对象进行加减运算时,会在内存中创建新的不可变实例,不会影响原来的引用>>> c=12>>> d= ...

  6. Python Road

    引子 雁离群兮不知所归,路遥远兮吾将何往   Python Road[第一篇]:Python简介 Python Road[第二篇]:Python基本数据类型 Python Road[第三篇]:Pyth ...

  7. 「日常训练」Caterpillar(POJ-3310)

    题意与分析 一条很有趣的题目.给一个无向图,问它是否无环,且可以在上面找到一条线,使所有的顶点要么在线上要么不在线上但在与线相连的边上. 那么首先要确定所有点联系在一起.这个可以同判环一起处理:如果建 ...

  8. Windows运行机理——窗口句柄和消息

    Windows运行机理这系列文章都是来至于<零基础学Qt4编程>——吴迪,个人觉得写得很好,所以进行了搬运和个人加工 现在我们将消息与句柄联系起来.假如有一个窗口,且拥有该窗口的一个句柄( ...

  9. 四分树 (Quadtrees UVA - 297)

    题目描述: 原题:https://vjudge.net/problem/UVA-297 题目思路: 1.依旧是一波DFS建树 //矩阵实现 2.建树过程用1.0来填充表示像素 #include < ...

  10. Android开发-API指南-<path-permission>

    <path-permission> 英文原文:http://developer.android.com/guide/topics/manifest/path-permission-elem ...