luoguP1871 对撞机【赛后第一题

题面

题目描述
在2312年,宇宙中发现了n台巨型对撞机,这些对撞机分别用1-n的自然数标识。科学家们不知道启动这些对撞机会发生什么危险事故,所以这些机器,刚开始都是出于关闭的状态。

随着科学家们的研究发现,第i台对撞机启动是安全的,如果其他已经启动的对撞机的标识数都跟着台对撞机标识数互质。(例如假设前面启动的是j,如果i能启动,那么i,j互质,也就是i,j的最大公约数为1)。如果两台对撞机不互为质数就启动,那么就会发生爆炸事故。

基于前面的研究,科学家们准备做各种启动和关闭对撞机的实验。为了确保科学家们的生命安全,你要设计一个远程遥控的软件。

刚开始,所有的额对撞机都是关闭状态。你的程序将会收到许多询问,格式为“启动、关闭第i台对撞机”。这个程序应该能处理这些询问(根据收到询问的先后顺序处理)。程序按照如下的格式输出处理结果。

如果询问时“+i”(表示第i台对撞机启动),这程序应该按照下面三种的情况之一输出结果。

(1)“Success”,表示启动第i台是安全的。

(2)“Already on”,表示第i台在询问之前就已经启动了。

(3)“Conflict with j”,如果第i台隔年面启动了的第j台冲突,就不能启动第i;如果前面有多台跟i冲突,那么只输出其中任何一台即可。

如果寻味是“-i”(表示关闭第i台对撞机),这程序应该按照下面两种情况之一输出结果。

(1)“Success”,表示关闭第i台对撞机

(2)“Already off”,表示第i台对撞机在询问之前就已经关闭了。

输入格式
第一行输入两个空格隔开的整数n和m(1<=n,m<=10^5),分别表示对撞机的数量和询问数。

接下来m行,表示询问,每行要么为“+ i”,要么为“- i”(不含引号)(1<=i<=n)。

输出格式
输出m行,输出结果按照上面题目给定格式输出。

输入输出样例
输入 #1
10 10

  • 6
  • 10
  • 5
  • 10
  • 5
  • 6
  • 10
  • 3
  • 6
  • 3
    输出 #1
    Success
    Conflict with 6
    Success
    Already off
    Success
    Success
    Success
    Success
    Conflict with 3
    Already on

分析

这是我的csp2019考砸后的第一题, 认识到自己以前的不足之后,决定,以后博文里都写题面,不再写题意

我们都需要一个好好思考的过程!
进入正题:

