前言
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
明天:动态规划,加油!