ICode9

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

noip模拟70

2021-10-07 08:00:29  阅读:160  来源: 互联网

标签:ch noip int 挖掘机 pos jbb 70 模拟 define


还是多校联测,题目不简单。还有就是这次题面描述十分不清楚,第一题理解错了题意。
考试过程:按顺序开题,首先是T1,我凭着自己的错误理解先打了个暴搜,然后觉得这是个DP,就开始想,我定义了\(f_{i,j,0/1}\)表示当前DP到了第\(i\)位,一共挖去了\(j\)块土地,积水的体积为奇/偶数的方案数,但是我想了半天也没想出来一个正确的转移,就弃了。
然后是T2,我不会大暴力,就跳了。看T3,我觉得是可做的,先想出来一个40分的做法,然后我觉得正解是利用倍增优化这个不断往后跳的过程,但是我当时不知道为啥就是很怀疑这个想法,就没仔细想,最后也没切掉。然后是T4,没什么时间了,就打了个暴搜。
总结:如果自己有一些优化的想法就要先想想,不要先怀疑自己。

T1 暴雨

留坑

T2 AV树

留坑

T3 挖掘机

思路:显然每一个深度的影响是独立的,那么我们可以分开计算。首先想到一个暴力的思路,就是对于一段询问的区间,我们找到第一个黑点,让他作为挖掘机的左端点,然后再找到下一个距离当前点大于等于\(k\)的黑点,重复此操作,最后将答案加起来即可。
考虑优化,我们可以对于每个点预处理出一个倍增数组,这个数组的含义是:在当前的使用一次挖掘机后,再使用\(2^k\)次挖掘机所能到达的黑点,这样我们就可以在\(log\)的复杂度内完成询问。
代码如下:

AC_code

#include<bits/stdc++.h>
#define int long long
#define re register int
#define ii inline int
#define iv inline void
#define f() cout<<"fuck"<<endl
#define head heeead
#define next neet
using namespace std;
const int N=1e5+10;
int dep,wed,k,q;
char s[15][N];
int base[15][N][20];
vector <int> v[15];
ii read()
{
	int x=0;char ch=getchar();bool f=1;
	while(ch<'0' or ch>'9')
	{
		if(ch=='-') f=0;
		ch=getchar();
	}
	while(ch>='0' and ch<='9')
	{
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return f?x:(-x);
}
signed main()
{
	freopen("blueshit.in","r",stdin),freopen("blueshit.out","w",stdout);
	dep=read(),wed=read(),k=read(),q=read();
	for(re i=1;i<=dep;i++)
	{
		scanf("%s",s[i]+1);
		for(re j=1;j<=wed;j++) if(s[i][j]=='X') v[i].push_back(j);	
	}
	for(re i=1;i<=dep;i++)
	{
		if(v[i].size())
		{
			for(re j=v[i].size()-1;j>=0;j--)
			{
				int pos=upper_bound(v[i].begin(),v[i].end(),v[i][j]+k-1)-v[i].begin();
				if(pos!=v[i].size())
				{
					base[i][v[i][j]][0]=v[i][pos];
					for(re p=1;v[i][j]+(1<<p)<=wed;p++)
						base[i][v[i][j]][p]=base[i][base[i][v[i][j]][p-1]][p-1];
				}
			}
		}
	}
	int d,l,r,ans;
	while(q--)
	{
		d=read(),l=read(),r=read();
		ans=0;
		for(re i=1;i<=d;i++)
		{
			int pos=lower_bound(v[i].begin(),v[i].end(),l)-v[i].begin();
			if(pos==v[i].size() or v[i][pos]>r) continue;
			++ans;
			pos=v[i][pos];
			for(re jbb=19;jbb>=0;jbb--)
			{
				if(base[i][pos][jbb]!=0 and base[i][pos][jbb]<=r)
					ans+=(1ll<<jbb),pos=base[i][pos][jbb];
			}
		}
		printf("%lld\n",ans);
	}
	return 0;
}


T4 游戏

留坑

标签:ch,noip,int,挖掘机,pos,jbb,70,模拟,define
来源: https://www.cnblogs.com/WindZR/p/15374905.html

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

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

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

ICode9版权所有