zoukankan      html  css  js  c++  java
  • 神秘题目4

    神秘题目4

    题目描述

    给定二维平面内不同颜色的 (n) 个点,你需要写一个程序完成一下2种操作。

    1. 将第 (k) 个点的坐标改成 ((x,y)),颜色改成 (c)
    2. 求第 (L)(R) 个点中,两两不同颜色的点的曼哈顿距离最大值(若不存在输出0)。

    输入格式

    第一行 2 个整数 (n),(m)

    接下来 (n) 行,每行 3 个整数 (x,y,c) 描述第 (i) 个点的坐标和颜色。

    接下来 (m) 行,每行第一个整数 (opt)

    • (opt=1) ,接下来 3 个整数 (x,y,c) 表示一次修改操作
    • (opt=2),接下来 2 个整数 (L,R) 表示一次查询操作

    输出格式

    若干行每行一个整数,对应一次查询操作的答案。

    样例输入

    5 5
    -5 1 6
    2 1 3
    -5 7 3
    -5 1 7
    9 -9 9
    1 1 -1 7 3
    2 1 2
    2 1 4
    1 4 1 -9 5
    2 2 5
    

    样例输出

    0
    10
    30
    

    数据范围与约定

    对于 (10\%) 的数据 (n,m,|x|,|y|,c<=10)

    对于 (30\%) 的数据 (n,m<=1000)

    另有 (10\%) 的数据 (0<=x,y<=5) 任何时刻点的颜色各不相同,无修改

    另有 (10\%) 的数据 (x=y)

    另有 (10\%) 的数据 (|x|=|y|)

    对于 (100\%) 的数据 (n,m<=1e5,|x|,|y|,c<=1e9)

    时间限制:(1s)

    空间限制:(256MB)

    题解

    10分做法

    有脚就行

    30分做法

    有手就行

    另外10分

    注意到坐标值域非常小而且没修改颜色还都不一样,那这就很好办了。直接差分求 ((x+y),(x-y)) 的值有多少个,而不是求((x,y))有多少个,最后扫描一下就行了。复杂度 (O(n+q))

    另外10分

    线段树维护 (max(x)-min(x)),注意要留一个次大值和次小值(其颜色若和最大最小值同色,顺延到次次大值,次次小值)处理 (max(x))(min(x)) 这两个点颜色相同这种情况。

    另外10分

    还真不会针对这一档的做法

    满分做法

    线段树维护 (max(max(x+y)-min(x+y),max(x-y)-min(x-y))) ,注意要留一个次大值和次小值(其颜色若和最大最小值同色,顺延到次次大值,次次小值)处理 (max(xpm y))(min(x pm y)) 这两个点颜色相同这种情况,代码非常简单。

    #include<bits/stdc++.h>
    #define LL long long
    using namespace std;
    const int inf=1<<30;
    int n,m,C[100010];
    LL X[100010],Y[100010];
    int addcMAX,addcMax,addcMIN,addcMin;
    LL addMAX,addMax,addMIN,addMin;
    int subcMAX,subcMax,subcMIN,subcMin;
    LL subMAX,subMax,subMIN,subMin;
    struct SegmentTree
    {int l,r,addcMAX,addcMax,addcMIN,addcMin,subcMAX,subcMax,subcMIN,subcMin;LL addMAX,addMax,addMIN,addMin,subMAX,subMax,subMIN,subMin,x,y;}st[400010];
    inline int read()
    {
    	int x=0;bool w=0;char ch=0;
    	while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
    	while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    	return w?-x:x;
    }
    void upd(int p)
    {
    	st[p].addMAX=st[p].addMax=-inf;
    	st[p].addMIN=st[p].addMin=inf;
    	st[p].addcMAX=st[p].addcMax=st[p].addcMIN=st[p].addcMin=-10086;
    	if(st[p<<1].addMAX>st[p].addMAX){
    		if(st[p<<1].addcMAX!=st[p].addcMAX)
    			st[p].addMax=st[p].addMAX,st[p].addcMax=st[p].addcMAX;
    		st[p].addMAX=st[p<<1].addMAX;
    		st[p].addcMAX=st[p<<1].addcMAX;
    	}
    	if(st[p<<1].addMAX>st[p].addMax&&st[p<<1].addMAX<=st[p].addMAX&&st[p<<1].addcMAX!=st[p].addcMAX){
    		st[p].addMax=st[p<<1].addMAX;
    		st[p].addcMax=st[p<<1].addcMAX;
    	}
    	if(st[p<<1].addMax>st[p].addMax&&st[p<<1].addcMax!=st[p].addcMAX){
    		st[p].addMax=st[p<<1].addMax;
    		st[p].addcMax=st[p<<1].addcMax;
    	}
    	if(st[p<<1].addMIN<st[p].addMIN){
    		if(st[p<<1].addcMIN!=st[p].addcMIN)
    			st[p].addMin=st[p].addMIN,st[p].addcMin=st[p].addcMIN;
    		st[p].addMIN=st[p<<1].addMIN;
    		st[p].addcMIN=st[p<<1].addcMIN;
    	}
    	if(st[p<<1].addMIN<st[p].addMin&&st[p<<1].addMIN>=st[p].addMIN&&st[p<<1].addcMIN!=st[p].addcMIN){
    		st[p].addMin=st[p<<1].addMIN;
    		st[p].addcMin=st[p<<1].addcMIN;
    	}
    	if(st[p<<1].addMin<st[p].addMin&&st[p<<1].addcMin!=st[p].addcMIN){
    		st[p].addMin=st[p<<1].addMin;
    		st[p].addcMin=st[p<<1].addcMin;
    	}
    
    	if(st[p<<1|1].addMAX>st[p].addMAX){
    		if(st[p<<1|1].addcMAX!=st[p].addcMAX)
    			st[p].addMax=st[p].addMAX,st[p].addcMax=st[p].addcMAX;
    		st[p].addMAX=st[p<<1|1].addMAX;
    		st[p].addcMAX=st[p<<1|1].addcMAX;
    	}
    	if(st[p<<1|1].addMAX>st[p].addMax&&st[p<<1|1].addMAX<=st[p].addMAX&&st[p<<1|1].addcMAX!=st[p].addcMAX){
    		st[p].addMax=st[p<<1|1].addMAX;
    		st[p].addcMax=st[p<<1|1].addcMAX;
    	}
    	if(st[p<<1|1].addMax>st[p].addMax&&st[p<<1|1].addcMax!=st[p].addcMAX){
    		st[p].addMax=st[p<<1|1].addMax;
    		st[p].addcMax=st[p<<1|1].addcMax;
    	}
    	if(st[p<<1|1].addMIN<st[p].addMIN){
    		if(st[p<<1|1].addcMIN!=st[p].addcMIN)
    			st[p].addMin=st[p].addMIN,st[p].addcMin=st[p].addcMIN;
    		st[p].addMIN=st[p<<1|1].addMIN;
    		st[p].addcMIN=st[p<<1|1].addcMIN;
    	}
    	if(st[p<<1|1].addMIN<st[p].addMin&&st[p<<1|1].addMIN>=st[p].addMIN&&st[p<<1|1].addcMIN!=st[p].addcMIN){
    		st[p].addMin=st[p<<1|1].addMIN;
    		st[p].addcMin=st[p<<1|1].addcMIN;
    	}
    	if(st[p<<1|1].addMin<st[p].addMin&&st[p<<1|1].addcMin!=st[p].addcMIN){
    		st[p].addMin=st[p<<1|1].addMin;
    		st[p].addcMin=st[p<<1|1].addcMin;
    	}
    
    	st[p].subMAX=st[p].subMax=-inf;
    	st[p].subMIN=st[p].subMin=inf;
    	st[p].subcMAX=st[p].subcMax=st[p].subcMIN=st[p].subcMin=-10086;
    	if(st[p<<1].subMAX>st[p].subMAX){
    		if(st[p<<1].subcMAX!=st[p].subcMAX)
    			st[p].subMax=st[p].subMAX,st[p].subcMax=st[p].subcMAX;
    		st[p].subMAX=st[p<<1].subMAX;
    		st[p].subcMAX=st[p<<1].subcMAX;
    	}
    	if(st[p<<1].subMAX>st[p].subMax&&st[p<<1].subMAX<=st[p].subMAX&&st[p<<1].subcMAX!=st[p].subcMAX){
    		st[p].subMax=st[p<<1].subMAX;
    		st[p].subcMax=st[p<<1].subcMAX;
    	}
    	if(st[p<<1].subMax>st[p].subMax&&st[p<<1].subcMax!=st[p].subcMAX){
    		st[p].subMax=st[p<<1].subMax;
    		st[p].subcMax=st[p<<1].subcMax;
    	}
    	if(st[p<<1].subMIN<st[p].subMIN){
    		if(st[p<<1].subcMIN!=st[p].subcMIN)
    			st[p].subMin=st[p].subMIN,st[p].subcMin=st[p].subcMIN;
    		st[p].subMIN=st[p<<1].subMIN;
    		st[p].subcMIN=st[p<<1].subcMIN;
    	}
    	if(st[p<<1].subMIN<st[p].subMin&&st[p<<1].subMIN>=st[p].subMIN&&st[p<<1].subcMIN!=st[p].subcMIN){
    		st[p].subMin=st[p<<1].subMIN;
    		st[p].subcMin=st[p<<1].subcMIN;
    	}
    	if(st[p<<1].subMin<st[p].subMin&&st[p<<1].subcMin!=st[p].subcMIN){
    		st[p].subMin=st[p<<1].subMin;
    		st[p].subcMin=st[p<<1].subcMin;
    	}
    
    	if(st[p<<1|1].subMAX>st[p].subMAX){
    		if(st[p<<1|1].subcMAX!=st[p].subcMAX)
    			st[p].subMax=st[p].subMAX,st[p].subcMax=st[p].subcMAX;
    		st[p].subMAX=st[p<<1|1].subMAX;
    		st[p].subcMAX=st[p<<1|1].subcMAX;
    	}
    	if(st[p<<1|1].subMAX>st[p].subMax&&st[p<<1|1].subMAX<=st[p].subMAX&&st[p<<1|1].subcMAX!=st[p].subcMAX){
    		st[p].subMax=st[p<<1|1].subMAX;
    		st[p].subcMax=st[p<<1|1].subcMAX;
    	}
    	if(st[p<<1|1].subMax>st[p].subMax&&st[p<<1|1].subcMax!=st[p].subcMAX){
    		st[p].subMax=st[p<<1|1].subMax;
    		st[p].subcMax=st[p<<1|1].subcMax;
    	}
    	if(st[p<<1|1].subMIN<st[p].subMIN){
    		if(st[p<<1|1].subcMIN!=st[p].subcMIN)
    			st[p].subMin=st[p].subMIN,st[p].subcMin=st[p].subcMIN;
    		st[p].subMIN=st[p<<1|1].subMIN;
    		st[p].subcMIN=st[p<<1|1].subcMIN;
    	}
    	if(st[p<<1|1].subMIN<st[p].subMin&&st[p<<1|1].subMIN>=st[p].subMIN&&st[p<<1|1].subcMIN!=st[p].subcMIN){
    		st[p].subMin=st[p<<1|1].subMIN;
    		st[p].subcMin=st[p<<1|1].subcMIN;
    	}
    	if(st[p<<1|1].subMin<st[p].subMin&&st[p<<1|1].subcMin!=st[p].subcMIN){
    		st[p].subMin=st[p<<1|1].subMin;
    		st[p].subcMin=st[p<<1|1].subcMin;
    	}
    }
    void build(int p,int l,int r)
    {
    	st[p].l=l;st[p].r=r;
    	st[p].addMAX=st[p].addMax=-inf;
    	st[p].addMIN=st[p].addMin=inf;
    	st[p].addcMAX=st[p].addcMax=st[p].addcMIN=st[p].addcMin=-10086;
    
    	st[p].subMAX=st[p].subMax=-inf;
    	st[p].subMIN=st[p].subMin=inf;
    	st[p].subcMAX=st[p].subcMax=st[p].subcMIN=st[p].subcMin=-10086;
    	if(l==r){
    		st[p].addcMAX=st[p].addcMIN=C[l];
    		st[p].addMAX=X[l]+Y[l];
    		st[p].addMIN=X[l]+Y[l];
    		//st[p<<1].addMAX=st[p<<1].addMax=st[p<<1|1].addMAX=st[p<<1|1].addMax=-inf;
    		//st[p<<1].addMIN=st[p<<1].addMin=st[p<<1|1].addMIN=st[p<<1|1].addMin=inf;
    		st[p].subcMAX=st[p].subcMIN=C[l];
    		st[p].subMAX=X[l]-Y[l];
    		st[p].subMIN=X[l]-Y[l];
    		//st[p<<1].subMAX=st[p<<1].subMax=st[p<<1|1].subMAX=st[p<<1|1].subMax=-inf;
    		//st[p<<1].subMIN=st[p<<1].subMin=st[p<<1|1].subMIN=st[p<<1|1].subMin=inf;
    		return;
    	}
    	int mid=(l+r)>>1;
    	build(p<<1,l,mid);
    	build(p<<1|1,mid+1,r);
    	upd(p);
    }
    void change(int p,int pos)
    {
    	if(st[p].l==st[p].r){
    		st[p].addcMAX=st[p].addcMIN=C[pos];
    		st[p].addMAX=X[pos]+Y[pos];
    		st[p].addMIN=X[pos]+Y[pos];
    
    		st[p].subcMAX=st[p].subcMIN=C[pos];
    		st[p].subMAX=X[pos]-Y[pos];
    		st[p].subMIN=X[pos]-Y[pos];
    		return;
    	}
    	int mid=(st[p].l+st[p].r)>>1;
    	if(pos<=mid)change(p<<1,pos);
    	else change(p<<1|1,pos);
    	upd(p);
    }
    void ask(int p,int l,int r)
    {
    	if(l<=st[p].l&&st[p].r<=r){
    		if(st[p].addMAX>addMAX){
    			if(st[p].addcMAX!=addcMAX)addMax=addMAX,addcMax=addcMAX;
    			addMAX=st[p].addMAX;addcMAX=st[p].addcMAX;
    		}
    		if(st[p].addMAX>addMax&&st[p].addMAX<=addMAX&&st[p].addcMAX!=addcMAX)
    			addMax=st[p].addMAX,addcMax=st[p].addcMAX;
    		if(st[p].addMax>addMax&&st[p].addcMax!=addcMAX)
    			addMax=st[p].addMax,addcMax=st[p].addcMax;
    		if(st[p].addMIN<addMIN){
    			if(st[p].addcMIN!=addcMIN)addMin=addMIN,addcMin=addcMIN;
    			addMIN=st[p].addMIN;addcMIN=st[p].addcMIN;
    		}
    		if(st[p].addMIN<addMin&&st[p].addMIN>=addMIN&&st[p].addcMIN!=addcMIN)
    			addMin=st[p].addMIN,addcMin=st[p].addcMIN;
    		if(st[p].addMin<addMin&&st[p].addcMin!=addcMIN)
    			addMin=st[p].addMin,addcMin=st[p].addcMin;
    
    		if(st[p].subMAX>subMAX){
    			if(st[p].subcMAX!=subcMAX)subMax=subMAX,subcMax=subcMAX;
    			subMAX=st[p].subMAX;subcMAX=st[p].subcMAX;
    		}
    		if(st[p].subMAX>subMax&&st[p].subMAX<=subMAX&&st[p].subcMAX!=subcMAX)
    			subMax=st[p].subMAX,subcMax=st[p].subcMAX;
    		if(st[p].subMax>subMax&&st[p].subcMax!=subcMAX)
    			subMax=st[p].subMax,subcMax=st[p].subcMax;
    		if(st[p].subMIN<subMIN){
    			if(st[p].subcMIN!=subcMIN)subMin=subMIN,subcMin=subcMIN;
    			subMIN=st[p].subMIN;subcMIN=st[p].subcMIN;
    		}
    		if(st[p].subMIN<subMin&&st[p].subMIN>=subMIN&&st[p].subcMIN!=subcMIN)
    			subMin=st[p].subMIN,subcMin=st[p].subcMIN;
    		if(st[p].subMin<subMin&&st[p].subcMin!=subcMIN)
    			subMin=st[p].subMin,subcMin=st[p].subcMin;
    		return;
    	}
    	int mid=(st[p].l+st[p].r)>>1;
    	if(l<=mid)ask(p<<1,l,r);
    	if(r>mid)ask(p<<1|1,l,r);
    }
    LL calc()
    {
    	LL temp=0;
    	if(addcMAX!=addcMIN)temp=max(temp,addMAX-addMIN);
    	if(addcMAX!=addcMin)temp=max(temp,addMAX-addMin);
    	if(addcMax!=addcMIN)temp=max(temp,addMax-addMIN);
    	if(subcMAX!=subcMIN)temp=max(temp,subMAX-subMIN);
    	if(subcMAX!=subcMin)temp=max(temp,subMAX-subMin);
    	if(subcMax!=subcMIN)temp=max(temp,subMax-subMIN);
    	return temp;
    }
    int main()
    {
    	freopen("dis.in","r",stdin);
    	freopen("dis.out","w",stdout);
    	n=read();m=read();
    	for(int i=1;i<=n;i++)
    		X[i]=read(),Y[i]=read(),C[i]=read();
    	build(1,1,n);
    	while(m--){
    		int opt=read(),l=read(),r=read();
    		if(opt&1){
    			X[l]=r;Y[l]=read();C[l]=read();
    			change(1,l);
    		}else{
    			addMAX=addMax=-inf;addMIN=addMin=inf;
    			addcMAX=addcMax=addcMIN=addcMin=-10086;
    			subMAX=subMax=-inf;subMIN=subMin=inf;
    			subcMAX=subcMax=subcMIN=subcMin=-10086;
    			ask(1,l,r);
    			printf("%lld
    ",calc());
    		}
    	}
    }
    
  • 相关阅读:
    [atARC100F]Colorful Sequences
    [atARC103D]Robot Arms
    [atARC107F]Sum of Abs
    [atAGC047F]Rooks
    [loj3278]收获
    [cf809E]Surprise me
    [cf997E]Good Subsegments
    [cf603E]Pastoral Oddities
    Codeforces Round #453
    Educational Codeforces Round 32
  • 原文地址:https://www.cnblogs.com/zYzYzYzYz/p/14449107.html
Copyright © 2011-2022 走看看