首页 > 其他分享 >CSP-S 2021 补题

CSP-S 2021 补题

时间:2023-10-13 15:58:01浏览次数:31  
标签:top 补题 2021 廊桥 define CSP left

P7913 [CSP-S 2021] 廊桥分配

考虑对于国际航班和国内航班单独进行分配

对于国际航班 处理 \(res1[i]\) 数组作为给国际航班分配 \(i\) 个廊桥的最大飞机停靠数量 \(res2[i]\) 同理

对于每一种类的航班 我们维护一个 \(in\) 优先队列和一个 \(left\) 优先队列

\(in\) 队列中放所有现在停靠在廊桥里的飞机(记录离港时间和使用廊桥编号) \(left\) 是剩余的廊桥编号

那么显然我们可以将

最后对于 \(res\) 数组分别做前缀和即可

#include<bits/stdc++.h>
using namespace std;
#define mid ((l+r)>>1)
#define inl inline
#define eb emplace_back
#define endl '\n'
#define pii pair<int,int>
#define mkp make_pair
#define fi first
#define se second
#define print(x) cerr<<#x<<'='<<x<<endl
#define getchar() cin.get()
const int N = 1e5 + 5;
const int inf = 0x3f3f3f3f;
const int mod = 998244353;

int read()
{
	int x = 0 , f = 1;
	char ch = getchar();
	while ( !isdigit(ch) ) { if ( ch == '-' ) f = -1; ch = getchar(); }
	while ( isdigit(ch) ) { x = ( x << 1 ) + ( x << 3 ) + ( ch ^ 48 ); ch = getchar(); }
	return x * f;
}

int n , m1 , m2 , res1[N] , res2[N] , ans;

struct node { int l , r; friend bool operator < ( const node &a , const node &b ) { return a.l < b.l; } } a[N] , b[N];

void solve ( node * a , int m , int * res )
{
    priority_queue < pii , vector<pii> , greater<pii> > in;
    priority_queue < int , vector<int> , greater<int> > left;
    for ( int i = 1 ; i <= n ; i ++ ) left.push(i);
    for ( int i = 1 ; i <= m ; i ++ )
    {
        while ( !in.empty() && a[i].l >= in.top().fi ) left.push ( in.top().se ) , in.pop();
        if ( left.empty() ) continue;
        ++ res[left.top()];
        in.push ( { a[i].r , left.top() } );
        left.pop();
    }
    for ( int i = 1 ; i <= n ; i ++ ) res[i] += res[i-1];
}

signed main ()
{
	ios::sync_with_stdio(false);
	cin.tie(0) , cout.tie(0);
    n = read() , m1 = read() , m2 = read();
    for ( int i = 1 ; i <= m1 ; i ++ ) a[i].l = read() , a[i].r = read();
    for ( int i = 1 ; i <= m2 ; i ++ ) b[i].l = read() , b[i].r = read();
    sort ( a + 1 , a + m1 + 1 ) , sort ( b + 1 , b + m2 + 1 );
    solve ( a , m1 , res1 ) , solve ( b , m2 , res2 );
    for ( int i = 0 ; i <= n ; i ++ ) ans = max ( ans , res1[i] + res2[n-i] );
    cout << ans << endl;
    return 0;
}

P7915 [CSP-S 2021] 回文

我们首先找到唯一的点使得 \(a[1]=a[pos1]\) \(a[pos2]=a[2*n]\)

相当于是枚举第一个点到底应该是左还是右 并确定最后一个点的位置 下面以第一个操作为左操作为例 右操作是一样的

那么我们对于 \([1,pos1-1]\) 和 \([pos1+1,2*n-1]\) 来进行处理

将第一个栈的栈顶或第二个栈的栈顶 和第一个栈的栈底或第二个栈的栈底来进行匹配

#include<bits/stdc++.h>
using namespace std;
#define mid ((l+r)>>1)
#define inl inline
#define eb emplace_back
#define endl '\n'
#define pii pair<int,int>
#define mkp make_pair
#define fi first
#define se second
#define print(x) cerr<<#x<<'='<<x<<endl
#define getchar() cin.get()
const int N = 1e6 + 5;
const int inf = 0x3f3f3f3f;
const int mod = 998244353;

int read()
{
	int x = 0 , f = 1;
	char ch = getchar();
	while ( !isdigit(ch) ) { if ( ch == '-' ) f = -1; ch = getchar(); }
	while ( isdigit(ch) ) { x = ( x << 1 ) + ( x << 3 ) + ( ch ^ 48 ); ch = getchar(); }
	return x * f;
}

int n , a[N] , cnt , vis[N] , pos1 , pos2;

char res[N];
int check ( int l1 , int r1 , int l2 , int r2 )
{
    for ( int i = 1 ; i <= n - 1 ; i ++ )
    {
        if ( l1 <= r1 && ( ( l2 <= r2 && a[l1] == a[l2] ) || ( l1 < r1 && a[l1] == a[r1] ) ) )
        {
            if ( l1 < r1 && a[l1] == a[r1] ) res[i] = 'L' , res[2*n-2-i+1] = 'L' , ++ l1 , -- r1;
            else res[i] = 'L' , res[2*n-2-i+1] = 'R' , ++ l1 , ++ l2;
        }
        else if ( l2 <= r2 && ( ( l1 <= r1 && a[r1] == a[r2] ) || ( l2 < r2 && a[l2] == a[r2] ) ) )
        {
            if ( l1 <= r1 && a[r1] == a[r2] ) res[i] = 'R' , res[2*n-2-i+1] = 'L' , -- r1 , -- r2;
            else res[i] = 'R' , res[2*n-2-i+1] = 'R' , ++ l2 , -- r2;
        }
        else return 0;   
    }
    return 1;
}
/*
2
5
4 1 2 4 5 3 1 2 3 5
3
3 2 1 2 1 3
*/

