害羞
十年 O I OI OI一场空 , , ,不开 l o n g l o n g long long longlong见祖宗。
这题单调队列优化
d
p
dp
dp作为
T
1
T1
T1难度还说的过去
首先可以反方向地想
渣男
H
H
HH
HH不能超过连续娶
k
k
k个妹子和在每
k
+
1
k+1
k+1个里甩一个妹子是等价的
设
d
p
[
i
]
dp[i]
dp[i]表示前
i
i
i个所有被甩的妹子的漂亮程度的最小总和
那么
d
p
[
i
]
=
a
[
i
]
+
m
i
n
{
d
p
[
j
]
}
,
i
−
k
−
1
<
j
<
i
dp[i]=a[i]+min\{dp[j]\},i-k-1<j<i
dp[i]=a[i]+min{dp[j]},i−k−1<j<i
但是复杂度
O
(
n
2
)
O(n^2)
O(n2)
,
n
=
100000
, n=100000
,n=100000肯定过不了…
所以我们选择单调队列优化
这时候 一个大问题来了 我不想
O
(
n
)
O(n)
O(n)过 怎么办呢?其实是忘了咋打单调队列了
那就用优先队列吧…
#include<bits/stdc++.h>
using namespace std;
#define N int(1e5+10)
#define reg register
typedef long long ll;
inline void read(ll &x){
ll s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){s=(s<<3)+(s<<1)+(ch&15);ch=getchar();}
x=s*w;
}
struct node{
ll pos,val;
bool operator <(const node &x) const{
return x.val<val;
}
}c;
priority_queue<node> q;
ll n,k,ans,sum=1e16,a[N],dp[N];
int main(){
read(n),read(k);
for(reg int i=1;i<=n;i++)read(a[i]),ans+=a[i];
c.pos=0,c.val=0,q.push(c);
for(reg int i=1;i<=n;i++){
dp[i]+=a[i];
while(!q.empty()&&q.top().pos<i-k-1)q.pop();
dp[i]+=dp[q.top().pos];
c.pos=i,c.val=dp[i];q.push(c);
}
for(reg int i=n-k;i<=n;i++)sum=min(sum,dp[i]);
printf("%lld\n",ans-sum);
}
新人
g c d ( a , b ) = g c d ( b , a − b ) gcd(a,b)=gcd(b,a-b) gcd(a,b)=gcd(b,a−b)
这题叫做思维题
o
r
or
or数论题?
叫啥也应该都可以用三个字概括
:
:
:傻逼题
找到
1
1
1到
n
−
1
n-1
n−1中
g
c
d
(
a
,
b
)
gcd(a,b)
gcd(a,b)递归层数最少的就好咯
上代码
#include<bits/stdc++.h>
using namespace std;
#define inf int(1e8)
inline void read(int &x){
int s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){s=(s<<3)+(s<<1)+(ch&15);ch=getchar();}
x=s*w;
}
int gcdd(int a, int b){
if(!b)return inf;
if(b==1)return a-1;
return gcdd(b,a%b)+a/b;
}
int n,now=inf;
int main(){
read(n);
for(int i=1;i<=(n+1)/2;i++)now=min(now,gcdd(n,i));
printf("%d\n",now);
}
人和
傻人有傻福 , , ,但傻 A C AC AC没有
e
r
r
err
err水贪心?从小到大?入门?
那你试
4
4
4
1
1
1
4
1\,1\,1\,4
1114
(傻*
从大到小 …一个一个选
上代码
#include<bits/stdc++.h>
using namespace std;
#define reg register
#define N int(1e6+100)
inline void read(int &x){
int s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){s=(s<<3)+(s<<1)+(ch&15);ch=getchar();}
x=s*w;
}
int n,a[N],now,ans;
bool w;
bool cmp(int x,int y)
{
return x>y;
}
int main()
{
read(n);
for(reg int i=1;i<=n;i++)read(a[i]);
sort(a+1,a+1+n,cmp);
w=true,now=a[1];
for (int i=1;i<=n;i++)
{
if (a[i]<now&&!w)now=a[i];
now--;
if(!now)now=a[i],ans++,w=false;
}
printf("%d\n",ans);
}
把话撂这了 能 H a c k Hack Hack我这个贪心我请全机房一人一杯晶一学长 此行不删
10.22
の
U
P
D
:
10.22のUPD:
10.22のUPD:
8
8
8
6
6
6
6
6
6
1
0
6\,6\,6\,6\,6\,6\,1\,0
66666610
于是就有了下面的:
真香…
现在
8
:
28
8:28
8:28
8
:
30
8:30
8:30出分
不
A
K
AK
AK 我
D
a
w
n
Dawn
Dawn直播吔*
U
P
D
:
UPD:
UPD:显然
A
K
AK
AK了
2333
2333
2333