BZOJ3526 [Poi2014]Card

来源:互联网 发布:java异常中的finally 编辑:程序博客网 时间:2024/06/14 17:22

线段树维护区间以较小的数开头,结尾最小是多少以及区间以较大的数开头,结尾最小是多少(同时维护是否无解)

然后就可以判了

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<ctime>#include<cmath>#include<algorithm>#include<iomanip>#include<vector>#include<map>#include<set>#include<bitset>#include<queue>#include<stack>using namespace std;#define MAXN 200010#define MAXM 1010#define INF 1000000000#define MOD 1000000007#define eps 1e-8#define ll long longint n,m;int a[MAXN],b[MAXN];int v1[MAXN<<2],v2[MAXN<<2];inline void ud(int x,int y,int z){int mid=y+z>>1;if(a[mid+1]>=v1[x<<1]){v1[x]=v1[x<<1|1];}else if(b[mid+1]>=v1[x<<1]){v1[x]=v2[x<<1|1];}else{v1[x]=INF;}if(a[mid+1]>=v2[x<<1]){v2[x]=v1[x<<1|1];}else if(b[mid+1]>=v2[x<<1]){v2[x]=v2[x<<1|1];}else{v2[x]=INF;}}void build(int x,int y,int z){if(y==z){v1[x]=a[y];v2[x]=b[y];return ;}int mid=y+z>>1;build(x<<1,y,mid);build(x<<1|1,mid+1,z);ud(x,y,z);}void change(int x,int y,int z,int p){if(y==z){v1[x]=a[y];v2[x]=b[y];return ;}int mid=y+z>>1;if(p<=mid){change(x<<1,y,mid,p);}else{change(x<<1|1,mid+1,z,p);}ud(x,y,z);}int main(){int i,x,y;scanf("%d",&n);for(i=1;i<=n;i++){scanf("%d%d",&a[i],&b[i]);if(a[i]>b[i]){swap(a[i],b[i]);}}build(1,1,n);scanf("%d",&m);while(m--){scanf("%d%d",&x,&y);swap(a[x],a[y]);swap(b[x],b[y]);change(1,1,n,x);change(1,1,n,y);if(v1[1]==INF){printf("NIE\n");}else{printf("TAK\n");}}return 0;}/**/


0 0
原创粉丝点击