• 洛谷2018-7月月赛


    U29473

    【题目链接】

        https://www.luogu.org/problemnew/show/U27076

    【算法】

        我的算法比较渣,最多n=1e5个数,于是离散化,记录每个数出现次数。

        然后判断是否是质数,每个数范围为1~1e12于是只需判断是否能能被1~1e6范围内且小于它的1/2次方的质数整除即可,所以打了一个1~1e6的质数表。

        看了标程自己是个zz,根号ai不超过1e6,没必要大表,不过快一点。。。。而且,排个序判断下就好,实乃水题,溜了,我太渣。。。。

    【注意】

        stl::unique() 函数如果需要计算重复数字的话尽量不要用。。。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int maxn = 1e6+10;
     4 typedef long long ll;
     5 vector<int> a;
     6 bool is_prime[maxn];
     7 int t,m,n,tot;
     8 ll b[100010],c[100010];
     9 int d[100010];
    10 void prime()
    11 {
    12     is_prime[2] = true;
    13     for(int i = 3; i < maxn; i += 2)
    14         is_prime[i] = true;
    15     for(int i = 3; i < sqrt(maxn+0.1); i++) {
    16         if(is_prime[i]) {
    17             for(int j = i*i; j < maxn; j += 2 * i)
    18                 is_prime[j] = false;
    19         }
    20     }
    21     for(int i = 2; i < maxn; i++) if(is_prime[i]) a.push_back(i);
    22 }
    23 void discrete()
    24 {
    25     sort(b+1,b+n+1);
    26     for(int i = 1; i <= n; i++) {
    27         if(b[i] != b[i-1]) c[++tot] = b[i];
    28         d[tot]++;
    29     }
    30 }
    31 int query(ll x)
    32 {
    33     return lower_bound(c+1,c+tot+1,x) - c;
    34 }
    35 int main()
    36 {
    37     prime();
    38     cin>>t;
    39     while(t--) {
    40         memset(d,0,sizeof(d));
    41         tot = 0;
    42         cin>>n>>m;
    43         for(int i = 1; i <= n; i++) {
    44             cin>>b[i];
    45         }
    46         discrete();
    47         for(int i = 1; i <= m; i++) {
    48             ll cur;
    49             cin>>cur;
    50             d[query(cur)]--;
    51         }
    52 
    53         ll times=0, rec=0;
    54         for(int i = 1; i <= tot; i++) {
    55             if(d[i] > 0 && c[i] != 1) {
    56                 times += d[i];
    57                 rec = c[i];
    58             }
    59         }
    60         if(times != 1)
    61             cout<<"NO"<<endl;
    62         else {
    63             bool flag = true;
    64             for(int i = 0; a[i] <= sqrt(rec+1.0) && i < a.size(); i++)
    65                 if(rec % a[i] == 0) { flag = false; break; }
    66             if(flag) cout<<"YES"<<endl;
    67             else cout<<"NO"<<endl;
    68         }
    69     }
    70     return 0;
    71 }
  • 相关阅读:
    hash的简单应用
    2273: 蓝桥杯第八届省赛正则问题
    Git 消息提交规范
    监听数据变化
    微信小程序组件传参和交互
    vue3 setup语法糖
    GitBook——制作精美的电子书、产品文档、知识库、个人项目、API文档等,并「分享」
    ps镜像翻转单个图层
    windows10或server没有「启动快速启动」的选项的解决方案
    win10驱动程序安装失败的解决方案(禁用驱动程序强制签名)
  • 原文地址:https://www.cnblogs.com/Willendless/p/9311262.html
Copyright © 2020-2023  润新知