1. 程式人生 > >牛客網NOIP賽前集訓營-提高組(第四場)

牛客網NOIP賽前集訓營-提高組(第四場)

A 動態點分治

題意

輸出所有[l,r][l,r]範圍內能表示為k的若干次的數。 (注意0^0=1)

題解

暴力做…k為2,r為2^63次時最多乘63次所以時間可行。 emmm我特判掉了k=0和1的情況(不知道可不可以不特判? 稍微注意一下細節即可。

//Suplex
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#define ll long long
using namespace std;
int T;

int main()
{
	scanf("%d",&T);
	while(T--){
		ll l,r,k;
		scanf("%lld%lld%lld",&l,&r,&k);
		if(!k){
			if(l>1){puts("None.");continue;}
			if(l<=0 && r>=0) printf("0 ");
			if(l<=1 && r>=1) printf("1 ");
			puts("");continue;
		}
		if(k==1){
			if(l<=1 && r>=1) puts("1");
			else puts("None.");
			continue;
		}
		ll x=1;
		while(x<l && x<=(ll)r/k) x*=k;
		if(x<l || x>r){puts("None.");continue;}
		printf("%lld",x);
		while(x<=(ll)r/k){x*=k;printf(" %lld",x);}
		puts("");
	}
	return 0;
}

B 區間

題意

求最長的區間長度使得區間記憶體在一個aia_i等於這個區間所有數的最大公約數。

題解

一開始並不會做?以及不加讀優跑不過去? 暴力思想列舉那個aia_i然後向兩邊擴充套件,更新答案。 那麼向右擴充套件那些是aia_i倍數的都不會作為最優解,所以列舉的i直接跳到右端點後。這樣時間複雜度就是O(n)的啦~ 還有別的各種寫法比如…單調棧?可是並不懂/youl

//Suplex
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int n;long long a[4004000];

inline long long read()
{
	long long x=0,f=1;char ch=getchar();
	while(ch<'0' || ch>'9'){if(ch=='-') f=(long long)-1;ch=getchar();}
	while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) a[i]=read();
	int k=1,ans=1;
	while(k<=n){
		int l=k-1,r=k+1;
		while(a[r]%a[k]==0 && r<=n) r++;
		while(a[l]%a[k]==0 && l>0) l--;
		r--;l++;
		ans=max(ans,r-l+1);
		k=r+1;
	}
	printf("%d\n",ans);
	return 0;
}

C 滅蟲

代填。