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[ ...
随机推荐
- LinqPad的变量比较功能
LinqPad是一个非常方便的C#工具(有免费版和收费版). 今天发现它的变量比较功能真是方便啊.且看3行代码产生如下结果: 说明:图中两个变量的成员属性值分别用红色和绿色背景标注:图很长,只截取了一 ...
- WPF-利用Blend写的平面控制闸门开关动画
原文:WPF-利用Blend写的平面控制闸门开关动画 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/yangyisen0713/article/de ...
- [转]The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
完整错误信息: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS"AS IS" AND ANY ...
- C# 队列和栈 线程安全
队列是其元素以先进先出(FIFO)的方式来处理集合,先入队的元素会先读取. 栈是和队列非常类似的另一个容器,栈和队列最大的区别是后进先出(LIFO),也可以说成先进后出. 队列在现实生活中的例子数不胜 ...
- KVM虚拟机管理——资源调整
1. 概述2. 计算资源调整2.1 调整处理器配置2.2 调整内存配置3. 存储资源调整3.1 根分区扩展3.2 添加磁盘4. 网络资源调整 1. 概述 KVM在使用过程中,会涉及到计算(CPU,内存 ...
- Python-复习-文件操作-21
# 文件处理 # 打开文件 #open('路径','打开方式','指定编码方式') # 打开方式 r w a r+ w+ a+ b #r+ 打开文件直接写 和读完再写 # 编码方式 —— utf-8 ...
- Map获取key值
有两种方法 public static void test4(){ Map<String, Object> map = new HashMap<>(); map.put(&qu ...
- #个人博客作业Week2——关于代码规范的讨论
<1> 这些规范都是官僚制度下产生的浪费大家的编程时间.影响人们开发效率, 浪费时间的东西. 反驳:官僚制度在一定程度下维持了社会的和谐稳定,一个没有法律.没有拥有完善的管理体制.完全崇尚 ...
- HDOJ4548_美素数
简单的素数问题 HDOJ4548_美素数 #include<stdio.h> #include<stdlib.h> #include<math.h> #includ ...
- Spring使用Cache、整合Ehcache(转)
今天在做Spring使用Cache.整合Ehcache时发现一篇非常好的文章,原文地址 http://elim.iteye.com/blog/2123030 从3.1开始,Spring引入了对Cach ...