Codeforces 558 D. Guess Your Way Out! II

http://codeforces.com/problemset/problem/558/D

我先把q个区间都下移到叶子层,映射一下,若[l,r] 为 1,则[l,r] 的 g[]值 + 1,否则其补集所在的区间 +1,对于区间所有数 +1,可以先 g[l] + 1, g[r+1] - 1,最后在求一下和。然后看看g[] = q的点有几个。


#include 
   
   
    
    
#include 
    
    
     
     
#include 
     
     
      
      
#include 
      
      
       
       
#include 
       
       
         #include 
        
          #include 
         
           #include 
          
            #include 
           
             #include 
            
              #include 
             
               #include 
              
                #include 
               
                 #include 
                
                  #include 
                  using namespace std; #define rep(i,n) for(int i=0; i 
                  
                    mp; int main() { //freopen("out.txt","w",stdout); scanf("%d%d",&h,&n); for(int i=0; i 
                   
                     << 1) - 1; for(int i=0; i 
                    
                      L) { A[_A++] = q[i].l - 1; } if(q[i].r < R) { A[_A++] = q[i].r + 1; } } } A[_A++] = L;A[_A++] = R; sort(A,A+_A); _A = unique(A,A+_A) - A; int cnt = 0; mp.clear(); for(int i=0; i<_A; i++) // 映射 { mp[A[i]] = (++cnt); rmp[cnt] = A[i]; } mst(g,0); for(int i=0; i 
                     
                       L) { g[mp[L]]++; g[mp[q[i].l-1]+1]--; } if(q[i].r < R) { g[mp[q[i].r+1]]++; g[mp[R]+1]--; } } } ll ans = 0; int num = 0; for(int i=1; i<=cnt; i++) { g[i] += g[i-1]; if(g[i] == n) { num++; ans = rmp[i]; } } if(num == 0) printf("Game cheated!\n"); else if(num > 1) printf("Data not sufficient!\n"); else printf("%I64d\n",ans); return 0; } 
                      
                     
                    
                   
                 
                
               
              
             
            
           
          
         
       
      
      
     
     
    
    
   
   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值