其他分享
首页 > 其他分享> > Codeforces Round #775 (Div. 2) D

Codeforces Round #775 (Div. 2) D

作者:互联网

D. Integral Array

正向不好做 我们考虑反着做
我们知道一个数x下取整 要是有k和x两个数的话[kx,kx+x-1]
我们能考虑到这样区间赋值 利用线段树可以做到O(clogc)
还有O(clogc)的做法就是暴力的来对于每一个x都遍历一遍其倍数 要是其倍数有值 那么我们必须拥有其倍数才行 否则NO

for (int i = 1; i <= n; i++) {
for (int j = i; j <= n; j += i) {
//do O(1)
}
}
这行代码是个级数 复杂度是O(nlogn)的 高数教过

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
const int M = 998244353;
const int mod = 1000000007;
#define int long long
#define endl '\n'
#define Endl '\n'
#define YES cout<<"Yes"<<endl;
#define NO cout<<"No"<<endl;
#define _ 0
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);

void solve() {
    int n,c;cin>>n>>c;
    vector<int>a(n+1),pre(c+1),loc(c+1);
    for(int i=1;i<=n;i++)cin>>a[i],loc[a[i]]++;
    for(int i=1;i<=c;i++)pre[i]=pre[i-1]+loc[i];
    for(int i=1;i<=c;i++){
        if(!loc[i])continue;
        for(int j=i;j<=c;j+=i){
            int l=j,r=min(c,j+i-1);
            if(pre[r]-pre[l-1]>0&&loc[j/i]==0){NO return;}
        }
    }
    YES
}
signed main(){
    fast
    int T;cin>>T;
    while(T--) {
        solve();
    }
    return ~~(0^_^0);
}

标签:775,loc,const,int,Codeforces,倍数,return,Div,define
来源: https://www.cnblogs.com/ycllz/p/16678298.html