牛客網NOIP賽前集訓營-提高組(第四場)
阿新 • • 發佈:2018-12-15
A 動態點分治
題意
輸出所有範圍內能表示為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 區間
題意
求最長的區間長度使得區間記憶體在一個等於這個區間所有數的最大公約數。
題解
一開始並不會做?以及不加讀優跑不過去? 暴力思想列舉那個然後向兩邊擴充套件,更新答案。 那麼向右擴充套件那些是倍數的都不會作為最優解,所以列舉的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 滅蟲
代填。