3526: [Poi2014]Card

Time Limit: 25 Sec  Memory Limit: 64 MB
Submit: 267  Solved: 191
[Submit][Status][Discuss]

Description

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

Input

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

Output

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

Sample Input

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

Sample Output

NIE
TAK

HINT

【样例解释】

交换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.

Source

[Submit][Status][Discuss]

好有趣的一道题,老早就写过,现在又重新写一遍,强行缩代码,2333.

就是用线段树,维护每个区间,如果选取区间左端较小值,右端能以什么结尾;如果选取区间左端较大值,右端能以什么结尾。

 #include<cstdio>
#define mxn 200005
#define siz 800005
#define mxm 1000005
#define swap(a,b) a^=b^=a^=b
int n,m,a[mxn],b[mxn],c,d,A[siz],B[siz];
void update(int t,int l,int r,int d,int ls,int rs){
A[t]=B[t]=;
if((A[ls]==&&a[d]<=b[d+])||(A[ls]==&&b[d]<=b[d+]))A[t]=B[rs];
if((A[ls]==&&a[d]<=a[d+])||(A[ls]==&&b[d]<=a[d+]))A[t]=A[rs];
if((B[ls]==&&a[d]<=b[d+])||(B[ls]==&&b[d]<=b[d+]))B[t]=B[rs];
if((B[ls]==&&a[d]<=a[d+])||(B[ls]==&&b[d]<=a[d+]))B[t]=A[rs];
}
void build(int t,int l,int r){
if(l==r){A[t]=;B[t]=;return;}
int d=(l+r)>>,ls=t<<,rs=t<<|;
build(ls,l,d),build(rs,d+,r);
update(t,l,r,d,ls,rs);
}
void rebuild(int t,int l,int r,int p){
if(l==r){A[t]=;B[t]=;return;}
int d=(l+r)>>,ls=t<<,rs=t<<|;
if(p<=d)rebuild(ls,l,d,p);else rebuild(rs,d+,r,p);
update(t,l,r,d,ls,rs);
}
main(){
scanf("%d",&n);
for(int i=;i<=n;++i)scanf("%d%d",a+i,b+i);
for(int i=;i<=n;++i)if(a[i]>b[i])swap(a[i],b[i]);
build(,,n);
scanf("%d",&m);
for(int i=;i<=m;++i)scanf("%d%d",&c,&d),puts((swap(a[c],a[d]),swap(b[c],b[d]),rebuild(,,n,c),rebuild(,,n,d),A[])?"TAK":"NIE");
}

原来的代码看起来好冗长的样子……

 #include <cmath>
#include <cstdio>
#include <string>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm> using namespace std; const int N = ;
const int M = ; int n, m; struct card
{
int a, b; card(void) {};
card(int _a, int _b)
{
a = min(_a, _b);
b = max(_a, _b);
}
}c[N]; struct node
{
int lt, rt;
int valA, valB;
}tree[N << ]; void buildTree(int p, int l, int r)
{
node &t = tree[p]; t.lt = l, t.rt = r; if (t.lt == t.rt)
{
t.valA = ;
t.valB = ; return;
} int mid = (t.lt + t.rt) >> ; buildTree(p << , t.lt, mid);
buildTree(p << | , mid + , t.rt); t.valA = t.valB = ; switch (tree[p << ].valA)
{
case :
if (c[mid].a <= c[mid + ].b)
t.valA = tree[p << | ].valB;
if (c[mid].a <= c[mid + ].a)
t.valA = tree[p << | ].valA;
break;
case :
if (c[mid].b <= c[mid + ].b)
t.valA = tree[p << | ].valB;
if (c[mid].b <= c[mid + ].a)
t.valA = tree[p << | ].valA;
break;
} switch (tree[p << ].valB)
{
case :
if (c[mid].a <= c[mid + ].b)
t.valB = tree[p << | ].valB;
if (c[mid].a <= c[mid + ].a)
t.valB = tree[p << | ].valA;
break;
case :
if (c[mid].b <= c[mid + ].b)
t.valB = tree[p << | ].valB;
if (c[mid].b <= c[mid + ].a)
t.valB = tree[p << | ].valA;
break;
}
} void change(int p, int pos)
{
node &t = tree[p]; if (t.lt == t.rt)
{
t.valA = ;
t.valB = ; return;
} int mid = (t.lt + t.rt) >> ; if (pos <= mid)
change(p << , pos);
else
change(p << | , pos); t.valA = t.valB = ; switch (tree[p << ].valA)
{
case :
if (c[mid].a <= c[mid + ].b)
t.valA = tree[p << | ].valB;
if (c[mid].a <= c[mid + ].a)
t.valA = tree[p << | ].valA;
break;
case :
if (c[mid].b <= c[mid + ].b)
t.valA = tree[p << | ].valB;
if (c[mid].b <= c[mid + ].a)
t.valA = tree[p << | ].valA;
break;
} switch (tree[p << ].valB)
{
case :
if (c[mid].a <= c[mid + ].b)
t.valB = tree[p << | ].valB;
if (c[mid].a <= c[mid + ].a)
t.valB = tree[p << | ].valA;
break;
case :
if (c[mid].b <= c[mid + ].b)
t.valB = tree[p << | ].valB;
if (c[mid].b <= c[mid + ].a)
t.valB = tree[p << | ].valA;
break;
}
} signed main(void)
{
scanf("%d", &n); for (int i = , a, b; i <= n; ++i)
scanf("%d%d", &a, &b), c[i] = card(a, b); buildTree(, , n); scanf("%d", &m); for (int i = , a, b; i <= m; ++i)
{
scanf("%d%d", &a, &b); swap(c[a], c[b]); change(, a);
change(, b); if (tree[].valA)
puts("TAK");
else
puts("NIE");
}
}

