0%

思路讲解

样例一就是选一条垂线就行。

image

通过样例一不难发现,只要存在一条线与所有的线段相交,那么,就可以了。

因为所有与这条线段相交的点都会投影到这条线的垂线上。

AC代码

https://vjudge.net/solution/63255893

心路历程(WA,TLE,MLE……)

思路讲解

线段树上二分

https://www.luogu.com.cn/article/2a6kvgjo

参考这篇题解。

当然,我们先要枚举一下需要操作几轮。

1
2
3
4
5
6
7
8
9
10
FOR(j,1,64){
if(w>sum){
w-=sum;
ans+=N;
}else{
break;
}
bei*=2;
sum*=2;
}

AC代码

https://www.luogu.com.cn/record/233323384

心路历程(WA,TLE,MLE……)

指针

new与delete

image

构造函数

调用顺序取决于类中声明顺序

image

自己的按值类型是不能够出现的。

image

成员对象构造函数先执行

image

析构函数

按照栈的方式推出。

image

常量/静态

静态数据成员是可以以按值类型出现的。

image

常量只能在初始化列表里被初始化

image

静态成员的声明与定义

image

友元

友元不具有传递性不对称

image

友元只能够在类内声明

image

思路讲解

线段树上二分,其实还是挺简单的,跑的也比较快。

然后也不用很固执的不用递归,zkw确实好,但是递归的线段树上二分更好理解,跑的也比较快。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// 找到最靠近r的符合位置
template<class F> int findl(int r,F&&fun){
return findl(1,r,0,sz-1,fun);
}
// 找到最靠近r的符合位置
template<class F> int findl(int o,int qr,int l,int r,F&&fun){
if(l==r){
return l;
}
// pushdown(o);
ll ls=o<<1,rs=ls|1;
ll mid=l+r>>1;
ll pos=-1;
if(fun(tr[rs]) && mid+1<=qr) pos=findl(rs,qr,mid+1,r,fun);
if(pos!=-1) return pos;
if(fun(tr[ls])) pos=findl(ls,qr,l,mid,fun);
return pos;
}
// 找最靠近l的符合位置
template<class F> int findr(int l,F&&fun){
return findr(1,l,0,sz-1,fun);
}
// 找最靠近l的符合位置
template<class F> int findr(int o,int ql,int l,int r,F&&fun){
if(l==r){
return l;
}
// pushdown(o);
ll ls=o<<1,rs=ls|1;
ll mid=l+r>>1;
ll pos=-1;
if(fun(tr[ls]) && mid>=ql) pos=findr(ls,ql,l,mid,fun);
if(pos!=-1) return pos;
if(fun(tr[rs])) pos=findr(rs,ql,mid+1,r,fun);
return pos;
}

AC代码

https://qoj.ac/submission/1263129

心路历程(WA,TLE,MLE……)

思路讲解

其实这个dp的思路非常简单,被AI带偏了。

dp[i]dp[i] 表示消除到第 i 个序列所需的攻击次数。

dp[i1]+A[i]1dp[i-1]+A[i]-1 这个表示不做任何操作。

dp[i2]+A[i1]+A[i]min(A[i],i1)dp[i-2]+A[i-1]+A[i]-\min(A[i],i-1) 这个表示做操作,A[i1]A[i-1] 需要消掉,A[i]A[i]可以跌落,跌落伤害是 min(A[i],i1)\min(A[i],i-1)A[i]min(A[i],i1)A[i]-\min(A[i],i-1) 这个就是剩余所需操作数。

1
2
3
4
5
6
7
8
9
10
11
12
13
inline void __(){
cin>>N;
vll A(N+5);
FOR(i,1,N){
cin>>A[i];
}
vll dp(N+5);
dp[1]=A[1];
FOR(i,2,N){
dp[i]=min(dp[i-1]+A[i]-1,dp[i-2]+A[i-1]+A[i]-min(A[i],i-1));
}
cout<<dp[N]<<"\n";
}

AC代码

https://codeforces.com/contest/2133/submission/335405306

心路历程(WA,TLE,MLE……)