bzoj 3526 : [Poi2014]Card

  把每张卡牌看成两个点,裸的线段树维护连通性。

  

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #define ls x*2,l,mid
  6 #define rs x*2+1,mid+1,r
  7 #define N 200005
  8 using namespace std;
  9 int read()
 10 {
 11     char c=getchar();int p=0;
 12     while(c<'0'||c>'9')c=getchar();
 13     while(c>='0'&&c<='9')p=p*10+c-'0',c=getchar();
 14     return p;
 15 }
 16 int n;
 17 int aa[N][2];
 18 struct node
 19 {
 20     int v[2][2];
 21 }a[N*4];
 22 void push_up(int x,int mid)
 23 {
 24     int lc=x*2,rc=x*2+1;
 25     a[x].v[0][0]=a[x].v[0][1]=a[x].v[1][0]=a[x].v[1][1]=0;
 26     if(aa[mid][0]<=aa[mid+1][0])
 27     {
 28         a[x].v[0][0]|=(a[lc].v[0][0]&a[rc].v[0][0]);
 29         a[x].v[0][1]|=(a[lc].v[0][0]&a[rc].v[0][1]);
 30         a[x].v[1][0]|=(a[lc].v[1][0]&a[rc].v[0][0]);
 31         a[x].v[1][1]|=(a[lc].v[1][0]&a[rc].v[0][1]);
 32     }
 33     else if(aa[mid][0]<=aa[mid+1][1])
 34     {
 35         a[x].v[0][0]|=(a[lc].v[0][0]&a[rc].v[1][0]);
 36         a[x].v[0][1]|=(a[lc].v[0][0]&a[rc].v[1][1]);
 37         a[x].v[1][0]|=(a[lc].v[1][0]&a[rc].v[1][0]);
 38         a[x].v[1][1]|=(a[lc].v[1][0]&a[rc].v[1][1]);
 39     }
 40     if(aa[mid][1]<=aa[mid+1][0])
 41     {
 42         a[x].v[0][0]|=(a[lc].v[0][1]&a[rc].v[0][0]);
 43         a[x].v[0][1]|=(a[lc].v[0][1]&a[rc].v[0][1]);
 44         a[x].v[1][0]|=(a[lc].v[1][1]&a[rc].v[0][0]);
 45         a[x].v[1][1]|=(a[lc].v[1][1]&a[rc].v[0][1]);
 46     }
 47     else if(aa[mid][1]<=aa[mid+1][1])
 48     {
 49         a[x].v[0][0]|=(a[lc].v[0][1]&a[rc].v[1][0]);
 50         a[x].v[0][1]|=(a[lc].v[0][1]&a[rc].v[1][1]);
 51         a[x].v[1][0]|=(a[lc].v[1][1]&a[rc].v[1][0]);
 52         a[x].v[1][1]|=(a[lc].v[1][1]&a[rc].v[1][1]);
 53     }
 54     return ;
 55 }
 56 void build(int x,int l,int r)
 57 {
 58     if(l==r)
 59     {
 60         a[x].v[0][1]=1;
 61         a[x].v[0][0]=a[x].v[1][1]=1;
 62         return ;
 63     }
 64     int mid=(l+r)>>1;
 65     build(ls);build(rs);
 66     push_up(x,mid);
 67 }
 68 void gai(int x,int l,int r,int pos)
 69 {
 70     if(l==r)return ;
 71     int mid=(l+r)>>1;
 72     if(pos<=mid)gai(ls,pos);
 73     else gai(rs,pos);
 74     push_up(x,mid);
 75 }
 76 int main()
 77 {
 78     scanf("%d",&n);
 79     for(int i=1;i<=n;i++)
 80     {
 81         aa[i][0]=read(),aa[i][1]=read();
 82         if(aa[i][0]>aa[i][1])swap(aa[i][0],aa[i][1]);
 83     }
 84     build(1,1,n);
 85     int m;
 86     scanf("%d",&m);int t1,t2;
 87     for(int i=1;i<=m;i++)
 88     {
 89         t1=read();t2=read();
 90         swap(aa[t1][0],aa[t2][0]);
 91         swap(aa[t1][1],aa[t2][1]);
 92         gai(1,1,n,t1);gai(1,1,n,t2);
 93         if(a[1].v[1][1]||a[1].v[1][0]||a[1].v[0][0]||a[1].v[0][1])
 94         {
 95             puts("TAK");
 96         }
 97         else puts("NIE");
 98     }
 99     return 0;
100 }

 

posted @ 2017-03-08 20:45  SD_le  阅读(192)  评论(0编辑  收藏  举报
重置按钮