首页 > 其他分享 >CSP模拟8

CSP模拟8

时间:2023-07-28 20:35:01浏览次数:17  
标签:right int mid que include CSP 模拟 left

闲话

今天老吕从国赛,带来一个消息:“省选可能取消,完全看 NOIP 成绩”。

不过对我没什么影响,反而还开心一些。

A. Coprime

题目大意

给定一个长度为 \(n\) 的数列 \(a\),要求出 \(1 \sim m\) 中与 \(a\) 中的所有元素互质的数。
数据范围:\(1\ \leq\ n,m\ \leq\ 10^5,1\ \leq\ a_i\ \leq\ 10^5\)。

思路

模拟赛加强了数据,卡了 \(\mathcal{O}(n \sqrt{n})\),于是来写一个 \(\mathcal{O}(n \log n)\) 的。

考虑互质是什么意思,是指两个数只有一个共同因数 \(1\)。那么如果两个数有除 \(1\) 以外的共同因数,二者不互质。

所以我们可以枚举因数,若其倍数是 \(a\) 中的元素,就可以标记我们枚举的这个因数的所有倍数都是不合法的,然后可以标记。

没标记的数都是合法的,到时候直接计数输出就行了。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>

using namespace std;

const int N = 2005000;

int n,m;
int a[N];

bool t[N],p[N];
int pri[N],cnt;

queue<int> que;

int main() {
    ios::sync_with_stdio(false);
    cin >> n >> m;
    for(int i = 1;i <= n; i++) {
        cin >> a[i];
        p[a[i]] = 1;
    }

    for(int i = 2;i <= N; i++) {
        bool flag = 0;
        for(int j = i;j <= N; j += i) {
            flag |= p[j];
        }
        for(int j = i;j <= N; j += i) {
            t[j] |= flag;
        }
    }

    for(int i = 1;i <= m; i++)
        if(t[i] == 0) {
            cnt ++;
            que.push(i);
        }
    
    cout << que.size() << "\n";
    while(!que.empty()) {
        cout << que.front() << "\n";
        que.pop();
    }

    return 0;
}

B.

二分答案。

一般来说找最大值的最小,最小值的最大一般都是二分答案。

我们二分的是 \(\mathrm{min}\ (\left| x_i-x_j \right|,\left| y_i-y_j \right|)\),假设现在枚举到 \(mid\),那么合法的条件是 \(\mathrm{min}\ (\left| x_i-x_j \right|,\left| y_i-y_j \right|) \geq mid\),即 \(\left| x_i - x_j \right| \geq mid\) 且 \(\left| y_i - y_j \right| \geq mid\)。

我们可以把所有点按照 \(x\) 从小到大排序,然后我们可以用双指针维护。

先定位右指针位置,使得 \(x_r - x_l \geq mid\),然后开始移动左指针,并时刻根据 \(x_r - x_l\) 的值移动右指针,这一步就保证了 \(\left| x_i - x_j \right| \geq mid\)。

两个指针位置确定时,找到左指针左侧和右指针右侧区间的的 \(y\) 的最大值、最小值,判断二者相减值是否合法。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <climits>
#include <queue>
#include <vector>

using namespace std;

const int N = 1005000;

int n;

struct Point{
    int x,y;
};

bool cmp(const Point &a,const Point &b) {
    return a.x < b.x;
}

vector<Point> a;

bool Check(int mid) {
    int Min = INT_MAX,Max = INT_MIN;
    int flag = 0;
    queue<Point> que;
    // 拿队列模拟指针了 

    for(Point t : a) {
        while(!que.empty()) {
            if(t.x - que.front().x < mid)
                break;
            Max = max(Max,que.front().y);
            Min = min(Min,que.front().y);

            que.pop();
        }
        if(Max - t.y >= mid || t.y - Min >= mid)
            flag = 1;
        que.push(t);
    }
    return flag;
}

int main() {
    ios::sync_with_stdio(false);
    cin >> n;
    for(int i = 1,x,y;i <= n; i++) {
        cin >> x >> y;
        a.push_back((Point){x,y});
    }
    
    sort(a.begin(),a.end(),cmp);

    int l = 0,r = 1e9,ans = 0;
    while(l <= r) {
        int mid = (l + r) / 2;
        if(Check(mid)) {
            l = mid + 1;
            ans = mid;
        }
        else
            r = mid - 1;
    }
    cout << ans;
    return 0;
}

