题目描述

有n张卡片在桌上一字排开,每张卡片上有两个数,第i张卡片上,正面的数为a[i],反面的数为b[i]。现在,有m个熊孩子来破坏你的卡片了!
第i个熊孩子会交换c[i]和d[i]两个位置上的卡片。
每个熊孩子捣乱后,你都需要判断,通过任意翻转卡片(把正面变为反面或把反面变成正面,但不能改变卡片的位置),能否让卡片正面上的数从左到右单调不降。

输入

第一行一个n。
接下来n行,每行两个数a[i],b[i]。
接下来一行一个m。
接下来m行,每行两个数c[i],d[i]。

输出

m行,每行对应一个答案。如果能成功,输出TAK,否则输出NIE。

样例输入

4
2 5
3 4
6 3
2 7
2
3 4
1 3

样例输出

NIE
TAK

提示

【样例解释】

交换3和4后,卡片序列为(2,5) (3,4) (2,7) (6,3),不能成功。

交换1和3后,卡片序列为(2,7) (3,4) (2,5) (6,3),翻转第3张卡片,卡片的正面为2,3,5,6,可以成功。

【数据范围】

n≤200000,m≤1000000,0≤a[i],b[i]≤10000000,1≤c[i],d[i]≤n.

线段树合并好题。线段树每个节点维护s[x][0/1][0/1],表示x节点对应区间左/右端点选正/背面区间能否单调不减,每次修改后线段树合并,判断根节点的四种情况是否有合法的就行。

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
inline char _read()
{static char buf[100000],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline int read()
{int x=0,f=1;char ch=_read();while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=_read();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=_read();}return x*f;
}
int n,m;
int x,y;
int s[800010][3][3];
int v[400010][3];
void pushup(int rt,int l,int r)
{int mid=(l+r)>>1;for(int i=0;i<=1;i++){for(int j=0;j<=1;j++){   s[rt][i][j]=0;for(int k=0;k<=1;k++){for(int l=0;l<=1;l++){s[rt][i][j]|=s[rt<<1][i][k]&s[rt<<1|1][l][j]&(v[mid][k]<=v[mid+1][l]);}}}}
}
void build(int rt,int l,int r)
{if(l==r){s[rt][0][0]=s[rt][1][1]=1;return ;}int mid=(l+r)>>1;build(rt<<1,l,mid);build(rt<<1|1,mid+1,r);pushup(rt,l,r);
}
void change(int rt,int l,int r,int k)
{if(l==r){s[rt][0][0]=s[rt][1][1]=1;return ;}int mid=(l+r)>>1;if(k<=mid){change(rt<<1,l,mid,k);}else{change(rt<<1|1,mid+1,r,k);}pushup(rt,l,r);
}
int main()
{n=read();for(int i=1;i<=n;i++){v[i][0]=read();v[i][1]=read();}build(1,1,n);m=read();for(int i=1;i<=m;i++){x=read();y=read();swap(v[x][0],v[y][0]);swap(v[x][1],v[y][1]);change(1,1,n,x);change(1,1,n,y);if(s[1][1][1]|s[1][1][0]|s[1][0][0]|s[1][0][1]){printf("TAK\n");}else{printf("NIE\n");}}return 0;
}

转载于:https://www.cnblogs.com/Khada-Jhin/p/9681661.html

