ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

D---Tulip Festival 0(离散化+线段树+vector)

2021-06-05 19:03:26  阅读:206  来源: 互联网

标签:rt val Tulip Festival 郁金香 tree pos --- int


Tulip Festival 0
Description

题目链接https://csustacm.fun/problem/1114

美丽的植物园.

这是一个空气清新、景色秀丽的绿化园,这是一个阳光明媚的下午,咕咕ppq带小姐姐来植物园play了。那里到处绿树成荫、鸟语花香。

渐渐地走到了郁金香园,看到那一排的美丽郁金香。一排共有n个郁金香,小姐姐想知道有多少个郁金香是完美的。

每个郁金香有一个香度ai,设区间[L,R]内所有郁金香的香度的异或值为X,这个区间内只有香度不等于X的郁金香才是完美的郁金香。

咕咕ppq开始演了,他一共演了m次,有两种演法:修改第p个郁金香的香度为x;询问区间[L,R]内完美郁金香的数量。

Input

两个数字n,m,意义如题。1≤n≤1000000,1≤m≤100000
n个数字ai表示第ii个郁金香的香度。0≤ai ≤1000000000
接下来m行,每行三个数字:1 p x 或 2 L R。
分别表示第一种演法和第二种演法。1≤p≤n,0≤x≤1000000000;1≤L≤R≤n
数据保证序列中相同的数字不会超过200个。

Output

对每个第二种演法输出该区间内完美郁金香的个数。(保证至少有一个第二种演法)

Sample Input 1

4 1
1 2 3 3
2 1 4

Sample Output 1

2


emmm,区间问题特别涉及到修改,很容易联系到线段树,这里我们可以用线段树来维护区间的异或值,这个原理和线段树的区间和问题一样就不多说了。

接下来我们要寻找区间L-R中不数值不相同的个数,简单转换一下就变成了R-L+1-相同的个数。那么我们的目的就是求相同的个数了。我们可以开一个数组,将每一个相同的值放入并记录他的坐标,想到这里就会不由想到DJ最短路的优化-vector存图。

那么接下来就好办了,我们只需要在该数组中寻找就好了(最多找200次),观察下标是否在L-R的区间里就ok了。

但还没完,0≤ai ≤1000000000,所以我们必须将数据压缩,不然就会MLE了,emmm而这也就是离散化的作用了:压缩数据来优化时间和空间。

void lisan()
{
	for (int i=1; i<num; i++)
	 b[i]=a[i];
	sort(b+1,b+num);
	int p=-1,k=0;
	for (int i=1; i<num; i++){
		if (b[i].val!=p){
			q[b[i].val]=++k;
			p=b[i].val;
		}
	}
	for (int i=1; i<num; i++){
		g[q[b[i].val]].push_back(b[i].pos);
		qs[b[i].val]++;
	}
	tot=k;
}

我们先给每个值排个序,最多会有100万个数据不一样,依旧是说我们可以将数据压缩到100万以内,然后用unordered_map映射(map的速度很慢)。。。然后这题就over了

#include <bits/stdc++.h>
using namespace std; 
const int mac=1e6+1e5+10;
struct node
{
	int val,l,r;
}tree[mac*4];
vector<int>g[mac];
unordered_map<int,int>q,qs;
struct node1
{
	int pos,val;
	bool friend operator <(node1 a,node1 b){
		return a.val<b.val;
	}
}a[mac],b[mac];
int tot=0,ans=0,num=1;
void build(int rt,int l,int r);
void change(int rt,int pos,int x,int just);
void ask(int rt,int l,int r);
void lisan();
int main()
{
	int n,m;
	scanf ("%d%d",&n,&m);
	build(1,1,n);
	lisan();
	int id,p,x,l,r;
	for (int i=1; i<=m; i++){
		scanf ("%d",&id);
		if (id==1){
			scanf ("%d%d",&p,&x);
			int now=a[p].val;
			for (int j=0; j<g[q[now]].size(); j++){
				if (g[q[now]][j]==p){
					g[q[now]].erase(g[q[now]].begin()+j);
					break;
				} 
			}
			qs[a[p].val]--;
			if (!qs[x]) q[x]=++tot;
			qs[x]++;
			g[q[x]].push_back(p);
			change(1,p,x,a[p].val);
		}
		else {
			scanf ("%d%d",&l,&r);
			ans=0;
			int yes=0;
			ask(1,l,r);
			if (!q[ans]) printf ("%d\n",r-l+1);
			else {
				for (int j=0; j<g[q[ans]].size(); j++){
					if (g[q[ans]][j]>=l && g[q[ans]][j]<=r){
						yes++;
					} 
				}
				printf ("%d\n",r-l+1-yes);
			}
		}
	}
	return 0;
}
void build(int rt,int l,int r)
{
	tree[rt].l=l;tree[rt].r=r;
	if (l==r){
		scanf ("%d",&tree[rt].val);
		a[num].val=tree[rt].val;
		a[num].pos=l;
		num++;
		return;
	}	
	int mid=(l+r)>>1;
	build(rt*2,l,mid);
	build(rt*2+1,mid+1,r);
	tree[rt].val=tree[rt*2].val^tree[rt*2+1].val;
}
void change(int rt,int pos,int x,int just)
{
	if (tree[rt].l>=pos && tree[rt].r<=pos){
	    tree[rt].val=x;
		return; 
	}
	int mid=(tree[rt].l+tree[rt].r)>>1;
	if (mid>=pos) change(rt*2,pos,x,just);
	else change(rt*2+1,pos,x,just);	
	tree[rt].val=tree[rt*2].val^tree[rt*2+1].val;
}
void ask(int rt,int l,int r){
	if (tree[rt].l>=l && tree[rt].r<=r){
		ans^=tree[rt].val;
		return; 
	}
	int mid=(tree[rt].l+tree[rt].r)>>1;
	if (mid>=l) ask(rt*2,l,r);
	if (mid<r) ask(rt*2+1,l,r);	
}
void lisan()
{
	for (int i=1; i<num; i++)
	 b[i]=a[i];
	sort(b+1,b+num);
	int p=-1,k=0;
	for (int i=1; i<num; i++){
		if (b[i].val!=p){
			q[b[i].val]=++k;
			p=b[i].val;
		}
	}
	for (int i=1; i<num; i++){
		g[q[b[i].val]].push_back(b[i].pos);
		qs[b[i].val]++;
	}
	tot=k;
}

标签:rt,val,Tulip,Festival,郁金香,tree,pos,---,int
来源: https://blog.51cto.com/u_15249461/2870456

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有