signed main ()
{
	ios::sync_with_stdio(false);
	cin.tie(0) , cout.tie(0);
    int T = read();
    while ( T -- )
    {
        memset ( res , 0 , sizeof res );
        n = read();
        for ( int i = 1 ; i <= 2 * n ; i ++ ) a[i] = read();
        for ( int i = 2 ; i <= 2 * n ; i ++ ) if ( a[i] == a[1] ) { pos1 = i; break; }
        for ( int i = 1 ; i < 2 * n ; i ++ ) if ( a[i] == a[2*n] ) { pos2 = i; break; }
        if ( check ( 2 , pos1 - 1 , pos1 + 1 , 2 * n ) ) cout << "L" << res + 1 << "L" << endl;
        else if ( check ( 1 , pos2 - 1 , pos2 + 1 , 2 * n - 1 ) ) cout << "R" << res + 1 << "L" << endl;
        else cout << -1 << endl;
    }
    return 0;
}

标签:top,补题,2021,廊桥,define,CSP,left
From: https://www.cnblogs.com/Echo-Long/p/17762331.html

相关文章

  • 考场(CSP模拟54联测16)
    T1逆天高精,跳!T2逆天回文串,跳。。。。。跳个屁。。。。。将每个字符要跳到的位置与它的起始位置看成一段区间:(以下的\(1,2,3\)均称为方案\(1,2,3\))对于从左向右跳与从右向左跳有交的两端区间有交的情况下,不论谁先跳贡献均相同。对于两个字符向同一方向跳的情况:若一......
  • 2023 CSP-J/S 第一轮游记
    Day-1教练说要提前带一点干粮,因为一中没有开食堂啊啊啊啊啊啊啊啊啊啊,要坐校车会学校吃饭,如果路上堵的话就直接在校车上吃了,所以去了趟小卖部买了一袋面包和巧克力,花了快\(30\)元。贵爆了!赶紧倒闭!Day1跟校车(水泥搅拌车)去一中,早上入门组挺简单,但是人真的太多了。阅读程序......
  • CSP-2023游记
    Day-9gp终于开网了,做了几道zsq给的题luoguP4306:一开始看到这题觉得复杂度最少是\(\frac{n^3}{w}\),尝试优化了一下,结果发现优化不了,觉得不可做,一看题解,正解竟然真是\(\frac{n^3}{w}\),出题人开2000是不是有病啊。luoguP1407:这题一眼觉得是割边,结果发现是错的。考虑对于原......
  • 2020,2021 年 CF 简单题精选 做题记录
    2023.10.12开坑,打了几场div.2之后一直觉得这方面水平差太多,今天刚好在洛谷看到这个题单就准备开始做了,里面从黄到黑都有,我会尽量都做,并在这里记录。总共49题,我可能平时有时间就做一两题,估计是个长期坑了((。题单链接[Y]表示独立完成,[N]表示看题解之后完成。......
  • 2020-2021 ICPC, NERC, Southern and Volga Russian Regional Contest (Online Mirror
    有五种种类的垃圾,数量分别为\(a_1,a_2,a_3,a_4,a_5\)。第一种为纸质垃圾第二种为塑料垃圾第三种双非垃圾第四种基本纸质垃圾第五种基本塑料垃圾有三种垃圾桶,容量分别为\(c_1,c_2,c_3\)。第一种垃圾桶可以放入:纸质垃圾和基本纸质垃圾第二种垃圾桶可以放入:塑料......
  • 动态规划的状态设计 | bot 讲课の补题
    stojames1badcreeperorz.好厉害的题,但是怎么有人补了三天才补完呢?CF1810GTheMaximumPrefix线性dp,怎么有bot说题目难度在*2400~*2800之间结果开场就是*3200啊/youl尝试直接正着做,发现要记\(f_{i,j,k}\)表示前\(i\)个数,最大前缀和是\(j\),当前前缀和是\(k\)......
  • 测试4 20211102尹子扬静态库的测试
    1.首先,编译你的模块源代码成为目标文件(.o文件)。例如,如果有一个模块名为mymath.c,你可以使用以下命令来生成目标文件:点击查看代码gcc-cmymath.c-omymath.o请确保你以适当的方式编译所有的模块源代码文件。2.将所有目标文件打包成一个静态库文件。你可以使用ar命令来......
  • GitHub发布2021年度报告:中国开发者数量全球第2 ,最受欢迎的语言是
    临近年底,各大平台年终报告频频发布。作为程序员,应该关注些什么呢?近日,全球最大开发者社区GitHub重磅发布了《2021年度Octoverse报告》,本报告首次结合了来自GitHub上,超过400万个代码库的数据,共有超过12000多名开发者参与问卷调查。在即将过去的2021年,开发者社区发生了哪些有趣......
  • CSP模拟52联测14 C.天竺葵
    CSP模拟52联测14C.天竺葵目录CSP模拟52联测14C.天竺葵题目大意思路code题目大意给定两个长度为\(n\)的序列\(a,b\)需要在\(a\)序列中好到最长的序列\(c\)满足\(c_{i+1}>b_i\timesc_i\)输出长度\(1\len\le10^6\)思路感觉和\(n(\logn)\)求最长上升......
  • CSP模拟52 & A 层联测 9
    2023NOIPA层联测9长春花观察大样例可以发现,函数\(f(x)\)的值很小,那么可以考虑暴力枚举。用一个桶存一下平方数对\(p\)取模的值是否存在,那么可以选择从小到大枚举\(a\),找到第一个存在的\(b\)。紫罗兰考虑什么情况下会出现环,当两个点已经连通时,再在这两个点之间加一......