关于2022 online 又名空前迫切的敲击欲

目录

期间分配

部分题目总结

丹钓战stack

小结


期间分配

看了三道题,最开始有思路的T2

可以写交集,并判断集合是否相等,但介于操作次数多,TLE在所难免

或者建树,可以用匹配节点,再或按边匹配

哈哈 再见

10++min

T3题意易于理解得像坑

于是拥抱T1 

算法不够,硬推来凑


因为所求区间里的每一个数据都只有一个固定的结束位置

(即会在遇到这一位置的二元组时,入栈)

做预处理,求出固定位置

将区间左侧与固定位置比较,求出和


开始思路乱,数组名写颠倒了,导致花时间在这个地方debug(礼貌微笑)

样例及自测数据过,提供数据由于粘贴时无空格,放弃(其实可以用测试器)

时至90min

回头看T3

印象里能在题意里征服数据范围的,分治、矩阵,但抽丝剥茧也挂不上

最后暴力,简化,调试,简化,调试

+30min

决定搞T2的交集和树

交集搞离散化,看到数据范围,弃了

树排序卡了,匹配卡了

得意哈哈,果然不出所料

+40min

之后是大型冥(水)顽(出)抵(自)抗(我)现场

部分题目总结

丹钓战stack

做了一个预处理的简化,再一个简单的函数求值结束,摘取TLE桂冠

#include<bits/stdc++.h>//TLE代码 
using namespace std;
const int N=5e5+1;
int T,n,l,r,top,a[N],b[N],stk[N],res[N];
inline int read() {
	register int x=0,f=0;
	register char ch=getchar();
	while(!isdigit(ch)) f=ch=='-',ch=getchar();
	while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	return f?-x:x; }

void work(int x,int y) {
	int total=1,st=x;
	for(register int i=x+1; i<=y; i++) {
		if(res[i]<st) total++,st=i; }
	printf("%d\n",total); }

int main() {
	n=read(),T=read();
	for(register int i=1; i<=n; i++) a[i]=read();
	for(register int i=1; i<=n; i++) b[i]=read();
	for(register int i=n; i; i--) {
		while(top&&b[stk[top-1]]<b[i]&&a[stk[top-1]]!=a[i])
			res[stk[top-1]]=i,top--;
		stk[top++]=i; }
	while(T--) l=read(),r=read(),work(l,r);
	return 0; }

能想到的缩短时间,也只有上述两个操作处

明显求值操作是有工夫可下的,因为操作有重叠,且计算有规律可循

for for的数据,先天可以从一维上的处理变成二维,纵向的搞数位,就爽起来了

貌似就是什么二维偏序

为了配合这一操作的精简,预处理上也有改变

所以AC代码如下

(附:23的边界贴合数据范围)

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+1;
int T,n,l,r,top,a[N],b[N],stk[N];
int p[N],res[N][24];
inline int read() {
	register int x=0,f=0;
	register char ch=getchar();
	while(!isdigit(ch)) f=ch=='-',ch=getchar();
	while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	return f?-x:x; }

void work(int x,int y) {
	int total=1,st=x;
	for(register int i=23; i>=0; i--) {
		if(!res[st][i]) continue;
		if(res[st][i]>y) continue;
		total+=(1<<i),st=res[st][i]; }
	printf("%d\n",total); }

int main() {
	n=read(),T=read();
	for(register int i=1; i<=n; i++) a[i]=read();
	for(register int i=1; i<=n; i++) b[i]=read();
	for(register int i=1; i<=n; i++) {
		while(top&&(a[stk[top]]==a[i]||b[stk[top-1]]<b[i]))
			res[stk[top]][0]=i,top--;
		stk[++top]=i; }
	for(register int i=n; i; i--)
		for(register int j=1; j<=23; j++)
			if(res[res[i][j-1]][j-1])
				res[i][j]=res[res[i][j-1]][j-1];
			else break;
	while(T--) l=read(),r=read(),work(l,r);
	return 0; }

小结

第一次时间长至 4x60 min 写题,T1捞几个点,T3捞一个点

写题时:有被爽到,莫名过瘾

估分时:心塞ing

恢复理智后

无论思路,实现到代码上总是需要调试和debug

比起前几个月,现在能调试过,可喜可贺

可以理解有很多算法不会,但至于像雨后春笋一样冒出来不(彻底疯狂

好吧,很至于

拒绝隔离图论,对各类天马行空say 886 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值