ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[loj3561]The short shank; Redemption

2022-02-06 17:31:08  阅读:149  来源: 互联网

标签:Redemption shank int loj3561 back son dep -- st


记$L_{i}=\max_{1\le j<i,t_{j}+(i-j)\le T}j$,那么第$i$个人不越狱当且仅当$\exists L_{i}\le k<i$使得$k$上放了床垫

换言之,即在$D$个位置放床垫,并最大化$[L_{i},i)$内存在床垫的$i$数量

注意到不存在$L_{i}<L_{j}<i<j$,否则$L_{j}-j$和$L_{i}-i$的大小关系存在矛盾

进一步的,即区间关系仅有包含或相离,对每一个区间将包含其的最小区间作为其父亲,得到一棵森林

此时,问题即选择$D$个叶子,覆盖其到根的路径,长链剖分后取最长的$D$条链即可

细节上,注意特判$L_{i}$不存在和$L_{i}=i$的情况

时间复杂度为$o(n)$,可以通过

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define N 2000005
 4 vector<int>v0,v[N];
 5 int n,D,T,ans,a[N],st[N],L[N],dep[N],son[N],cnt[N];
 6 int read(){
 7     int x=0;
 8     char c=getchar();
 9     while ((c<'0')||(c>'9'))c=getchar();
10     while ((c>='0')&&(c<='9')){
11         x=x*10+c-'0';
12         c=getchar();
13     }
14     return x;
15 }
16 void dfs1(int k){
17     dep[k]=1;
18     for(int i=0;i<v[k].size();i++){
19         dfs1(v[k][i]);
20         if (dep[v[k][i]]+1>dep[k]){
21             dep[k]=dep[v[k][i]]+1;
22             son[k]=v[k][i];
23         }
24     }
25 }
26 void dfs2(int k,int t){
27     if (son[k])dfs2(son[k],t);
28     if (k==t)v0.push_back(dep[k]);
29     for(int i=0;i<v[k].size();i++)
30         if (v[k][i]!=son[k])dfs2(v[k][i],v[k][i]);
31 }
32 int main(){
33     n=read(),D=read(),T=read();
34     for(int i=1;i<=n;i++)a[i]=read()-i;
35     for(int i=1;i<=n;i++){
36         while ((st[0])&&(a[st[st[0]]]>min(a[i],T-i)))st[0]--;
37         if (a[i]<=T-i)st[++st[0]]=i;
38         if (st[0])L[i]=st[st[0]];
39         else ans++,L[i]=i;
40     }
41     st[0]=0;
42     for(int i=n;i;i--){
43         if (L[i]==i)continue;
44         while ((st[0])&&(L[st[st[0]]]>L[i]))st[0]--;
45         if (st[0])v[st[st[0]]].push_back(i);
46         st[++st[0]]=i;
47     }
48     for(int i=n;i;i--)
49         if ((L[i]<i)&&(!dep[i]))dfs1(i),dfs2(i,i);
50     for(int i=0;i<v0.size();i++)cnt[v0[i]]++;
51     for(int i=n;i;i--)
52         while ((D)&&(cnt[i]))D--,cnt[i]--,ans+=i;
53     printf("%d\n",n-ans);
54     return 0;
55 }
View Code

 

标签:Redemption,shank,int,loj3561,back,son,dep,--,st
来源: https://www.cnblogs.com/PYWBKTDA/p/15865966.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有