剩下的先咕掉吧。

标签:right,int,mid,que,include,CSP,模拟,left
From: https://www.cnblogs.com/baijian0212/p/csp-8.html

相关文章

  • 「赛后总结」暑假集训:20230727 CSP 模拟赛
    「赛后总结」20230727CSP模拟赛点击查看目录目录「赛后总结」20230727CSP模拟赛总结题解T1卷T2简单题T3粉丝T4字符串已经入园两年了吗。好快哦。2023年7月28日20:04:早上就写完了但忘了发了。以下内容均写于「2023年7月27日」。前两天题还没改完呢,有......
  • wpf在设计器模式利用模拟数据展现控件
    使用VisualStudio开发WPF应用程序时,控件显示需要的数据如果来路比较“苦难”,比如来自数据库,JSON文件,复杂计算等,这时候,如果想看到控件带有数据的展示效果,需要启动调试,这很麻烦。我们可以在XAML中使用designtime语法给控件赋予模拟数据MSDN教程,也可以在后台使用csharp代码判断当......
  • c# WinForm 引用 Chrome 模拟操作
    Nuget CefSharp.WinForms publicForm1(){InitializeComponent();chromiumWebBrowser1.LoadingStateChanged+=ChromiumWebBrowser1_LoadingStateChanged;}privatevoidbutton1_Click(objectsender,EventArgs......
  • Window系统下模拟Linux环境的工具
    [b][color=red]强大的Cygwin[/color][/b]:[url]http://cygwin.com/install.html[/url]OracleunderCygwin-EduUnix[url]http://eduunix.ccut.edu.cn/index2/html/oracle/O'Reilly%20-%20Perl.For.Oracle.DBAs.eBook-LiB/oracleperl-CHP-2-SECT-4.......
  • Android shell模拟物理按键
    Androidshell模拟物理按键在Android开发中,有时候我们需要模拟物理按键的操作,例如模拟点击返回键、Home键等。Android提供了一个能够在命令行中模拟按键操作的工具——input。input命令简介input命令是Android系统中的一个工具,用于模拟按键事件。通过使用不同的参数,我们可以模拟......
  • 济南 CSP-J Day 4
    SolutionT1出现次数原题链接4102:出现次数简要思路利用类似前缀和的“后缀和”来记录下每个数后面有几个未重复出现的数,定义一个\(f\)数组来判断是不是第一次出现(实现去重)。完整代码#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constint......
  • CSP 模拟 6
    T1排序基本是原题CF1375E好像是简单题,考虑这个排列\(\pi\)的逆排列\(\pi^{-1}\)(如果排列是\(a_i\),则逆排列为\(b_{a_i}=i\)),因为逆序对的定义是序列编号和数值大小关系不一样,所以在逆排列中逆序对和原排列相同,对逆排列做冒泡排序,因为冒泡排序交换的是相邻值的位置,对其他值......
  • CSP模拟7
    A.卷一道可爱的树形DP喵!题目保证了\(w_i\)是在给定范围内随机生成的,所以不会炸精度。首先明确题意,是求出最大乘积独立集之后取模,而不是边乘边取模。边乘边取模会炸,例如\(10^9+8\)对\(10^9+7\)取模后小于\(2\),但显然\(10^9+8>2\)。那怎么办呢?高精?可以用我们......
  • CSP 模拟 5
    T1第一题贪心,观察肯定是从较浅的点上来一个士兵或者从根节点来一个士兵,用set或者vector启发式合并维护这个过程即可点击查看代码#include<bits/stdc++.h>#defineN100005#defineinf0x3f3f3f3f#definepiipair<int,int>#definempmake_pairusingnamespacestd;......
  • set.a.light 3D STUDIO - 3D摄影棚模拟布光软件mac/win版
    set.a.light3DSTUDIO是一款专业的摄影灯光模拟软件,为摄影师和摄影爱好者提供了一个真实、细致的虚拟摄影棚环境。它可以帮助用户在计算机上进行灯光设置和调整,以达到理想的照片效果。→→↓↓载set.a.light3DSTUDIO set.a.light3DSTUDIO具有丰富的功能和直观的界面,使用......