首页 > 其他分享 >[POI2014] KUR-Couriers

[POI2014] KUR-Couriers

时间:2024-01-23 17:16:01浏览次数:23  
标签:cnt int sum KUR POI2014 mid tot ans Couriers

  • 可持久化线段树
  • 维护由任意一段区间得到的权值线段树
  • 线段树的深度:\(ceil(log_{2}(n))+1\)
  • 由于询问的特殊性,我们可以直接在线段树上二分,而不需要另写查询函数,从而节省掉1个log的复杂度
点击查看代码
#include <bits/stdc++.h>
using namespace std;
int tot,root[500005];
int read1()
{
	char cc=getchar();
	while(!(cc>=48&&cc<=57))
	{
		if(cc=='-')
		{
			break;
		}
		cc=getchar();
	}
	bool f=false;
	int s=0;
	if(cc=='-')
	{
		f=true;
	}
	else
	{
		s=cc-48;
	}
	while(1)
	{
		cc=getchar();
		if(cc>=48&&cc<=57)
		{
			s=s*10+cc-48;
		}
		else
		{
			break;
		}
	}
	if(f==true)
	{
		s=-s;
	}
	return s;
}
struct t1
{
	int l,r,cnt;
}t[11000005];
int build(int l,int r)
{
	if(l==r)
	{
		tot++;
		t[tot].cnt=0;
		return tot;
	}
	int mid=(l+r)>>1;
	tot++;
	int p=tot;
	t[p].l=build(l,mid);
	t[p].r=build(mid+1,r);
	t[p].cnt=0;
	return tot;
}
int insert(int c,int q,int l,int r)
{
	tot++;
	int p=tot;
	if(c==l&&l==r)
	{
		t[p].cnt=t[q].cnt+1;
		return p;
	}
	int mid=(l+r)>>1;
	if(c<=mid)
	{
		t[p].l=insert(c,t[q].l,l,mid);
		t[p].r=t[q].r;
	}
	else
	{
		t[p].r=insert(c,t[q].r,mid+1,r);
		t[p].l=t[q].l;
	}
	t[p].cnt=t[t[p].l].cnt+t[t[p].r].cnt;
	return p;
}
/*
int ask(int l,int r,int p,int u,int v)
{
	if(l<=u&&v<=r)
	{
		return t[p].cnt;
	}
	int mid=(u+v)>>1;
	int ans=0;
	if(l<=mid)
	{
		ans=ans+ask(l,r,t[p].l,u,mid);
	}
	if(r>mid)
	{
		ans=ans+ask(l,r,t[p].r,mid+1,v);
	}
	return ans;
}
*/
int main()
{
//	freopen("P3567_53.in","r",stdin);
//	cout<<500000*20*4*3/1024/1024<<endl;
	int n,m;
	cin>>n>>m;
	root[0]=build(1,n);
	for(int i=1;i<=n;i++)
	{
		int a=read1();
		root[i]=insert(a,root[i-1],1,n);
	}
	for(int i=1;i<=m;i++)
	{
		int u,v,len;
		u=read1();
		v=read1();
		len=v-u+1;
		int l=1,r=n,sum=len;
		u=root[u-1];v=root[v];
		bool f=true;
		while(l<r)
		{
			int mid=(l+r)>>1;
			//int cnt=ask(l,mid,root[v],1,n)-ask(l,mid,root[u-1],1,n);
			int cnt=t[t[v].l].cnt-t[t[u].l].cnt;
			if(2*cnt>len)
			{
				r=mid;
				sum=cnt;
				u=t[u].l;
				v=t[v].l;
			}
			else if(2*(sum-cnt)>len)
			{
				l=mid+1;
				sum=sum-cnt;
				u=t[u].r;
				v=t[v].r;
			}
			else
			{
				f=false;
				break;
			}
		}
		if(f==true)
		{
			printf("%d\n",l);
		}
		else
		{
			printf("0\n");
		}
	}
	return 0;
}

标签:cnt,int,sum,KUR,POI2014,mid,tot,ans,Couriers
From: https://www.cnblogs.com/watersail/p/17982896