这是一道很好的理解分解质因数的题目, 其实思路挺好想的, 就是有些细节要注意
细节, 易错点收录在首页轮播第四个“精选傻X错误”中, 这里先贴上代码(很丑, 勿喷

#include<cstdio>
#include<iostream>
using namespace std;
const int N = 100000+99;
inline int read() {
    char ch = getchar(); int x = 0;
    while(ch<'0' || ch>'9') {ch = getchar();}
    while(ch>='0' && ch<='9') {x = (x<<1)+(x<<3)+(ch^48); ch = getchar();}
    return x;
}

int n, m;
int not_prime[N];
int prime[N], tot, mn_prime[N];
void L_S() {
    mn_prime[1] = 1;
    for(int i = 2; i <= n; i++) {
        if(not_prime[i] == 0) {
            mn_prime[i] = i;
            prime[++tot] = i;
        }
        for(int j = 1; j <= tot && i*prime[j] <= n; j++) {
            not_prime[i*prime[j]] = 1;
            mn_prime[i*prime[j]] = prime[j];
            if(i%prime[j] == 0) break;
        }
    }
}

char cmd;
int id, tmp, is, mnprime;
int a[N];//记录每个数是隶属于哪个数(为0表示没有选
int main() {
    n = read(), m = read();
    L_S();
//  for(int i = 1; i <= n; i++) printf("%d ", mn_prime[i]);
    for(int i = 1; i <= m; i++) {
        cin>>cmd; id = read();
        if(id == 1) {
            if(cmd == '+') {
                if(a[1] == 1) printf("Already on\n");
                else printf("Success\n");
                a[1] = 1;
            }else {
                if(a[1] == 0) printf("Already off\n");
                else printf("Success\n");
                a[1] = 0;
            }
            continue;
        }
        if(cmd == '+') {
            if(a[id] != id) {
                tmp = id;
                is = 1;
                while(tmp > 1) {//判断它的质因数是否已经被选
                    if(a[mn_prime[tmp]]) {
                        is = 0;
                        printf("Conflict with %d\n", a[mn_prime[tmp]]);
                        break;
                    }
                    mnprime = mn_prime[tmp];
                    while(tmp && tmp%mnprime == 0) tmp /= mnprime;//.........
                }
                if(is) {
                    tmp = id;
                    while(tmp > 1) {//用相同的方法把质因数都打上标记
                        a[tmp] = id;
//                      printf("a[%d] = %d\n", tmp, id);
                        mnprime = mn_prime[tmp];
                        while(tmp && tmp%mnprime == 0) tmp /= mnprime;
                        a[mnprime] = id;//别忘了去掉的质数要在这里处理,下面也是
                    }
                    printf("Success\n");
                }
            }else printf("Already on\n");
        }else {
            if(a[id] != id) printf("Already off\n");
            else {
                while(id > 1) {
                    a[id] = 0;
                    mnprime = mn_prime[id];
                    while(id && id%mnprime == 0) id /= mnprime;
                    a[mnprime] = 0;
                }
                printf("Success\n");
            }
        }
    }
}

原文地址:https://www.cnblogs.com/tyner/p/12024061.html

时间: 2024-07-29 23:23:59

luoguP1871 对撞机【赛后第一题的相关文章

2018 HDU多校第三场赛后补题

2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube 题意: 在画布上画一个三维立方体. 题解: 模拟即可. 代码: #include <bits/stdc++.h> using namespace std; int a, b, c, R, C; char g[505][505]; int main () { int T; cin >>

2016/1/12 第一题 输出 i 出现次数 第二题 用for循环和if条件句去除字符串中空格 第三题不用endwith 实现尾端字符查询

1 import java.util.Scanner; 2 3 4 public class Number { 5 6 private static Object i; 7 8 /* 9 *第一题 mingrikejijavabu中字符“i” 出现了几次,并将结果输出*/ 10 public static void main(String[] args) { 11 12 String r ="imingrikejijavabi"; 13 14 15 //第一种 截取 16 int a=

leetcode中第一题twosum问题解答算法的可行性证明

leetcode中第一题twosum问题解答算法的可行性证明 一.引入 关于leetcode中第一题twosum问题,网上已有不少高人做出过解答,并提出了切实可行的算法实现.我在解答该题时参考了博客http://www.zixue7.com/article-9576-1.html的解答.为让读者更直观地阅读和理解本文,先简要摘录以上博客的内容如下: 题目还原 Two Sum Given an array of integers, find two numbers such that they a

第五届在线编程大赛月赛第一题:完全平方数的个数

第五届在线编程大赛月赛第一题:完全平方数的个数 题目详情: 给定整数区间[A,B]问其中有多少个完全平方数. 输入格式: 多组数据,包含两个正整数A,B 1<=A<=B<=2000000000. 输出格式: 每组数据输出一行包含一个整数,表示闭区间[A,B]中包含的完全平方数的个数. 答题说明: 输入样例 1 1 1 2 3 10 3 3 输出样例: 1 1 2 0 java代码: import java.util.Scanner; public class One { public s

POJ 1364 King --差分约束第一题

题意:求给定的一组不等式是否有解,不等式要么是:SUM(Xi) (a<=i<=b) > k (1) 要么是 SUM(Xi) (a<=i<=b) < k (2) 分析:典型差分约束题,变换,令Ti = SUM(Xj) (0<=j<=i).  则表达式(1)可以看做T(a+b)-T(a-1) > k,也就是T(a-1)-T(a+b) < -k,又因为全是整数,所以T(a-1)-T(a+b) <= -k-1.  同理,(2)看做T(a+b)-T(

【BZOJ4927】第一题 双指针+DP(容斥?)

[BZOJ4927]第一题 Description 给定n根直的木棍,要从中选出6根木棍,满足:能用这6根木棍拼 出一个正方形.注意木棍不能弯折.问方案数. 正方形:四条边都相等.四个角都是直角的四边形. Input 第一行一个整数n. 第二行包含n个整数ai,代表每根木棍的长度. n ≤ 5000, 1 ≤ ai ≤ 10^7 Output 一行一个整数,代表方案数. Sample Input 8 4 5 1 5 1 9 4 5 Sample Output 3 题解:这...这不是沈阳集训的原

NOIP2005-普及组复赛-第一题-陶陶摘苹果

题目描述 Description 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果.苹果成熟的时候,陶陶就会跑去摘苹果.陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试. 现在已知10个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目.假设她碰到苹果,苹果就会掉下来. 输入输出格式 Input/output 输入格式:输入文件apple.in包括两行数据.第一行包含10个100到200之间(包括100和200

2014百度之星资格赛第一题

Energy Conversion Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 11867    Accepted Submission(s): 2861 Problem Description 魔法师百小度也有遇到难题的时候-- 现在,百小度正在一个古老的石门面前,石门上有一段古老的魔法文字,读懂这种魔法文字需要耗费大量的能量和大

HDU 2966 Aragorn&#39;s Story 树链剖分第一题 基础题

Problem Description Our protagonist is the handsome human prince Aragorn comes from The Lord of the Rings. One day Aragorn finds a lot of enemies who want to invade his kingdom. As Aragorn knows, the enemy has N camps out of his kingdom and M edges c