BZOJ3526[Poi2014]Card——线段树合并相关推荐

  1. 线段树合并与分裂维护树上最长上升子序列 + 点分治删点 ---- 2021 牛客多校第一场 C - Cut the tree(详解)

    题目大意: 给你一个树,树上每个点都有一个权值valnodeval_{node}valnode​,路径(u,v)(u,v)(u,v) 上所有点按顺序有序序列,令f(u,v)f(u,v)f(u,v)是这 ...

  2. 线段树分裂与合并 ---- 树上差分 P4556 [Vani有约会]雨天的尾巴 /【模板】线段树合并

    题目链接 解题思路: 首先题目是对u,vu,vu,v这两条路径上面添加一个zzz,然后运用树上点的差分思想,对于分发路径u,vu,vu,v,我们在uuu上+1+1+1,在vvv上+1+1+1,在lca ...

  3. 【线段树合并】解题报告:luogu P4556雨天的尾巴 (树上对点差分 + 动态开点 + 线段树合并)线段树合并模板离线/在线详解

    题目链接:雨天的尾巴 本题本身是一个非常简单的一道树上差分的模板题,但是由于变态的数据范围,我们直接用数组是存不下的(本来使用一颗普通的线段树直接维护最大值即可.但是本题的空间只有128MB,直接按照 ...

  4. 【BZOJ-3681】Arietta 网络流 + 线段树合并

    3681: Arietta Time Limit: 20 Sec  Memory Limit: 64 MB Submit: 182  Solved: 70 [Submit][Status][Discu ...

  5. 【BZOJ5461】 【PKUWC2018】—Minimax(线段树合并优化dp)

    传送门 发现其实就是左右2棵子树,左儿子选到某个值的概率就是 选最大值的概率∗右儿子的值比它小的概率选最大值的概率*右儿子的值比它小的概率选最大值的概率∗右儿子的值比它小的概率 +选最小值的概率∗右儿 ...

  6. [BJWC2018]Border 的四种求法(后缀自动机+链分治+线段树合并)

    题目描述 给一个小写字母字符串 S ,q 次询问每次给出 l,r ,求 s[l..r] 的 Border . Border: 对于给定的串 s ,最大的 i 使得 s[1..i] = s[|s|-i+ ...

  7. CF1037H Security——SAM+线段树合并

    又是一道\(SAM\)维护\(endpos\)集合的题,我直接把CF700E的板子粘过来了QwQ 思路 如果我们有\([l,r]\)对应的\(SAM\),只需要在上面贪心就可以了.因为要求的是字典序比 ...

  8. hdu 5511 Minimum Cut-Cut——分类讨论思想+线段树合并

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5511 题意:割一些边使得无向图变成不连通的,并且恰好割了两条给定生成树上的边.满足非树边两段一定在给定生成 ...

  9. [Vani有约会]雨天的尾巴 (线段树合并)

    题目链接 Solution 树上差分+线段树合并. 在每个节点上维护一棵权值线段树. 然后如果需要修改 \(x,y\) 两点,则在 \(x\) 处和 \(y\) 处分别加上 \(1\) 的权值. 然后 ...

最新文章

  1. Linux那些事儿 之 戏说USB(14)端点
  2. 12.前K个高频元素---使用优先队列和哈希表解决
  3. 获取Http协议的请求行,请求头
  4. 玩转 Tomcat 配置必备的 10 个小技巧!
  5. python多久可以精通_学Python需要多久能学会?精通Python需要多长时间?
  6. python回车换行怎么不行_使用Python编写换行符时避免写入回车'\r'
  7. IDEA如何使用热部署方式启动项目?
  8. jQuery实现手风琴效果
  9. 华为GPON设备ONU常见告警及处理
  10. 华为服务器设置raid0为系统盘,服务器设置raid0
  11. python全栈工程师知识框架_全栈工程师的知识结构
  12. 计算机专业定向选调,兄弟们,关于定向选调和找工作,JR们能不能给小弟一些建议...
  13. VS 可扩展性开发(九):总结篇
  14. 怎么把PicPick设置成中文版?
  15. 论文《Dialogue State Tracking with a Language Model using Schema-Driven Prompting》学习笔记
  16. 图像标签 链接标签
  17. U3D-3D MAX Biped导出.fbx到Unity的Humanoid的骨架不匹配(Disable Triangle Pelvis, Enable Triangle Neck)
  18. 从Android代码中来记忆23种设计模式
  19. 分布式链路追踪Jaeger快速入门-01
  20. 55、【图】Dijkstra求最短路径(单源最短路径+边权重为正数)(C/C++版)

热门文章

  1. PHP 正则表达式 最后总结
  2. 大学开设python课程吗_在大学为什么你一定要学会Python?
  3. C 判断 —— if...else 语句(bool变量、float变量、指针变量与“零值”进行比较)(else 到底与哪个 if 配对呢? if 语句后面的分号?)
  4. shell脚本——字符串 数组
  5. 解决Apache配置虚拟主机时出现403错误的问题
  6. 理解PHP的四大概念对网站开发至关重要
  7. 使用ffmpeg实现转码样例(代码实现)
  8. null和“”的理解
  9. Asp.NET 中 Ajax 的配置使用
  10. 关于@DQ的留言回复