zoukankan      html  css  js  c++  java
  • P2898 [USACO08JAN]haybale猜测Haybale Guessing 线段树 二分答案

      给一段长度为n,每个位置上的数都不同的序列a[1..n]和q和问答,每个问答是(x, y, r)代表RMQ(a, x, y) = r, 要你给出最早的有矛盾的那个问答的编号。(此处 RMQ 指最小值)

    毫无头绪的一题  看了题解实在是精妙

    显然如果有矛盾的话显然只有两种情况

    1最小值相同的多个问答一定要有交集(因为每种数字只有一个)

    2最小值比较小的问答的交集 如果在最小值比较大 的并集内  

    因为答案满足单调性  所以可以用二分答案!!!

    #include<bits/stdc++.h>
    using namespace std;
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define repp(i,a,b) for(int i=(a);i>=(b);--i)
    #define ll long long
    #define see(x) (cerr<<(#x)<<'='<<(x)<<endl)
    #define inf 0x3f3f3f3f
    #define CLR(A,v)  memset(A,v,sizeof A)
    /////////////////////////////////////
    const int N=1e6+100;
    int t[N<<2],n,m,q,len[N<<2],col[N<<2];
    void build(int l,int r,int pos)
    {
        len[pos]=r-l+1;col[pos]=0;
        if(l==r){t[pos]=0;return;}
        int m=(l+r)>>1;
        build(l,m,pos<<1);
        build(m+1,r,pos<<1|1);
        t[pos]=t[pos<<1]+t[pos<<1|1];
    }
    void down(int pos)
    {
        if(!col[pos])return ;
        col[pos<<1]=col[pos<<1|1]=1;col[pos]=0;
        t[pos<<1]=len[pos<<1];
        t[pos<<1|1]=len[pos<<1|1];
    }
    void upsum(int L,int R,int l,int r,int pos)
    {
        if(L<=l&&r<=R){t[pos]=len[pos];col[pos]=1;return ;}
        int m=(l+r)>>1;down(pos);
        if(L<=m)upsum(L,R,l,m,pos<<1);
        if(R>m)upsum(L,R,m+1,r,pos<<1|1);
        t[pos]=t[pos<<1]+t[pos<<1|1];
    }
    int qsum(int L,int R,int l,int r,int pos)
    {
        if(L<=l&&r<=R)return t[pos];
        int m=(l+r)>>1,ans=0;down(pos);
        if(L<=m)ans+=qsum(L,R,l,m,pos<<1);
        if(R>m)ans+=qsum(L,R,m+1,r,pos<<1|1);
        return ans;
    }
    struct node
    {
        int L,R,v;
    }s[N],a[N];
    bool check(int x)
    {
        build(1,n,1);
        rep(i,1,x)a[i]=s[i];
        sort(a+1,a+1+x,[](node a,node b){return a.v>b.v;});
        int pre=1,nl=a[1].L,nr=a[1].R,ul=a[1].L,ur=a[1].R;
        rep(i,2,x)
        {
            if(a[i].v==a[pre].v)
            {
                nl=max(nl,a[i].L);
                ul=min(ul,a[i].L);
                nr=min(nr,a[i].R);
                ur=max(ur,a[i].R);
            }
            else
            {
                if(nl>nr)return false;
                if(nr-nl+1==qsum(nl,nr,1,n,1))return false;
                upsum(ul,ur,1,n,1);
                pre=i;
                nl=ul=a[i].L;
                nr=ur=a[i].R;
            }
        }
        if(nl>nr)return false;
        if(nr-nl+1==qsum(nl,nr,1,n,1))return false;
        return true;
    }
    int main()
    {
        scanf("%d%d",&n,&m);rep(i,1,m)scanf("%d%d%d",&s[i].L,&s[i].R,&s[i].v);
        int L=1,R=m,ans=-1;
        while(L<=R)
        {
            int mid=(L+R)>>1;
            if(check(mid))ans=mid,L=mid+1;
            else R=mid-1;
        }
        if(ans==m)printf("0");
        else printf("%d
    ",ans+1);
        return 0;
    }
    View Code
  • 相关阅读:
    Windows 8.1 序列化与反序列化
    window store app 附件读取
    Window 8.1 计时器功能及图片切换
    c#多层嵌套Json
    isNotNull与isNotEmpty的区别
    商务用语
    国家气象局三天天气WebService接口
    WebServise
    EF架构基础代码
    接口定义
  • 原文地址:https://www.cnblogs.com/bxd123/p/11413058.html
Copyright © 2011-2022 走看看