zoukankan      html  css  js  c++  java
  • 洛谷 U138625 神来之笔

    洛谷 U138625 神来之笔

    洛谷传送门

    题目背景

    某日午后,SeawaySeawa**y一觉醒来,发现自己穿越到了俄罗丝,并成了罗丝(RoseRos**e)沙皇的御用艺术家......在反穿越失败后,SeawaySeawa**y接受了这个事实,并努力地为女皇陛下效劳......

    题目描述

    女皇陛下喜欢两件事:艺术和种树。一直以来,女皇陛下都致力于把这两件事结合起来。所以她让SeawaySeawa**y来完成这件事。女皇陛下把SeawaySeawa**y带到了御花园,指着其中的一棵树,向他描述了她对艺术的看法:女皇陛下认为,多彩就是艺术,但同时,颜色又不能太多,过多的颜色不叫艺术。她要SeawaySeawa**y依照她的看法,为这棵树进行艺术地染色。

    女皇陛下的其他艺术家已经把这棵树染成了初始颜色。SeawaySeawa**y需要以此为基础,对整棵树的颜色进行修改,他会把某一棵子树统一改变颜色(子树的划分以11号点为全树总根)。同时,女皇陛下会在一旁监工,她会在任意时刻询问SeawaySeawa**y某棵子树一共有多少种颜色。

    输入格式

    从文件leebai.inleeba**i.i**n中读入数据。

    第一行为两个整数N,MN,M,表示树的节点数和总共的修改+询问次数。第二行有NN个整数,表示每个节点初始的颜色。接下来的N-1N−1行,每行两个整数u,vu,v,表示节点u,vu,v间连有一条边。接下来的MM行,每行2-32−3个整数,按如下格式:

    1 x c:1 x c:将以xx为根的子树上所有节点(包括xx节点)的颜色改为cc

    2 x:2 x:询问以xx为根的子树上所有节点的颜色数量。

    输出格式

    输出到文件leebai.outleeba**i.out中。

    对于每个询问操作,给出确切的答案。


    命题背景:

    可能算是背景?女皇陛下VS老婆大人。(滑稽(惶恐

    终于学会了如何更有区分度地出部分分。


    题解:

    一道水到可以让我1A的题目。

    应该50分还是很好拿的?

    或者,至少20分是很好拿的?

    颜色小于60种,且染色,一下子就是想到状压。由于60种,可以用一个longlong来保存这个状态,然后用线段树维护颜色种数即可。(也就是数1)区间合并的时候用或啦。

    原题是不超过60种颜色,所以可以用longlong,这道题稍微毒瘤一点,100位,嘿嘿,其实还可以更大,但是懒得改数据了。

    这个时候还是需要介绍bitset。我一直贼喜欢stl,大家也是知道的。

    了解一下bitset的相关函数,还是很容易做的。

    而且时间复杂度也并没有比60的慢多少。如果加上读入优化的,我感觉我还能再来16倍的。

    算了,不毒瘤了,来:

    代码:

    #include<cstdio>
    #include<bitset>
    #define lson pos<<1
    #define rson pos<<1|1
    using namespace std;
    const int maxn=4*1e5+10;
    int n,m;
    int col[maxn];
    int tot,head[maxn],nxt[maxn<<1],to[maxn<<1];
    int deep[maxn],fa[maxn],son[maxn],size[maxn];
    int top[maxn],id[maxn],w[maxn],cnt;
    bitset<64> tree[maxn<<2];
    int lazy[maxn<<2];
    void add(int x,int y)
    {
    	to[++tot]=y;
    	nxt[tot]=head[x];
    	head[x]=tot;
    }
    void dfs1(int x,int f)
    {
    	deep[x]=deep[f]+1;
    	fa[x]=f;
    	size[x]=1;
    	for(int i=head[x];i;i=nxt[i])
    	{
    		int y=to[i];
    		if(y==f)
    			continue;
    		dfs1(y,x);
    		size[x]+=size[y];
    		if(!son[x]||size[y]>size[son[x]])
    			son[x]=y;
    	}
    }
    void dfs2(int x,int t)
    {
    	top[x]=t;
    	id[x]=++cnt;
    	w[cnt]=col[x];
    	if(!son[x])
    		return;
    	dfs2(son[x],t);
    	for(int i=head[x];i;i=nxt[i])
    	{
    		int y=to[i];
    		if(y==fa[x]||y==son[x])
    			continue;
    		dfs2(y,y);
    	}
    }
    void pushup(int pos)
    {
    	tree[pos]=tree[lson]|tree[rson];
    }
    void build(int pos,int l,int r)
    {
    	int mid=(l+r)>>1;
    	if(l==r)
    	{
    		tree[pos].set(w[l],1);
    		return;
    	}
    	build(lson,l,mid);
    	build(rson,mid+1,r);
    	pushup(pos);
    }
    void mark(int pos,int l,int r,int k)
    {
    	lazy[pos]=k;
    	tree[pos].reset();
    	tree[pos].set(k,1);
    }
    void pushdown(int pos,int l,int r)
    {
    	int mid=(l+r)>>1;
    	mark(lson,l,mid,lazy[pos]);
    	mark(rson,mid+1,r,lazy[pos]);
    	lazy[pos]=0;	
    }
    void update(int pos,int l,int r,int x,int y,int k)
    {
    	int mid=(l+r)>>1;
    	if(x<=l && r<=y)
    	{
    		mark(pos,l,r,k);
    		return;
    	}
    	if(lazy[pos])
    		pushdown(pos,l,r);
    	if(x<=mid)
    		update(lson,l,mid,x,y,k);
    	if(y>mid)
    		update(rson,mid+1,r,x,y,k);
    	pushup(pos);
    }
    bitset<64> query(int pos,int l,int r,int x,int y)
    {
    	bitset<64> ret;
    	int mid=(l+r)>>1;
    	if(x<=l && r<=y)
    		return tree[pos];
    	if(lazy[pos])
    		pushdown(pos,l,r);
    	if(x<=mid)
    		ret|=query(lson,l,mid,x,y);
    	if(y>mid)
    		ret|=query(rson,mid+1,r,x,y);
    	return ret;
    }
    int main()
    {
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=n;i++)
    		scanf("%d",&col[i]);
    	for(int i=1;i<n;i++)
    	{
    		int x,y;
    		scanf("%d%d",&x,&y);
    		add(x,y);
    		add(y,x);
    	}
    	dfs1(1,0);
    	dfs2(1,1);
    	build(1,1,n);
    	for(int i=1;i<=m;i++)
    	{
    		int opt,x,c;
    		scanf("%d",&opt);
    		if(opt==1)
    		{
    			scanf("%d%d",&x,&c);
    			update(1,1,n,id[x],id[x]+size[x]-1,c);
    		}
    		else
    		{
    			scanf("%d",&x);
    			int ans=query(1,1,n,id[x],id[x]+size[x]-1).count();
    			printf("%d
    ",ans);
    		}	
    	}
    	return 0;
    }
    
    
  • 相关阅读:
    Maven+SSM框架搭建【spring+springmvc+mybatis】
    [福大软工] W班 总成绩排行榜
    项目Beta冲刺团队随笔集
    45度炸队Alpha冲刺博客集
    SDN期末验收
    小黄衫——共同的荣誉
    软件工程实践总结作业
    SDN第五次上机作业
    SDN第四次作业
    总结随笔
  • 原文地址:https://www.cnblogs.com/fusiwei/p/13914048.html
Copyright © 2011-2022 走看看