春游4.1 | 湖南多校赛20190331 / 16东京区域赛

本文解析了 CF Gym 中两道编程题:一题为序列重排问题,通过模拟方式实现元素移动;另一题涉及构造满足特定条件的多边形,提供了通解思路及代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

找不到cf 的gym网址了 

先放一个 pdf 凑凑数

链接:https://pan.baidu.com/s/1ZjCX1yg4i8VXM87PD7pppg 
提取码:ru3p 
复制这段内容后打开百度网盘手机App,操作更方便哦

A题 签到题

2291: Rearranging a Sequence

Submit Page    Summary    Time Limit: 2 Sec     Memory Limit: 256 Mb     Submitted: 60     Solved: 30    


Description

You are given an ordered sequence of integers, (1, 2, 3, . . . , n). Then, a number of requests will be given. Each request specifies an integer in the sequence. You need to move the specified integer to the head of the sequence, leaving the order of the rest untouched. Your task is to find the order of the elements in the sequence after following all the requests successively

Input

The input consists of a single test case of the following form.
n m
e1
.
.
.
em
The integer n is the length of the sequence (1 ≤ n ≤ 200000). The integer m is the number
of requests (1 ≤ m ≤ 100000). The following m lines are the requests, namely e1, . . . , em, one per line. Each request ei (1 ≤ i ≤ m) is an integer between 1 and n, inclusive, designating the element to move. Note that, the integers designate the integers themselves to move, not their positions in the sequence.

Output

Output the sequence after processing all the requests. Its elements are to be output, one per line, in the order in the sequence

Sample Input

10 8
1
4
7
3
4
10
1
3

Sample Output

3
1
10
4
7
2
5
6
8
9

思路

(模拟题 题意是将读入的一个个数字放到队伍的队首 最后输出这列数字)

存入数组 倒序输出

对已经输出的数字进行标记 再次遇到就不再输出

最后从 1 ~ n 遍历 将未标记的数字依次输出

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <bits/stdc++.h>
using namespace std;
int a[200005],b[200005];
int main()
{
    int t,m,x;
    scanf("%d%d",&t,&x);
    memset(b,1,sizeof b);
    memset(a,0,sizeof a);
    for (int i=0;i<x;i++)
    {
        scanf("%d",&a[i]);
    }
    for (int i=x-1;i>=0;i--)
    {
        if (b[a[i]]>0)
        {
            printf("%d\n",a[i]);
            b[a[i]]=0;
        }
    }
    for (int i=1;i<=t;i++)
        if (b[i]>0)
        printf("%d\n",i);
    return 0;
}

 

I题 数学题

 

2299: Skinny Polygon

Submit Page    Summary    Time Limit: 20 Sec     Memory Limit: 256 Mb     Submitted: 23     Solved: 4     SpecialJudge


Description

You are asked to find a polygon that satisfies all the following conditions, given two integers, xbb and ybb.

  • The number of vertices is either 3 or 4.
  • Edges of the polygon do not intersect nor overlap with other edges, i.e., they do not share any points with other edges except for their endpoints
  • The x- and y-coordinates of each vertex are integers
  • The x-coordinate of each vertex is between 0 and xbb, inclusive. Similarly, the y-coordinate is between 0 and ybb, inclusive.
  • At least one vertex has its x-coordinate 0.
  • At least one vertex has its x-coordinate xbb
  • At least one vertex has its y-coordinate 0
  • At least one vertex has its y-coordinate ybb
  • The area of the polygon does not exceed 25000

The polygon may be non-convex.

Input

The input consists of multiple test cases. The first line of the input contains an integer n, which is the number of the test cases (1 ≤ n ≤ 105 ). Each of the following n lines contains a test case formatted as follows. xbb ybb xbb and ybb (2 ≤ xbb ≤ 109 , 2 ≤ ybb ≤ 109 ) are integers stated above

Output

For each test case, output description of one polygon satisfying the conditions stated above, in the following format. v x1 y1 . . . xv yv Here, v is the number of vertices, and each pair of xi and yi gives the coordinates of the i-th vertex, (xi , yi). The first vertex (x1, y1) can be chosen arbitrarily, and the rest should be listed either in clockwise or in counterclockwise order. When more than one polygon satisfies the conditions, any one of them is acceptable. You can prove that, with the input values ranging as stated above, there is at least one polygon satisfying the conditions.

Sample Input

2
5 6
1000000000 2

Sample Output

4
5 6
0 6
0 0
5 0
3
1000000000 0
0 2
999999999 0

思路

一直在思考这个题目 

应该是有通解

注意 :non-convex 这个单词表示 非凸包 (我们一开始以为只能是凸包)

那就可以是凹四边形啦~~

先控制底边最小 再控制与底边相对的高最小

 

 

在比赛最后一个小时的时候 

我们就想到了 上述方法 

但是 我考虑到 如果 (x-1,y-1)不在四边形内 需要再次寻找该点

所以 重新考虑斜率的值

没想到 数据水啊~~~

刚刚写了一发上述解法的代码 然后在CSU上过了 = =

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int t;
    long long x,y;
    scanf("%d",&t);
    for (int i=0;i<t;i++)
    {
        scanf("%lld%lld",&x,&y);
        printf("4\n");
        printf("0 1\n");
        printf("%lld %lld\n",x-1,y-1);
        printf("1 0\n");
        printf("%lld %lld\n",x,y);
    }
    return 0;
}

CSU上过了 

在 cf 的gym上过不了 (据说是 gym 的数据比较强) 

 

数据的锅555

还会再补一次代码

 

我又来了 

啊啊啊啊啊啊啊啊啊 

我就知道要用GCD 但是 队友问我 如果互质咋办

:??????母鸡啊

就没写

看一下 大佬写的题解

https://blog.youkuaiyun.com/acterminate/article/details/79246584

之后会补上 手写的分析……

其他题目也改日再补……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值