zoukankan      html  css  js  c++  java
  • JZOJ5821手机信号

    用set维护,(l,r,v),注意边界,保证了两个端点l,r一定有信号站

    增加有三种可能,1.直接加(没有影响),2.将原本的一个区间变成两个 3.将原本的一个区间变成三个

    删除有三种情况,1.全包含直接删 2.部分删除 ,要增加一个 3.部分删除要增加两个

    code:

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<cctype>
    #include<set>
    #include<cmath>
    using namespace std;
    const int MAXX=200010;
    const long long inff=2000000000000000000ll;
    struct node
    {
    	node(){}
    	node(long long a,long long b,long long c){l=a;r=b;v=c;}
    	long long l,r,v;
    	bool operator <(const node &a)const {
                return l<a.l;
    	}
    };
    set<node>s;
    int n;
    long long w;
    inline long long rd(){
    	long long x=0;bool f=0;
    	char c=getchar();
    	while(!isdigit(c)){
    		if(c=='-')f=1;
    		c=getchar();
    	}
    	while(isdigit(c)){
    		x=(x<<1)+(x<<3)+(c^48);
    		c=getchar();
    	}
    	return f?-x:x;
    }
    inline void buld(long long l,long long r,long long v){
        s.insert(node(l,r - (r - l) % v,v));
        set<node>::iterator it=s.lower_bound(node(l,r - (r - l)%v,v)),ptr;
        if(it!=s.begin()){
            ptr=--it;
            node p=*ptr;
            if(ptr -> r >= l){
            	s.erase(ptr);
                if(l-1 >= p.l)s.insert(node(p.l,l - 1 - (l - 1 - p.l) % p.v,p.v));
                if(r+1 <= p.r){
                	long long lef;
                	if((r + 1 - p.l) % p.v == 0)lef = r + 1;
                	else lef=r + 1 + p.v - (r + 1 - p.l) % p.v;
                    s.insert(node(lef,p.r,p.v)); 
                }
            }
        }
    }
    inline void del(long long l,long long r){
    	set<node>::iterator bg=s.upper_bound(node(l,r,1));
    	set<node>::iterator ed=s.upper_bound(node(r,r,1));
    	if(bg != s.begin())bg--;
    	for(set<node>::iterator it = bg;it != ed;){
    		set<node>::iterator ptr = it;
    		node p=*it;
    		it++;//注意要先++,因为之后会把他删掉
            if(p.r >= l){
            	s.erase(ptr);
            	if(l - 1 >= p.l)s.insert(node(p.l,l - 1 - (l - 1 -p.l) % p.v,p.v));
            	if(r + 1 <= p.r){
            		long long lef ;
            		if((r + 1 - p.l) % p.v == 0) lef = r + 1 ;
            		else lef =r + 1 + p.v - (r + 1 - p.l) % p.v;
            		s.insert(node(lef,p.r,p.v)); 
            	}
            }
    	}
    }
    inline long long query(long long x){
    	long long d;
        if(s.size()==1)return 0;
        set<node>::iterator nxt = s.lower_bound(node(x,x,1));
        set<node>::iterator las = nxt;
        if(las != s.begin())las--;
        if(las -> r >= x && las -> l <= x){
             long long lef = x - (x - las -> l) % las -> v;
             long long rig = x + las -> v - (x - las -> l) % las -> v; 
             d=min(abs(x - lef) , abs(x - rig));
    
        }else if(nxt -> l <= x && nxt -> r >= x){
             long long lef = x - (x - nxt -> l) % nxt -> v;
             long long rig = x + nxt -> v - (x - nxt -> l) % nxt -> v; 
             d=min(abs(x - lef) , abs(x - rig));
        }else d=min(abs(las -> r - x),abs(nxt -> l - x));
        long long  ans = w - d * d;
        return max(0ll,ans);
    }
    int main(){
    	freopen("cellphone.in","r",stdin);
    	freopen("cellphone.out","w",stdout);
    	n=rd();w=rd();
    	s.insert(node(inff,inff+1,1));
    	for(int i=1;i<=n;++i){
    		char s[20];
    		long long l,r,v,x;
    		scanf("%s",&s);
    	    if(s[0]=='c'){
                l=rd();r=rd();v=rd();
                buld(l,r,v);
    	    }else if(s[0]=='d'){
                l=rd();r=rd();
                del(l,r);
    	    }else if(s[0]=='q'){
    	    	x=rd();
    	    	#ifndef LOCAL
    	    	printf("%lld
    ",query(x));
    	    	#else
    	    	cout<<query(x)<<endl;
    	    	#endif
    	    }
    	}
    	return 0;
    }
    
  • 相关阅读:
    不同长度的数据进行位运算
    Linux的sleep()和usleep()的使用和区别
    linux inode已满解决方法
    Debian 系统修改语言设置成英文
    IIS设置问题
    Ajax实现跨域访问的三种方法
    HTML--备忘点
    C#基础---值类型和引用类型
    dapper.net框架使用随笔
    WebService的搭建,部署,简单应用和实体类结合使用
  • 原文地址:https://www.cnblogs.com/ARTlover/p/9780247.html
Copyright © 2011-2022 走看看