@Author: YouSiki

BZOJ 3526: [Poi2014]Card的更多相关文章

  1. 【BZOJ】3526: [Poi2014]Card

    题意 \(n(n \le 200000)\)张卡片,正反有两个数\(a[i], b[i]\).\(m(m \le 1000000)\)次操作,每次交换\(c[i].d[i]\)位置上的卡片.每一次操作 ...

  2. 【刷题】BZOJ 4543 [POI2014]Hotel加强版

    Description 同OJ3522 数据范围:n<=100000 Solution dp的设计见[刷题]BZOJ 3522 [Poi2014]Hotel 然后发现dp的第二维与深度有关,于是 ...

  3. 【BZOJ3526】[Poi2014]Card 线段树

    [BZOJ3526][Poi2014]Card Description 有n张卡片在桌上一字排开,每张卡片上有两个数,第i张卡片上,正面的数为a[i],反面的数为b[i].现在,有m个熊孩子来破坏你的 ...

  4. bzoj3526[Poi2014]Card*

    bzoj3526[Poi2014]Card 题意: 有n张卡片在桌上一字排开,每张卡片上有两个数,第i张卡片上,正面的数为a[i],反面的数为b[i].有m个操作,第i个操作会交换c[i]和d[i]两 ...

  5. 主席树||可持久化线段树||BZOJ 3524: [Poi2014]Couriers||BZOJ 2223: [Coci 2009]PATULJCI||Luogu P3567 [POI2014]KUR-Couriers

    题目:[POI2014]KUR-Couriers 题解: 要求出现次数大于(R-L+1)/2的数,这样的数最多只有一个.我们对序列做主席树,每个节点记录出现的次数和(sum).(这里忽略版本差值问题) ...

  6. BZOJ 3524: [Poi2014]Couriers [主席树]

    3524: [Poi2014]Couriers Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1892  Solved: 683[Submit][St ...

  7. BZOJ 3524: [Poi2014]Couriers

    3524: [Poi2014]Couriers Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1905  Solved: 691[Submit][St ...

  8. Bzoj 3831 [Poi2014]Little Bird

    3831: [Poi2014]Little Bird Time Limit: 20 Sec Memory Limit: 128 MB Submit: 310 Solved: 186 [Submit][ ...

  9. [BZOJ 3829][POI2014] FarmCraft

    先贴一波题面... 3829: [Poi2014]FarmCraft Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 421  Solved: 197[ ...

随机推荐

  1. PV和并发、以及计算web服务器的数量的方法

    几个概念 网站流量是指网站的访问量,用来描述访问网站的用户数量以及用户所浏览的网页数量等指标,常用的统计指标包括网站的独立用户数量.总用户数量(含重复访问者).网页浏览数量.每个用户的页面浏览数量.用 ...

  2. A2dp连接流程源码分析

    在上一篇文章中,我们已经分析了:a2dp初始化流程 这篇文章主要分析a2dp的连接流程,其中还是涉及到一些底层的profile以及protocol,SDP.AVDTP以及L2CAP等. 当蓝牙设备与主 ...

  3. Linux中2>&1使用

    转:2>&1使用 一 相关知识 1)默认地,标准的输入为键盘,但是也可以来自文件或管道(pipe |).2)默认地,标准的输出为终端(terminal),但是也可以重定向到文件,管道或后 ...

  4. Mvc_ActionResult返回值

    //ViewResult 表示HTML的页面内容 //EmptyResult 表示空白的页面内容 //RedirectResult 表示定位到另外一个URL //JsonResult 表示可以运用到A ...

  5. Ubuntu apt-get提示被锁住

    执行 apt-get 时提示资源被锁住 E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavai ...

  6. Python - 内置函数 选例

    概览参见  https://www.runoob.com/python/python-built-in-functions.html 官方文档 https://docs.python.org/3/li ...

  7. zabbix中配置当memory剩余不足20%时触发报警

    在zabbix中默认当内存剩余量不足2G的时候触发报警,并没有使用百分比来触发如下: 现在需要配置:当memory剩余不足20%时触发报警,具体操作方法如下: 1)创建itemConfiguratio ...

  8. mariadb第二章-增删改

    MariaDB 数据类型 MariaDB数据类型可以分为数字,日期和时间以及字符串值. 使用数据类型的原则:够用就行, 尽量使用范围小的,而不用大的 常用的数据类型 整数:int, bit 小数:de ...

  9. javascript DOM操作中的insertAdjacentHTML方法

    插入HTML内容与文本内容以前用的是innerHTML与innerText方法,今天看到insertAdjacentHTML和 insertAdjacentText两个API,特地学习一下: inse ...

  10. IDEA启动服务阻塞,断点过程十分慢的问题

    使用debug无法启动项目但是使用run就可以启动程序,而且启动比以前的debug模式快的多 原因: 启动不了的原因是在项目中的方法上打了断点,导致项目无法继续编译 取消方法断点就可以了 在idea官 ...