ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CSP 2021 总结

2021-10-26 20:33:21  阅读:163  来源: 互联网

标签:总结 int else Pb Pf 2021 ans 廊桥 CSP


CSP 2021 总结

PJ

开题顺序:1342

应该先做 T2 ,导致我 T2 直接看错

T1、T3

T1 :直接推规律即可,考场的想法应该正确

T3 :好家伙直接 map 走起

T2

最崩溃的来了 :\(5000\times8000=4e7\) 是吧,愣是给我看成了 \(4e8\)

然后想打插入排序(正解)骗分,发现插入排序不对,就直接 sort

。。。。。。。。

。。。。。。。。

。。。。。。。。

心 态 炸 裂

退役吧

T4

考试时想到双链表,过了小数据,但没过大数据

浪费了太多时间,导致了 T2 直接挂

总结

考试的心态不好,太急了,连 T1 都要好久才沉下心来想

今年的 pj 比较水,没有说什么没想到。

但是代码实现弱 —— T4 挂了,并浪费大量时间

眼花缭乱——四千万看成四亿

TG

T1

直接枚举廊桥+堆,暴力 \(O(nm\log n)\)

正解:设 \(c_i\) 表示 \(i\) 个廊桥能停靠的飞机,则 \(ans=\max c_{1,i}+c_{2,n-i}\)

考虑到每一个廊桥加入都会使得飞机可以停靠。

即 \(c_i=c_{i-1}+x\) , 因为 \(c_0=0\) ,于是可以通过已知 \(c_{i-1}\) 推出 \(c_i\)

考虑求 \(x\) ,因为先到先得,原有的廊桥是被占满的,于是新加的廊桥只会影响没有停廊桥的飞机

模拟,若当前飞机停靠的结束时间是 \(t\) ,每次查询停靠开始时间最接近 \(t\) 的停靠,用一个 set 即可

#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int n,m1,m2,c1[N],c2[N],ans;
struct rg {
	int l,r;
    bool operator <(rg A) const {
        return l<A.l;
    }
}x[N],y[N];
set<rg>S;
set<rg>::iterator it;
int main() {
    freopen("airport.in","r",stdin);
    freopen("airport.out","w",stdout);
	scanf("%d%d%d",&n,&m1,&m2);
	for(int i=1;i<=m1;i++)scanf("%d%d",&x[i].l,&x[i].r);
	for(int i=1;i<=m2;i++)scanf("%d%d",&y[i].l,&y[i].r);
	sort(x+1,x+m1+1);
	sort(y+1,y+m2+1);
    S.clear();
    for(int i=1;i<=m1;i++)S.insert(x[i]);
    for(int i=1,vl,p;i<=n;i++) {
        vl=p=0;
        while(1) {
            it=S.lower_bound((rg){p,0});
            if(it==S.end())break;
            ++vl,p=it->r,S.erase(it);
        }
        c1[i]=c1[i-1]+vl;
    }
    S.clear();
    for(int i=1;i<=m2;i++)S.insert(y[i]);
    for(int i=1,vl,p;i<=n;i++) {
        vl=p=0;
        while(1) {
            it=S.lower_bound((rg){p,0});
            if(it==S.end())break;
            ++vl,p=it->r,S.erase(it);
        }
        c2[i]=c2[i-1]+vl;
    }
    for(int i=0;i<=n;i++)
        ans=max(ans,c1[i]+c2[n-i]);
	printf("%d",ans);
} 

T2

区间 dp ,想到后直接放弃

T3

大模拟,对于第一个是 \(L\) 或 \(R\) 分类讨论

问题简化为两个栈,如何轮流弹出栈顶使序列是个回文序列

可通过奇怪证明,发现若能弹出则一定可以弹出。

于是按照字典序枚举情况即可

考场就想到了正解,但是一些奇怪的错误被 hack 了

。。。。。。。。

。。。。。。。。

。。。。。。。。

心 态 炸 裂

退役吧

题解:这里可以把栈变成双端队列,每次弹出一对相同的数,组成回文

#include<bits/stdc++.h>
using namespace std;
const int N=500005;
int T,n,x[N<<1],fl,p,ans[N<<1];
struct que {
    int q[N<<1],l,r;
    inline void clear() { l=1,r=0; }
    inline void push(int a) { q[++r]=a; }
    inline int Fr() { return q[l]; }
    inline int Bk() { return q[r]; }
    inline bool empty() { return l>r; }
    inline void Pf() { ++l; }
    inline void Pb() { --r; }
    inline int Sz() { return r-l+1; }
}A,B;
void make(int op) {
	int p1=1,p2=n;
	if(op==1)++p1;
	else --p2;
    A.clear(),B.clear();
	for(int i=p-1;i>=p1;i--)A.push(x[i]);
    for(int i=p+1;i<=p2;i++)B.push(x[i]);
    for(int i=2;i<=n/2;i++) {
        if(A.empty() && B.empty())break;
        if(B.empty()) {
            if(A.Fr()!=A.Bk())
                return;
            ans[i]=ans[n-i+1]=1;
            A.Pb(),A.Pf();
        } else if(A.empty()) {
            if(B.Fr()!=B.Bk())
                return;
            ans[i]=ans[n-i+1]=2;
            B.Pb(),B.Pf();
        } else {
            if(A.Sz()>1 && A.Fr()==A.Bk())
                ans[i]=ans[n-i+1]=1,A.Pb(),A.Pf();
            else if(A.Bk()==B.Fr())
                ans[i]=1,ans[n-i+1]=2,A.Pb(),B.Pf();
            else if(A.Fr()==B.Bk())
                ans[i]=2,ans[n-i+1]=1,A.Pf(),B.Pb();
            else if(B.Sz()>1 && B.Fr()==B.Bk())
                ans[i]=ans[n-i+1]=2,B.Pb(),B.Pf();
            else return;
        }
	}
	fl=1;
}
int main() {
	scanf("%d",&T);
	while(T--) {
		scanf("%d",&n),n<<=1;
		for(int i=1;i<=n;i++) {
			scanf("%d",&x[i]);
		}
		ans[n]=1;
		fl=0;
		ans[1]=1;
		for(int i=2;i<=n;i++)
			if(x[i]==x[1]) {
				p=i; break;
			}
		make(1);
		if(!fl) {
			ans[1]=2;
			for(int i=1;i<n;i++)
				if(x[i]==x[n]) {
					p=i; break;
				}
			make(n);
		}
		if(!fl)puts("-1");
		else {
			for(int i=1;i<=n;i++) {
				if(ans[i]==1)putchar('L');
				else putchar('R');
			}
			puts("");
		}
	}
}

T4

What?

看懂大意后直接再见

总结

很好——暴力没有挂,至少能有分

我* —— 实现上的失误,还是代码实现能力差

大总结

  1. 代码实现能力弱
  2. 思维不够发散,一些结论不难的题想不到
  3. 考试的心态不够好,过于心急,导致半天一筹莫展

过去的都过去了,希望今年 noip 能拿到 50 分

标签:总结,int,else,Pb,Pf,2021,ans,廊桥,CSP
来源: https://www.cnblogs.com/KonjakLAF/p/15467703.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有