8.11模拟:数据结构

前言

320分
还不错啦
没有挂分还是很可贵的
(暴力TLE就不怪我了)
T4反过来想其实就很可做了
逆向的思想需要培养(今天T1、昨天T2也是)
说实话今天早上状态不太好
特困生
不过T1成了一个很好的激励剂

考场

(不分题讲了,有些乱)
先看了一下题,真就和zld的提示一样,T1水的不行,后面的思路不太明显(但是相对感觉T3可做)
本来应该先写个T3的暴力稳一稳什么的
但是鉴于T1水的太厉害了
我基本还是有自信不会把链表的板子写挂的
所以还是先把T1正解写了(10min,心态就好起来了)
然后是T2和T4的暴力
T2的暴力还是有了一些技巧,用链表插入代替排序可以到n2(70pts)
T4怎么想各种思路都是n3的,50分之外不太能奢求太多了
回头看相对感觉可做的T3
(gg诚不欺我,先把暴力写了心态稳了很多)
(尤其是还剩两个多小时的时候)
然后听naonao的预言尝试了离线然后发现就非常可做
然后不着急细细写就把它切掉了(这题没挂还是挺不容易的)
此时大概是10:20,还有80分钟
时间的利用效率开始直线下滑
先把每道题瞅了一遍确保没有脑残bug
然后我想到T2n=2000的70分似乎n2logn也能过
又因为觉得链表很容易挂
所以反向优化加了个log变成无脑代码
(然后就T了10分…事实是我那个链表并没有写挂…)
然后还有60min的样子
开始抠分最不满的T4
没有抠出来,其实就是反着想没有想到
然后开始写玄学常数级优化…
(包括特殊数据就上下左右翻折等诡异操作)
然后就过了60!
针不戳
(996OJ的机子测甚至可以到80)
然后就又检查了检查,就结束了

复盘

T1 forward

缺乏逆向思维
反着想甚至比链表还好做

T2 basket

爆肝题
主要是set用的不熟练
std那样把新元素insert进去再删点会好做很多
而且还加了两个上下界防止溢出值得学习
我的代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=2e5+100;
int n,m,q,t;
int nxt[N],jd[N];
struct node{
	ll a,b,c,id;
	bool operator < (const node y)const{
		if(b!=y.b)return b<y.b;
		else return c>y.c;
	}
}p[N];
bool cmp(node x,node y){
	return x.a>y.a;
}
struct node0{
	ll v,id;
	bool operator < (const node0 y)const{
		return v<y.v;
	}
};
set<node>s;
set<node>:: iterator it;
multiset<node0>s0;
multiset<node0>:: iterator it0;
ll ans,A,B,C;
void insert(node o){
	it=s.upper_bound(o);
	if(it!=s.end()&&(*it).c>=o.c) return;
	jd[o.id]=1;
	while(it!=s.begin()&&!s.empty()){
		it--;
		if((*it).c<=o.c){
			jd[(*it).id]=0;s.erase(it);it=s.upper_bound(o);
		}
		else{
			nxt[(*it).id]=o.c;
			s0.insert((node0){(*it).b+nxt[(*it).id],(*it).id});
			break;
		}
	}
	it=s.upper_bound(o);
	if(it!=s.end()){
		nxt[o.id]=(*it).c;
	}
	else nxt[o.id]=0;
	s0.insert((node0){o.b+nxt[o.id],o.id});
	s.insert(o);
	return;
	
}
int main(){
	scanf("%d",&t);
	while(t--){
		memset(nxt,0,sizeof(nxt));
		s.clear();
		s0.clear();
		scanf("%d",&n);
		for(int i=1;i<=n;i++){
			scanf("%lld%lld%lld",&p[i].a,&p[i].b,&p[i].c);
		}
		sort(p+1,p+1+n,cmp);
		for(int i=1;i<=n;i++) p[i].id=i;
		ans=p[1].a;
		for(int i=1;i<=n;i++){
			A=i==n?0:p[i+1].a;
			insert(p[i]);
			ll now;
			while(1){
				node0 o=*s0.begin();
				//printf("ok");
			//	printf("top:v=%d id=%d nxt=%d\n",o.v,o.id,nxt[o.id]);
				if(jd[o.id]&&o.v==p[o.id].b+nxt[o.id]){
					now=o.v;break;
				}
				else s0.erase(s0.begin());
			}
			ans=min(ans,A+now);
			ans=min(ans,A+(*s.begin()).c);
			//printf("i=%d A=%lld head=%lld\n",i,A,*s0.begin());
			//printf("now=%d C=%d ans=%lld\n",now,(*s.begin()).c,ans);
		}
		printf("%lld\n",ans);
	}
}
/*
2
3
1 2 100
100 4 5
1 100 3
1
10 10 10
*/

T4 square

代码细节挺多的
不太好调
尤其是复制粘贴一定要改干净!

总结

今天不错啦
但是晚上T2调了太久了
抵制特困生,我需要早睡qwq
明天:动态规划,加油!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值