• 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 }
  • 相关阅读:
    【操作系统】 管程机制
    【Java】 大话数据结构(13) 查找算法(4) (散列表(哈希表))
    【操作系统】 信号量机制
    【Java】 奇偶数的判断
    【Java】 大话数据结构(12) 查找算法(3) (平衡二叉树(AVL树))
    MySQL之库操作
    数据库简介
    MySQL的知识海洋
    python并发编程之多进程(理论)
    python并发编程之多进程(实现)
  • 原文地址:https://www.cnblogs.com/ezyzy/p/6522963.html
Copyright © 2020-2023  润新知