牛客多校六 Intervals on the Ring 数学知识

2024-01-28 15:48

本文主要是介绍牛客多校六 Intervals on the Ring 数学知识,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Intervals on the Ring

题目描述

There is a ring of numbers consisting of 1to n sequentially. For every number i (1≤i≤n−1), i and i+1 are adjacent to each other. Particularly, n and 1 are adjacent. We use [l,r] to describe an interval on the ring. Formally, if l≤r, then the interval [l,r] is equivalent to the set {l,l+1,…,r−1,r}. Otherwise, the interval [l,r] is equivalent to {l,l+1,…,n,1,…,r−1,r}.

Yukikaze has m non-intersecting intervals. She wants you to construct a set of intervals such that the intersection of them is the union of the m intervals that Yukikaze has. The intersection of the intervals is the set of integers that the intervals have in common.

输入描述:

 

The first line of the input contains a single integer T (1≤T≤1000) denoting the number of test cases.

The first line of each test case contains two integers n (3≤n≤1000)nand m (1≤m≤n), denoting that the ring consists of numbers from 1 to n.

Each of the next m lines contains two integers l,r (1≤l,r≤n) denoting an interval Yukikaze has. It's guaranteed that the m intervals won't intersect with each other.

输出描述:

 

For each test case, if the answer doesn't exist, output −1 in a line. Otherwise, output an integer k indicating the number of intervals you construct in a line. Then output the k intervals in k lines. The number of intervals you used should never be less than one or greater than 2000.

If there are multiple solutions, print any. Don't print any extra spaces at the end of each line.

示例1

输入

2
3 1
2 2
4 2
1 1
3 3

输出

1
2 2
2
3 1
1 3

题意:给出T个测试样例,每个·测试样例给出n,集合为1-n,给出m个区间的左右端点,求出几个集合使它们的交集为m个集合的并集。

思路:由数学知识知:区间的并集的补集等于区间的补集的交集,所以先将区间按左端点由小到大排序,然后输出每一段未被覆盖区间的补集。

代码如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010;
pair<int,int> p[maxn];
int main(){int t,n,m,l,r;cin>>t;while(t--){cin>>n>>m;for(int i=0;i<m;i++){cin>>p[i].first>>p[i].second;//first为左端点,second为右端点 }cout<<m<<endl;sort(p,p+m);//排序时左端点为第一关键字 for(int i=0;i<m;i++){cout<<p[i].first<<" "<<p[(m+i-1)%m].second<<endl;//输出未被覆盖区间的补集 }}return 0;
}

这篇关于牛客多校六 Intervals on the Ring 数学知识的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/654082

相关文章

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

牛客小白月赛100部分题解

比赛地址:牛客小白月赛100_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ A.ACM中的A题 #include<bits/stdc++.h>using namespace std;#define ll long long#define ull = unsigned long longvoid solve() {ll a,b,c;cin>>a>>b>

牛客小白月赛100(A,B,C,D,E,F三元环计数)

比赛链接 官方讲解 这场比较简单,ABC都很签到,D是个不太裸需要预处理的 B F S BFS BFS 搜索,E是调和级数暴力枚举,F是三元环计数。三元环考的比较少,没见过可能会偏难。 A ACM中的A题 思路: 就是枚举每个边变成原来的两倍,然后看看两短边之和是否大于第三边即可。 不能只给最短边乘 2 2 2,比如 1 4 8 这组数据,也不能只给第二短边乘 2 2 2,比

笔试强训,[NOIP2002普及组]过河卒牛客.游游的水果大礼包牛客.买卖股票的最好时机(二)二叉树非递归前序遍历

目录 [NOIP2002普及组]过河卒 牛客.游游的水果大礼包 牛客.买卖股票的最好时机(二) 二叉树非递归前序遍历 [NOIP2002普及组]过河卒 题里面给的提示很有用,那个马的关系,后面就注意,dp需要作为long的类型。 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息publ

2015多校联合训练第三场Work(hdu5326)

题意: a是b的上司,b是c的上司,则a是c的上司,问构成一个树种,有多人是 k个人的上司 思路: 先找出root,然后dfs一下就行 #include <bits/stdc++.h>#define LL long longusing namespace std;const int MAXN = 1e6;int f[105];int n, k;int mp[101][101];

2015年多校联合训练第三场RGCDQ(hdu5317)

题意: f(i)代表i数中有的素数的种数,给出区间[l,r],求区间内max(gcd(f(i))), 由于i最大是1e6,2*3*5*7*11*13*17>1e6,故最多不超过7种素数, 先打表打出1e6内的素数种数表,然后用sum[i][j]代表1-i个数中,还有j个素数的个数,最后用sum[r][j] - sum[l-1][j]求出区间内含有j个素数的数的个数,暴力找出1,2,3,4,5

2015多校联合训练第一场Tricks Device(hdu5294)

题意:给一个无向图,给起点s,终点t,求最少拆掉几条边使得s到不了t,最多拆几条边使得s能到t 思路: 先跑一边最短路,记录最短路中最短的边数,总边数-最短边数就是第二个答案 第一个答案就是在最短路里面求最小割,也就是求最大流,然后根据最短路在建个新图,权为1,跑一边网络流 模板题,以后就用这套模板了 #include <iostream>#include <cstdio>#incl

2015多校联合训练第一场Assignment(hdu5289)三种解法

题目大意:给出一个数列,问其中存在多少连续子序列,子序列的最大值-最小值< k 这题有三种解法: 1:单调队列,时间复杂度O(n) 2:RMQ+二分,时间复杂度O(nlogn) 3:RMQ+贪心,时间复杂度O(nlogn) 一:RMQ+二分 RMQ维护最大值,最小值,枚举左端点i,二分找出最远的符合的右端点j,答案就是ans += j - i+1;(手推一下就知道) 比如1 2 3

2015年多校联合训练第一场OO’s Sequence(hdu5288)

题意:给定一个长度为n的序列,规定f(l,r)是对于l,r范围内的某个数字a[i],都不能找到一个对应的j使得a[i]%a[j]=0,那么l,r内有多少个i,f(l,r)就是几。问所有f(l,r)的总和是多少。 公式中给出的区间,也就是所有存在的区间。 思路:直接枚举每一个数字,对于这个数字,如果这个数字是合法的i,那么向左能扩展的最大长度是多少,向右能扩展的最大长度是多少,那么i为合法的情况

每日OJ_牛客_求和(递归深搜)

目录 牛客_求和(递归深搜) 解析代码 牛客_求和(递归深搜) 求和_好未来笔试题_牛客网 解析代码         递归中每次累加一个新的数,如果累加和大于等于目标,结束递归。此时如果累加和正好等于目标,则打印组合。向上回退搜索其它组合。此题本身就是一个搜索的过程,找到所有的组合。 #include <iostream>#include <cmath>#in