数据太水

P2085 最小函数值

如果用暴力解法,这题顶多是个橙
by cyh_qwq @ 2023-06-22 14:39:16


@[cyh_qwq](/user/550107) ## 我家暴力怎么你了? ### 时间复杂度 计算了一下正常枚举差不多在`4e8`,洛谷机子1秒可以跑`1e9`,你说的暴力应该是`n*m*log(m)=4*1e9`,这个过不了,但我这个可以过。 ### 空间复杂度 看似使用小根堆,可以使用大根堆保持m个最小的,然后倒着输出,这样只存了m个数。 ### 正确性 首先第二个循环从1到100是对的, `1≤Ai≤10,Bi≤100,Ci≤10e4` a,b,c最小时,他肯定弄的答案多, 所以设`a=1,b=1,c=1`,为了防止其他值比他小,所以设极端值`a=10,b=100,c=10000`。 `Ai​x*X+Bi​x+Ci` 当`x=10000,a=1,b=1,c=1`时,结果是`1e8+1e4+1` 当x=9000时,`a=10,b=100,c=10000`时,结果是`8.1*1e7+9e5+1e4<1e8+1e4` 所以直接枚举1e3肯定对,因为无论a、b、c是多少,x=1e3肯定取不到了,直接枚举,正确性可以保证。
by a1a2a3a4a5 @ 2023-07-08 14:07:05


```cpp #include<bits/stdc++.h> using namespace std; int n,m; long long a,b,c,sz[11000]; priority_queue<long long> dui; int main() { cin>>n>>m; for(int i=1;i<=n;i++) { cin>>a>>b>>c; for(int j=1;j<=1000;j++) { dui.push(a*j*j+b*j+c); if(dui.size()>m) dui.pop(); } } for(int i=m;i>=1;i--) sz[i]=dui.top(),dui.pop(); for(int i=1;i<=m;i++) cout<<sz[i]<<" "; return 0; } ```
by a1a2a3a4a5 @ 2023-07-08 14:08:58


@[a1a2a3a4a5](https://www.luogu.com.cn/user/658008) 我指的暴力是O(m^2n)的算法,这个算法也确实能A。你这个算法确实快了点,但正常比赛的评测机可能也跑不了这么快。我是用的O(mlog(n))算法。
by cyh_qwq @ 2023-07-09 14:54:33


```cpp #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<queue> using namespace std; const int N=3e4+5; int n,tot,m; int a[N],b[N],c[N]; int s[N]; long long heap[N]; int idx[N]; inline void up(int p){ while(p>1){ if(heap[p]<heap[p/2]){ swap(heap[p],heap[p/2]); swap(idx[p],idx[p/2]); p/=2; } else break; } } inline void down(int p){ int s=p*2; while(s<=tot){ if(s<tot&&heap[s]>heap[s+1])s++; if(heap[s]<heap[p]){ swap(heap[s],heap[p]); swap(idx[s],idx[p]); p=s,s=p*2; } else break; } } inline void insert(long long x,int id){ heap[++tot]=x; idx[tot]=id; up(tot); } inline void del(){ heap[1]=heap[tot--]; idx[1]=idx[tot+1]; down(1); } int main(){ scanf("%d%d",&n,&m); int k; for(int i=1;i<=n;i++){ scanf("%d%d%d",&a[i],&b[i],&c[i]); s[i]=1,insert(s[i]*s[i]*a[i]+s[i]*b[i]+c[i],i); } int id; for(int i=1;i<=m;i++){ printf("%lld ",heap[1]); id=idx[1]; del(); s[id]++; insert(s[id]*s[id]*a[id]+s[id]*b[id]+c[id],id); } } ```
by cyh_qwq @ 2023-07-09 14:55:28


RT,如果你觉得这个题不用这么做,那我也无话可说
by cyh_qwq @ 2023-07-09 14:56:45


这暴力不吸氧20,吸氧100啊
by chen_z @ 2023-07-19 19:20:11


确实,我这种离谱程序都能过\ [每次循环重新建堆吸氧6.24s](https://www.luogu.com.cn/record/145724938)
by qwezky @ 2024-02-02 11:05:39


这个也过了!! ```cpp #include<bits/stdc++.h> using namespace std; int n,m,a[1000001],s; int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ int A,B,C; cin>>A>>B>>C; for(int j=1;j<=100;j++){ a[++s]=A*j*j+B*j+C; } } sort(a+1,a+s+1); for(int i=1;i<=m;i++){ cout<<a[i]<<" "; } return 0; } ``` [记录](https://www.luogu.com.cn/record/145724938)
by shicj @ 2024-02-11 19:05:44


氧气好闪,拜谢氧气
by 菜のcrzOvO @ 2024-02-17 09:07:20


|