noip模拟70

Posted WindZR

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了noip模拟70相关的知识,希望对你有一定的参考价值。

还是多校联测,题目不简单。还有就是这次题面描述十分不清楚,第一题理解错了题意。
考试过程:按顺序开题,首先是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 游戏

留坑

以上是关于noip模拟70的主要内容,如果未能解决你的问题,请参考以下文章

NOIP模拟77

NOIP模拟2

noip模拟测试84

noip模拟测试11

noip模拟赛 同余方程组

NOIP2016提高A组模拟中秋节9.15总结