BZOJ P3526 「POI2014」Card【线段树】

记录一个 c k [ 2 ] [ 2 ] ck[2][2] ck[2][2] c k [ 0 / 1 ] [ 0 / 1 ] ck[0/1][0/1] ck[0/1][0/1]表示当前区间左端点选择 a / b , a / b a/b,a/b a/ba/b能否满足题意,然后区间合并一下。

#include <queue>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
#define rep(i,x,y) for(ll i=(x);i<=(y);i++)
#define repd(i,x,y) for(ll i=(x);i>=(y);i--)
using namespace std;

const ll N=2e5+5;

ll n,m,card[N][2];

struct node{
	ll x,y,ck[2][2];
}tree[N<<2];

#define lson (p<<1)
#define rson (p<<1|1)

inline ll read() {
	ll x=0;char ch=getchar();bool f=0;
	while(ch>'9'||ch<'0'){if(ch=='-')f=1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
	return f?-x:x;
}

void pushup(ll p) {
	rep(i,0,1) rep(j,0,1) {
		tree[p].ck[i][j]=0;
		rep(k,0,1) rep(l,0,1) {
			tree[p].ck[i][j]|=tree[lson].ck[i][k]&tree[rson].ck[l][j]&(card[tree[lson].y][k]<=card[tree[rson].x][l]);
		}
	}
}

void maketree(ll p,ll x,ll y) {
	tree[p].x=x,tree[p].y=y;
	if(x==y) {
		tree[p].ck[1][1]=tree[p].ck[0][0]=1;return ;
	} else {
		maketree(lson,x,x+y>>1);
		maketree(rson,(x+y>>1)+1,y);pushup(p);
	}
}

void update(ll p,ll q) {
	if(tree[p].x==tree[p].y) {
		tree[p].ck[0][0]=tree[p].ck[1][1]=1;return ;
	}
	
	if(q<=tree[lson].y) update(lson,q);
	else update(rson,q);pushup(p);
}

int main() {
	n=read();
	
	rep(i,1,n) card[i][0]=read(),card[i][1]=read();
	
	maketree(1,1,n);
	
	m=read();
	
	rep(i,1,m) {
		ll x=read(),y=read();
		swap(card[x][0],card[y][0]);
		swap(card[x][1],card[y][1]);update(1,x),update(1,y);
		
		if(tree[1].ck[0][0]|tree[1].ck[0][1]|tree[1].ck[1][0]|tree[1].ck[1][1]) puts("TAK");
		else puts("NIE");
	}
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值