首页 > 其他分享 >[AGC012E] Camel and Oases

[AGC012E] Camel and Oases

时间:2023-09-27 22:44:38浏览次数:34  
标签:lfloor AGC012E frac Oases Camel int rfloor lev include

Camel and Oases
不难发现对于某个 V,一个点扩展出去的一段区间内所有点的区间相同。
故对于 v,\(\lfloor \frac{v}{2}\rfloor\),\(\lfloor\frac{\lfloor \frac{v}{2}\rfloor}{2}\rfloor\)...1,预处理 \(L_{i,j},R_{i,j}\) 表示 V=j 时 i 扩展最远的左右端点。
为方便处理,我们先排除初始为 V 时的区间。
设 \(DPL_{s},DPR_{s}\) 表示 V 的集合为 s,从1开始覆盖最右的点和从n开始覆盖最左的点。
这样对于初始的 \(l_i,r_i\) 只用判断是否前后缀能接上,设 x 为 V 时区间个数,复杂度 \(\Omicron(x2^{\log_2^v})\)
当 \(\log_2^v< x\) 时,所有点都用最大水量也覆盖不完 1-n 必定所有都为 Impossible,这样即可保证时间。

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
typedef pair<int,int> kk;
#define mp make_pair
const int MAXN=2e5+5;
const int UP=20;
int c1,n,dpl[MAXN<<2],dpr[MAXN<<2],wz[MAXN],v,lev,up,L[UP][MAXN],R[UP][MAXN],len[UP];
kk cc[MAXN];
bool rs[MAXN];
int main(){
	scanf("%d%d",&n,&v);
	while(v>=0){
		len[lev++]=v;v>>=1;
		if(v==0){lev++;break;}
	}up=1<<lev;
	for(int i=1;i<=n;i++) scanf("%d",&wz[i]);
	for(int now=0;now<lev;now++){
		L[now][1]=1;
		for(int i=2;i<=n;i++){
			if(wz[i]-wz[i-1]<=len[now]) L[now][i]=L[now][i-1];else L[now][i]=i;
		}
		R[now][n]=n;
		for(int i=n-1;i>=1;i--){
			if(wz[i+1]-wz[i]<=len[now]) R[now][i]=R[now][i+1];else R[now][i]=i;
		}
	}
	for(int i=1;i<=n;i++) cc[i]=mp(L[0][i],R[0][i]);
	sort(cc+1,cc+1+n);c1=unique(cc+1,cc+1+n)-cc-1;
	if(c1>lev){
		for(int i=1;i<=n;i++) printf("Impossible\n");return 0;
	}
	for(int i=0;i<up;i+=2)  dpr[i]=n+1; 
	for(int i=0;i<up;i+=2){
		for(int j=1;j<lev;j++){
			if((i>>j)&1) continue;
			dpl[i|(1<<j)]=max(dpl[i|(1<<j)],R[j][dpl[i]+1]);
			dpr[i|(1<<j)]=min(dpr[i|(1<<j)],L[j][dpr[i]-1]);
		}
	}
	for(int i=1;i<=c1;i++){
		for(int j=0;j<up;j+=2){
			if(dpl[j]>=cc[i].first-1&&dpr[(up-2)^j]<=cc[i].second+1){
				for(int k=cc[i].first;k<=cc[i].second;k++) rs[k]=1;
			}
		}
	}
	for(int i=1;i<=n;i++){
		if(rs[i]) printf("Possible\n");else printf("Impossible\n");
	}return 0;
}

标签:lfloor,AGC012E,frac,Oases,Camel,int,rfloor,lev,include
From: https://www.cnblogs.com/StranGePants/p/17734547.html

相关文章

  • PascalCase & camelCase & kebabCase介绍
    原文链接:https://www.cnblogs.com/qdkfyym/p/13528076.html一、PascalCase  帕斯卡拼写法(也叫大骆驼拼写法)  PascalCase 帕斯卡拼写法是一种计算机编程中的变量命名方法。它主要的特点是将描述变量作用所有单词的首字母大写,然后直接连接起来,单词之间没有连接符。比......
  • camel components
    http://camel.apache.org/components.htmlComponentsIncludedCamelincludesthefollowingComponentimplementationsviaURIs.Component/ArtifactId/URIDescriptionAHC/camel-ahcahc:hostname:[port]TocallexternalHTTPservicesusingAsyncHttpClientA......
  • 对Camel的一点感触
    用Camel几个月了,对它是又爱又恨。感触很多,零零碎碎的加吧。1.Camel确实是一个非常好用和使用的JMS工具,不过Camel的效率实在是不敢让人恭维,虽然本人费了很大的力气进行优化,不过相比RMI速度还是慢了将近200%,所以如果对速度要求很高的应有,最好先做一个效率的......
  • Snake Case VS Camel Case VS Pascal Case Vs Kebab Case
    eg. numberofdonuts=34snakecase:Snakecaseseparateseachwordwithanunderscorecharacter(_). Whenusingsnakecase,alllettersneedtobelowercase(UppercaseforConstantvalueorGlobalvalue).number_of_donuts=3kebabcase:  kebabcase......
  • AGC012E Camel and Oases
    题意有一个数轴上有\(n\)个点。一开始有一个参数\(v\),你可以进行任意次移动,直到\(v=0\):移动到一个距离当前点不超过\(v\)的点,\(v\)不变。移动到任何一个点,使得\(v\gets\lfloor\dfrac{v}{2}\rfloor\)。现在对于每个起点,问从这个点出发可不可以遍历所有位置。\(1......
  • 「解题报告」AGC012E Camel and Oases
    好久之前模拟赛就考过的题,今天才写)首先发现我们跳跃的次数只有\(\logV\)次,我们设跳了\(i\)次后的时刻为第\(i\)时刻,且最后一个时刻为\(t\)。发现每一时刻,我们能够到达的绿洲形成了若干个连续段。不难发现,当时刻\(0\)的时候连续段数量大于\(t+1\)时一定全部都无法到......
  • AutoGPT、AgentGPT、BabyAGI、HuggingGPT、CAMEL:各种基于GPT-4自治系统总结
    ChatGPT和LLM技术的出现使得这些最先进的语言模型席卷了世界,不仅是AI的开发人员,爱好者和一些组织也在研究探索集成和构建这些模型的创新方法。各种平台如雨后春笋般涌现,集成并促进新应用程序的开发。AutoGPT的火爆让我们看到越来越多的自主任务和代理利用了GPT-4的API。这些发展......
  • Camel详解
     ApacheCamel测试指南https://www.cnblogs.com/d1012181765/p/15338830.html Camel中的转换:如何进行https://www.cnblogs.com/d1012181765/p/15339030.html ......
  • Apache Camel Support
    Spring集成提供了一个API和配置,用于与在同一应用程序上下文中声明的 ApacheCamel 端点进行通信。您需要将此依赖项包含在项目中:<dependency><groupId>org.springf......
  • [Typescript] 99. Hard - CamelCase
    Implement CamelCase<T> whichconverts snake_case stringto camelCase.ForexampletypecamelCase1=CamelCase<'hello_world_with_types'>//expectedtobe......