BZOJ 3526: [Poi2014]Card
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
2 5
3 4
6 3
2 7
2
3 4
1 3
Sample Output
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
好有趣的一道题,老早就写过,现在又重新写一遍,强行缩代码,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的更多相关文章
- 【BZOJ】3526: [Poi2014]Card
题意 \(n(n \le 200000)\)张卡片,正反有两个数\(a[i], b[i]\).\(m(m \le 1000000)\)次操作,每次交换\(c[i].d[i]\)位置上的卡片.每一次操作 ...
- 【刷题】BZOJ 4543 [POI2014]Hotel加强版
Description 同OJ3522 数据范围:n<=100000 Solution dp的设计见[刷题]BZOJ 3522 [Poi2014]Hotel 然后发现dp的第二维与深度有关,于是 ...
- 【BZOJ3526】[Poi2014]Card 线段树
[BZOJ3526][Poi2014]Card Description 有n张卡片在桌上一字排开,每张卡片上有两个数,第i张卡片上,正面的数为a[i],反面的数为b[i].现在,有m个熊孩子来破坏你的 ...
- bzoj3526[Poi2014]Card*
bzoj3526[Poi2014]Card 题意: 有n张卡片在桌上一字排开,每张卡片上有两个数,第i张卡片上,正面的数为a[i],反面的数为b[i].有m个操作,第i个操作会交换c[i]和d[i]两 ...
- 主席树||可持久化线段树||BZOJ 3524: [Poi2014]Couriers||BZOJ 2223: [Coci 2009]PATULJCI||Luogu P3567 [POI2014]KUR-Couriers
题目:[POI2014]KUR-Couriers 题解: 要求出现次数大于(R-L+1)/2的数,这样的数最多只有一个.我们对序列做主席树,每个节点记录出现的次数和(sum).(这里忽略版本差值问题) ...
- BZOJ 3524: [Poi2014]Couriers [主席树]
3524: [Poi2014]Couriers Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1892 Solved: 683[Submit][St ...
- BZOJ 3524: [Poi2014]Couriers
3524: [Poi2014]Couriers Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1905 Solved: 691[Submit][St ...
- Bzoj 3831 [Poi2014]Little Bird
3831: [Poi2014]Little Bird Time Limit: 20 Sec Memory Limit: 128 MB Submit: 310 Solved: 186 [Submit][ ...
- [BZOJ 3829][POI2014] FarmCraft
先贴一波题面... 3829: [Poi2014]FarmCraft Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 421 Solved: 197[ ...
随机推荐
- GridView控件中Checkbox实现单选
在GridView控件中,第0列有放一个CheckBox控件,现想实现对CheckBox进行单选. 先看看效果: 在ASPX页面,可以这样做: 有一点注意的是需要使用OnRowCreated事件. 在 ...
- JavaFx之不通过全局静态变量进行窗体通信
百度了n多窗体通信,,,总是通过定义全局静态变量进行传值通信..我个人不喜欢一个controller里写满所有的布局(这样显得臃肿,但是组件传值方便).有没有另外的办法进行模块化并且可以传值呢.. 肯 ...
- MySQL调优基础, 与hikari数据库连接池配合
1.根据硬件配置系统参数 wait_timeout 非交互连接的最大存活时间, 10-30min max_connections 全局最大连接数 默认100 根据情况调整 back_log ...
- 在平衡树的海洋中畅游(三)——Splay
Preface 由于我怕学习了Splay之后不直接写blog第二天就忘了,所以强行加了一波优先级. 论谁是天下最秀平衡树,我Splay第一个不服.维护平衡只靠旋转. 一言不合转死你 由于平衡树我也介绍 ...
- 51Nod 1705 七星剑
一道很新颖的概率DP,我看数据范围还以为是有指数级别的复杂度的呢 记得有人说期望要倒着推,但放在这道题上,就咕咕了吧. 我们考虑正着概率DP,设\(fi\)表示将剑升到\(i\)颗星花费的期望,这样我 ...
- [Oracle]如何查看 10046 trace 中的 tim= ... 的具体时刻
可以在 Linux 下,用下列方式: 如10046 trace 文件中如果有如下的内容:... tim = 1503032923 可以用 date 命令加 option 来看它的时刻: date - ...
- 如何用区块链技术解决信任问题?Fabric 架构深度解读
阿里妹导读:区块链技术,随着比特币的兴起而为大家所知.但是具体到技术本身,大家相对熟悉的几个词可能是“数据不可篡改”.“公开链”.“分布式数据”.“共识机制”等. 这篇文章将抛砖引玉,通过深度解读Hy ...
- 《Linux内核分析》读书笔记(四章)
<Linux内核分析>读书笔记(四章) 标签(空格分隔): 20135328陈都 第四章 进程调度 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行 ...
- linux内核分析第六周学习笔记
LINUX内核分析第六周学习总结 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.c ...
- [同事转帖] .net core的服务器模式和工作站模式
发现自己的服务器上面的进程占用越来越厉害 所以就跟同事讨论了一下 性能组同事 说已经发现 并且给了一个 网址 这里转帖记录一下 避免以后找不到. .NET Core是一个开源通用的开发框架,具有跨平台 ...