博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ】3526: [Poi2014]Card
阅读量:6234 次
发布时间:2019-06-22

本文共 2275 字,大约阅读时间需要 7 分钟。

题意

\(n(n \le 200000)\)张卡片,正反有两个数\(a[i], b[i]\)\(m(m \le 1000000)\)次操作,每次交换\(c[i]、d[i]\)位置上的卡片。每一次操作后输出是否存在一种方案使得正面朝上的数从左到右单调不降。

分析

直接考虑线段树维护。

题解

线段树每个结点记录4个信息\(a[i][j]\),表示左边的\(i\)在这个结点区间能否和右边的\(j\)面满足条件,update的时候更新一下即可。

#include 
using namespace std;inline int getint() { int x=0; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()); for(; c>='0'&&c<='9'; x=x*10+c-'0', c=getchar()); return x;}const int N=200005, Lim=N*3;int a[N][2], n;struct node { node *c[2]; bool g[2][2]; void up(int m) { static int *l, *r; static bool f[2][2]; l=a[m], r=a[m+1]; f[0][0]=l[0]<=r[0]; f[0][1]=l[0]<=r[1]; f[1][0]=l[1]<=r[0]; f[1][1]=l[1]<=r[1]; g[0][0]=(c[0]->g[0][0]&&((c[1]->g[0][0]&&f[0][0])||(c[1]->g[1][0]&&f[0][1])))|| (c[0]->g[0][1]&&((c[1]->g[0][0]&&f[1][0])||(c[1]->g[1][0]&&f[1][1]))); g[0][1]=(c[0]->g[0][0]&&((c[1]->g[0][1]&&f[0][0])||(c[1]->g[1][1]&&f[0][1])))|| (c[0]->g[0][1]&&((c[1]->g[0][1]&&f[1][0])||(c[1]->g[1][1]&&f[1][1]))); g[1][0]=(c[0]->g[1][0]&&((c[1]->g[0][0]&&f[0][0])||(c[1]->g[1][0]&&f[0][1])))|| (c[0]->g[1][1]&&((c[1]->g[0][0]&&f[1][0])||(c[1]->g[1][0]&&f[1][1]))); g[1][1]=(c[0]->g[1][0]&&((c[1]->g[0][1]&&f[0][0])||(c[1]->g[1][1]&&f[0][1])))|| (c[0]->g[1][1]&&((c[1]->g[0][1]&&f[1][0])||(c[1]->g[1][1]&&f[1][1]))); } void init() { g[0][0]=g[1][1]=1; }}Po[Lim], *iT=Po, *root;node *build(int l, int r) { node *x=iT++; if(l==r) { x->init(); return x; } int mid=(l+r)>>1; x->c[0]=build(l, mid); x->c[1]=build(mid+1, r); x->up(mid); return x;}void update(int p, int l=1, int r=n, node *x=root) { if(l==r) { return; } int mid=(l+r)>>1, f=p>mid; f?(l=mid+1):(r=mid); update(p, l, r, x->c[f]); x->up(mid);}int main() { n=getint(); for(int i=1; i<=n; ++i) { a[i][0]=getint(); a[i][1]=getint(); } root=build(1, n); int m=getint(); while(m--) { int x=getint(), y=getint(); swap(a[x][0], a[y][0]); swap(a[x][1], a[y][1]); update(x); update(y); puts((root->g[0][0]||root->g[0][1]||root->g[1][0]||root->g[1][1])?"TAK":"NIE"); } return 0;}

转载地址:http://mgqna.baihongyu.com/

你可能感兴趣的文章
如何绘制一个圆圆的loading圈
查看>>
Nodejs学习记录:用koa.js开发微信公众号
查看>>
Android源码集锦,悬浮窗综合资讯类APP动画效果左右切换效果美妆领域
查看>>
Spring Cloud(六)服务网关 zuul 快速入门
查看>>
d3.js中动态数据的请求、处理及使用
查看>>
Vue源码解析(六)-vue-router
查看>>
[轮子系列]Google Guava之BloomFilter源码分析及基于Redis的重构
查看>>
android弹力效果菜单、组件化项目、电影票选座控件的源码
查看>>
three.js 中文文档 9.问答
查看>>
单元测试
查看>>
重温JS基础--JS中的对象属性
查看>>
慕课网_《RxJava与RxAndroid基础入门》学习总结
查看>>
CDH的hadoop与Spark套件组安装
查看>>
构建多层感知器神经网络对数字图片进行文本识别
查看>>
Git常规配置与基本用法
查看>>
写Laravel测试代码(三)
查看>>
JS判断数组重复
查看>>
埋点进化论:从埋点到无埋点
查看>>
【175天】黑马程序员27天视频学习笔记【Day06-10复习脑图】
查看>>
Edraw Max(亿图图示)教程:如何自定义组织结构图展示的信息
查看>>