这题是不是该弄一个数据加强版卡掉O(n^2)的做法

P1230 智力大冲浪

(还有既然O(n^2)算法能过的话把难度调为橙是不是更合适一些)
by vectorwyx @ 2020-08-13 09:05:34


~~这种水题不差这一个难度吧(~~
by 血色黄昏 @ 2020-08-13 09:16:53


啊这,我们校OJ有数据加强版,用并查集优化贪心
by Prean @ 2020-08-13 09:44:11


@[limaopipi2022](/user/160839) ?!
by vectorwyx @ 2020-08-13 11:21:43


@[limaopipi2022](/user/160839) 能说一下怎么用并查集优化吗QAQ,我只会用堆优化,菜死了/kk
by vectorwyx @ 2020-08-13 11:22:44


@[vectorwyx](/user/238408) 用并查集维护时间
by Prean @ 2020-08-13 11:23:18


@[mrsrz](/user/6813) 请求将此题降橙并添加数据加强版QAQ
by vectorwyx @ 2020-08-13 11:25:18


@[limaopipi2022](/user/160839) 额?维护哪些时间啊QAQ
by vectorwyx @ 2020-08-13 11:26:08


@[vectorwyx](/user/238408) 贪心是按照价值排序,然后从时间往开头找,找到第一个没有占用的时间嘛 就是用并查集优化找的过程
by Prean @ 2020-08-13 11:28:54


并查集维护: ```cpp #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int N=1e6+6; int m,n,f[N],sum,ans; bool flag; struct Node{ int d,s; bool operator<(const Node &B){ return s>B.s||(s==B.s&&d<B.d); } }a[N]; void Build(int n){ for(int i=1;i<=n;++i) f[i]=i; } int Find_Change(int p){ if(p<=0) return 0; else if(f[p]!=p) f[p]=Find_Change(f[p]); else if(f[p]==p){ f[p]=p-1; flag=1; return f[p]; } } int main(){ cin>>m>>n; for(int i=1;i<=n;++i) cin>>a[i].d; for(int i=1;i<=n;++i){ cin>>a[i].s; sum+=a[i].s; } Build(n); sort(a+1,a+n+1); for(int i=1;i<=n;++i){ flag=0; int re=Find_Change(a[i].d); if(flag) ans+=a[i].s; } cout<<m-(sum-ans); return 0; } ```
by Christophe_ @ 2021-12-19 20:48:44


|