相关文章

  • James F. Kurose, Keith W. Ross著,陈鸣译,《计算机网络-自顶向下方法》(第6版),机械工业出
    JamesF.Kurose,KeithW.Ross著,陈鸣译,《计算机网络-自顶向下方法》(第6版),机械工业出版社,2014 n计算机网络课程学习什么?nn计算机网络是计算机专业和信息安全专业的专业基础课程,课程主要介绍计算机网络的基本原理和技术,通过对网络协议模型多层次功能结构的展开与探讨,详细介绍......
  • P3565 [POI2014] HOT-Hotels
    题目描述:给定一棵树,在树上选\(3\)个点,要求两两距离相等,求方案数。数据范围:\(1\len\le5000\)\(1\lea,b\len\)思路:一开始我想的就是枚举两个点,然后处理第三个点。但是发现这样做非常的不正确,并且非常容易算重,所以我舍去了这种方式。但是在想这种做法的时候,我们会发现,......
  • Kurator v0.5.0发布,打造统一的多集群备份与存储体验
    本文分享自华为云社区《Kuratorv0.5.0正式发布!打造统一的多集群备份与存储体验》,作者:云容器大未来。Kurator是由华为云推出的开源分布式云原生套件。面向分布式云原生场景,Kurator旨在为用户提供一站式的解决方案,帮助用户快速构建自己的分布式云原生平台。在最新发布的v0.......
  • Ozon Tech Challenge 2020 (Div.1 + Div.2, Rated, T-shirts + prizes!) B. Kuroni an
    Problem-1305B-Codeforces 啦啦啦,这题题目有点长,概括一下就是,希望将所有()匹配的括号去掉问你需要操作多少次 双指针,一个i一个j,从前往后记录匹配的括号如果发现:1.括号匹配2.i<jok,就放入ans (⊙o⊙)…,最后记得sort一遍ans,第一遍因为这个wa了一发 #include......
  • P3565 [POI2014] HOT-Hotels
    三倍经验:bzoj#3522P3565loj#2431加强版:bzoj#4543先看bzoj#3522这题。容易想到时间\(O(n^2)\),空间\(O(n^2)\)的树形dp。设\(dp_{1/2/3,u,i}\)表示以\(u\)为根的子树中所有以\(u\)为一端点,长度为\(i\)的路径中选\(1/2/3\)条路径的方案数(......
  • P3573 [POI2014] RAJ-Rally
    P3573[POI2014]RAJ-Rally题意给一张\(DAG\),问删去一个点的最长路是多少。题解好妙的题。考虑对于每个点求出删除此点之后的最长路。考虑到一个\(DAG\)只会由拓扑序低的点走向高的点。所以我们按照拓扑序枚举点删除之后的最短路。考虑根据当前点的拓扑序将点集划分为......
  • 洛谷P3576 [POI2014] MRO-Ant colony 题解
    MRO-Antcolony根据下取整除法的性质\((\left\lfloor\dfrac{\left\lfloor\dfrac{x}{y}\right\rfloor}{z}\right\rfloor=\left\lfloor\dfrac{x}{yz}\right\rfloor)\),我们可以反向考虑,即从特殊边开始,计算出从每个叶子到特殊边的路径上,要除以的那个分母是什么。这个可以直接一遍df......
  • [POI2014] HOT-Hotels 加强版
    [POI2014]HOT-Hotels题面翻译给定一棵树,在树上选\(3\)个点,要求两两距离相等,求方案数。题目描述Thereare\(n\)townsinByteotia,connectedwithonly\(n-1\)roads.Eachroaddirectlylinkstwotowns.Alltheroadshavethesamelengthandaretwoway.Itis......
  • Kurskal重构树
    Kurskal重构树学习博客(推荐)瓶颈我们定义图上\(u\longrightarrowv\)路径的瓶颈为,这条路径上边权的最大值。我们希望求出,一幅图上任意两点之间的最小瓶颈路。由于,若两点之间存在至少一条路径,那么这两点间的最小瓶颈路至多只有一条。最小瓶颈路无向图\(G\)中\(x\)到\(y\)......
  • CF979D Kuro and GCD and XOR and SUM
    题目大意初始有一个空的集合,和\(Q\)个操作。对于每个操作,有两种类型,分别用如下的两种形式表示:1u:加入\(u\)到集合2xks:求一个最大的\(v\),使得:\(v+x\leqs\)\(k\mid\gcd(v,x)\)\(x\oplusv\)最大(其中\(\oplus\)表示按位异或,对应C++中的^运算符)如果找不......