BZOJ3526[Poi2014]Card——线段树合并
题目描述
有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。
样例输入
2 5
3 4
6 3
2 7
2
3 4
1 3
样例输出
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——线段树合并相关推荐
- 线段树合并与分裂维护树上最长上升子序列 + 点分治删点 ---- 2021 牛客多校第一场 C - Cut the tree(详解)
题目大意: 给你一个树,树上每个点都有一个权值valnodeval_{node}valnode,路径(u,v)(u,v)(u,v) 上所有点按顺序有序序列,令f(u,v)f(u,v)f(u,v)是这 ...
- 线段树分裂与合并 ---- 树上差分 P4556 [Vani有约会]雨天的尾巴 /【模板】线段树合并
题目链接 解题思路: 首先题目是对u,vu,vu,v这两条路径上面添加一个zzz,然后运用树上点的差分思想,对于分发路径u,vu,vu,v,我们在uuu上+1+1+1,在vvv上+1+1+1,在lca ...
- 【线段树合并】解题报告:luogu P4556雨天的尾巴 (树上对点差分 + 动态开点 + 线段树合并)线段树合并模板离线/在线详解
题目链接:雨天的尾巴 本题本身是一个非常简单的一道树上差分的模板题,但是由于变态的数据范围,我们直接用数组是存不下的(本来使用一颗普通的线段树直接维护最大值即可.但是本题的空间只有128MB,直接按照 ...
- 【BZOJ-3681】Arietta 网络流 + 线段树合并
3681: Arietta Time Limit: 20 Sec Memory Limit: 64 MB Submit: 182 Solved: 70 [Submit][Status][Discu ...
- 【BZOJ5461】 【PKUWC2018】—Minimax(线段树合并优化dp)
传送门 发现其实就是左右2棵子树,左儿子选到某个值的概率就是 选最大值的概率∗右儿子的值比它小的概率选最大值的概率*右儿子的值比它小的概率选最大值的概率∗右儿子的值比它小的概率 +选最小值的概率∗右儿 ...
- [BJWC2018]Border 的四种求法(后缀自动机+链分治+线段树合并)
题目描述 给一个小写字母字符串 S ,q 次询问每次给出 l,r ,求 s[l..r] 的 Border . Border: 对于给定的串 s ,最大的 i 使得 s[1..i] = s[|s|-i+ ...
- CF1037H Security——SAM+线段树合并
又是一道\(SAM\)维护\(endpos\)集合的题,我直接把CF700E的板子粘过来了QwQ 思路 如果我们有\([l,r]\)对应的\(SAM\),只需要在上面贪心就可以了.因为要求的是字典序比 ...
- hdu 5511 Minimum Cut-Cut——分类讨论思想+线段树合并
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5511 题意:割一些边使得无向图变成不连通的,并且恰好割了两条给定生成树上的边.满足非树边两段一定在给定生成 ...
- [Vani有约会]雨天的尾巴 (线段树合并)
题目链接 Solution 树上差分+线段树合并. 在每个节点上维护一棵权值线段树. 然后如果需要修改 \(x,y\) 两点,则在 \(x\) 处和 \(y\) 处分别加上 \(1\) 的权值. 然后 ...
最新文章
- Linux那些事儿 之 戏说USB(14)端点
- 12.前K个高频元素---使用优先队列和哈希表解决
- 获取Http协议的请求行,请求头
- 玩转 Tomcat 配置必备的 10 个小技巧!
- python多久可以精通_学Python需要多久能学会?精通Python需要多长时间?
- python回车换行怎么不行_使用Python编写换行符时避免写入回车'\r'
- IDEA如何使用热部署方式启动项目?
- jQuery实现手风琴效果
- 华为GPON设备ONU常见告警及处理
- 华为服务器设置raid0为系统盘,服务器设置raid0
- python全栈工程师知识框架_全栈工程师的知识结构
- 计算机专业定向选调,兄弟们,关于定向选调和找工作,JR们能不能给小弟一些建议...
- VS 可扩展性开发(九):总结篇
- 怎么把PicPick设置成中文版?
- 论文《Dialogue State Tracking with a Language Model using Schema-Driven Prompting》学习笔记
- 图像标签 链接标签
- U3D-3D MAX Biped导出.fbx到Unity的Humanoid的骨架不匹配(Disable Triangle Pelvis, Enable Triangle Neck)
- 从Android代码中来记忆23种设计模式
- 分布式链路追踪Jaeger快速入门-01
- 55、【图】Dijkstra求最短路径(单源最短路径+边权重为正数)(C/C++版)
热门文章
- PHP 正则表达式 最后总结
- 大学开设python课程吗_在大学为什么你一定要学会Python?
- C 判断 —— if...else 语句(bool变量、float变量、指针变量与“零值”进行比较)(else 到底与哪个 if 配对呢? if 语句后面的分号?)
- shell脚本——字符串 数组
- 解决Apache配置虚拟主机时出现403错误的问题
- 理解PHP的四大概念对网站开发至关重要
- 使用ffmpeg实现转码样例(代码实现)
- null和“”的理解
- Asp.NET 中 Ajax 的配置使用
- 关于@DQ的留言回复