BZOJ 1594: [Usaco2008 Jan]猜数游戏 线段树 + 思维 + 二分

博客内容仅提及了'Code',未包含更多关键信息。
部署运行你感兴趣的模型镜像

Code:

#include<bits/stdc++.h>
#define maxn 3000000
using namespace std;
void setIO(string s)
{
    string in=s+".in"; 
    freopen(in.c_str(),"r",stdin); 
}
int n,Q;   
struct OPT
{
    int l,r,v;    
}opt[maxn],yy[maxn]; 
bool cmp(OPT a,OPT b)
{
    return a.v>b.v; 
}
struct Seg
{
    #define lson (x<<1)
    #define rson ((x<<1)|1)
    int lazy[maxn<<2],sumv[maxn<<2]; 
    void re()
    {
        memset(lazy,0,sizeof(lazy)); 
        memset(sumv,0,sizeof(sumv));    
    }
    void mark(int l,int r,int x)
    {        
        sumv[x]=r-l+1; 
        lazy[x]=1;     
    }
    void pushdown(int l,int r,int x)
    {
        if(lazy[x])
        {
            int mid=(l+r)>>1; 
            if(l<=mid) mark(l,mid,lson); 
            if(r>mid) mark(mid+1,r,rson); 
            lazy[x]=0; 
        }
    }
    void update(int l,int r,int x,int L,int R)
    {
        if(l>=L&&r<=R) 
        {
            mark(l,r,x); 
            return; 
        }
        pushdown(l,r,x); 
        int mid=(l+r)>>1; 
        if(L<=mid) update(l,mid,lson,L,R); 
        if(R>mid) update(mid+1,r,rson,L,R); 
        sumv[x]=sumv[lson]+sumv[rson]; 
    }
    int query(int l,int r,int x,int L,int R)
    {
        if(l>=L&&r<=R) return sumv[x]; 
        pushdown(l,r,x); 
        int mid=(l+r)>>1,tmp=0; 
        if(L<=mid) tmp+=query(l,mid,lson,L,R); 
        if(R>mid)  tmp+=query(mid+1,r,rson,L,R); 
        return tmp;    
    }   
}tr; 
bool check(int mid)
{
    int i,j,k,l1,r1,l2,r2;             
    tr.re(); 
    for(i=1;i<=mid;++i) yy[i]=opt[i]; 
    sort(yy+1,yy+1+mid,cmp); 
    for(i=1;i<=mid;i=j)
    {
        for(j=i;j<=mid&&yy[j].v==yy[i].v;++j); 
        l1=l2=yy[i].l;
        r1=r2=yy[i].r; 
        for(k=i+1;k<j;++k)
        {
            l1=min(l1,yy[k].l); 
            l2=max(l2,yy[k].l); 
            r1=max(r1,yy[k].r); 
            r2=min(r2,yy[k].r); 
        }
        if(l2>r2) return true;     // 无并集
        if(tr.query(1,n,1,l2,r2)==r2-l2+1) return true; 
        tr.update(1,n,1,l1,r1);    
    }
    return false; 
}
int main()
{
    // setIO("input");          
    scanf("%d%d",&n,&Q); 
    for(int i=1;i<=Q;++i)
    {
        scanf("%d%d%d",&opt[i].l,&opt[i].r,&opt[i].v); 
    }    
    int l=1,r=Q,ans=0; 
    while(l<=r)
    {
        int mid=(l+r)>>1; 
        if(check(mid)) 
            r = mid - 1, ans=mid; 
        else 
            l=mid+1; 
    }  
    printf("%d\n",ans); 
    return 0; 
}

  

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值