zoukankan      html  css  js  c++  java
  • URAL-1987 Nested Segments 线段树简单区间覆盖

      题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1987

      题意:给定n条线段,每两条线段要么满足没有公共部分,要么包含。给出m个询问,求当前点被覆盖的最小长度的线段编号。

      由于线段不存在部分相交的情况,因此,直接按照输入顺序覆盖区间就可以了,因为后覆盖的线段更短。

      1 //STATUS:C++_AC_187MS_6805KB
      2 #include <functional>
      3 #include <algorithm>
      4 #include <iostream>
      5 //#include <ext/rope>
      6 #include <fstream>
      7 #include <sstream>
      8 #include <iomanip>
      9 #include <numeric>
     10 #include <cstring>
     11 #include <cassert>
     12 #include <cstdio>
     13 #include <string>
     14 #include <vector>
     15 #include <bitset>
     16 #include <queue>
     17 #include <stack>
     18 #include <cmath>
     19 #include <ctime>
     20 #include <list>
     21 #include <set>
     22 #include <map>
     23 using namespace std;
     24 //#pragma comment(linker,"/STACK:102400000,102400000")
     25 //using namespace __gnu_cxx;
     26 //define
     27 #define pii pair<int,int>
     28 #define mem(a,b) memset(a,b,sizeof(a))
     29 #define lson l,mid,rt<<1
     30 #define rson mid+1,r,rt<<1|1
     31 #define PI acos(-1.0)
     32 //typedef
     33 typedef __int64 LL;
     34 typedef unsigned __int64 ULL;
     35 //const
     36 const int N=100010;
     37 const int INF=0x3f3f3f3f;
     38 const int MOD=95041567,STA=8000010;
     39 const LL LNF=1LL<<60;
     40 const double EPS=1e-8;
     41 const double OO=1e15;
     42 const int dx[4]={-1,0,1,0};
     43 const int dy[4]={0,1,0,-1};
     44 const int day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
     45 //Daily Use ...
     46 inline int sign(double x){return (x>EPS)-(x<-EPS);}
     47 template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}
     48 template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
     49 template<class T> inline T lcm(T a,T b,T d){return a/d*b;}
     50 template<class T> inline T Min(T a,T b){return a<b?a:b;}
     51 template<class T> inline T Max(T a,T b){return a>b?a:b;}
     52 template<class T> inline T Min(T a,T b,T c){return min(min(a, b),c);}
     53 template<class T> inline T Max(T a,T b,T c){return max(max(a, b),c);}
     54 template<class T> inline T Min(T a,T b,T c,T d){return min(min(a, b),min(c,d));}
     55 template<class T> inline T Max(T a,T b,T c,T d){return max(max(a, b),max(c,d));}
     56 //End
     57 
     58 int c[(N*3)<<2],t[N][2],q[N],id[N*3];
     59 int n;
     60 
     61 void pushdown(int rt)
     62 {
     63     if(c[rt]!=-1)
     64         c[rt<<1]=c[rt<<1|1]=c[rt];
     65 }
     66 
     67 void pushup(int rt)
     68 {
     69     if(c[rt<<1]==c[rt<<1|1])
     70         c[rt]=c[rt<<1];
     71     else c[rt]=-1;
     72 }
     73 
     74 void update(int l,int r,int rt,int L,int R,int val)
     75 {
     76     if(L<=l && r<=R){
     77         c[rt]=val;
     78         return;
     79     }
     80     pushdown(rt);
     81     int mid=(l+r)>>1;
     82     if(L<=mid)update(lson,L,R,val);
     83     if(R>mid)update(rson,L,R,val);
     84     pushup(rt);
     85 }
     86 
     87 int query(int l,int r,int rt,int w)
     88 {
     89     if(l==r){
     90         return c[rt];
     91     }
     92     pushdown(rt);
     93     int mid=(l+r)>>1,ret;
     94     if(w<=mid)ret=query(lson,w);
     95     else ret=query(rson,w);
     96     pushup(rt);
     97     return ret;
     98 }
     99 
    100 int main()
    101 {
    102  //   freopen("in.txt","r",stdin);
    103     int i,j,k,L,R,m;
    104     while(~scanf("%d",&n))
    105     {
    106         k=0;
    107         for(i=1;i<=n;i++){
    108             scanf("%d%d",&t[i][0],&t[i][1]);
    109             id[k++]=t[i][0];
    110             id[k++]=t[i][1];
    111         }
    112         scanf("%d",&m);
    113         for(i=0;i<m;i++){
    114             scanf("%d",&q[i]);
    115             id[k++]=q[i];
    116         }
    117         sort(id,id+k);
    118         k=unique(id,id+k)-id;
    119         mem(c,-1);
    120         for(i=1;i<=n;i++){
    121             L=lower_bound(id,id+k,t[i][0])-id+1;
    122             R=lower_bound(id,id+k,t[i][1])-id+1;
    123             update(1,k,1,L,R,i);
    124         }
    125 
    126         for(i=0;i<m;i++){
    127             printf("%d
    ",query(1,k,1,lower_bound(id,id+k,q[i])-id+1));
    128         }
    129     }
    130     return 0;
    131 }
  • 相关阅读:
    Leetcode Plus One
    Leetcode Swap Nodes in Pairs
    Leetcode Remove Nth Node From End of List
    leetcode Remove Duplicates from Sorted Array
    leetcode Remove Element
    leetcode Container With Most Water
    leetcode String to Integer (atoi)
    leetcode Palindrome Number
    leetcode Roman to Integer
    leetcode ZigZag Conversion
  • 原文地址:https://www.cnblogs.com/zhsl/p/3395876.html
Copyright © 2011-2022 走看看