1 条题解
-
0
这道题也是一个很神奇的题目,具体证明我不会证,说一下做法:
使用set维护出来前 大的边长,然后暴力求相邻三个边长的面积的最大值,具体证明看看别人的题解
笑点解析:我场上想了一个假贪心,但是最大值并没有找到一个就退出,所以就过了
有一个
i++当时没写#include<algorithm> #include<iostream> #include<cstdio> #include<vector> #include<set> #define int long long using namespace std; bool Test_MLE_start; constexpr int N=2*1e5+10; int _=1,n,q,a[N]; multiset<int> st;vector<int> ve; inline int reads(){ char c=getchar(); int x=0,f=1; while(!isdigit(c)){if(c=='-') f=-1;c=getchar();} while(isdigit(c)){x=(x<<3)+(x<<1)+(c^'0');c=getchar();} return x*f; } inline void files(){ freopen("triangle.in","r",stdin); freopen("triangle.out","w",stdout); } inline void clr(){ // Don't forget! } inline int calc(int a,int b,int c){return 4*a*b-(a+b-c)*(a+b-c);} bool Test_MLE_end; signed main(){ // printf("%lf Mb\n",(&Test_MLE_end-&Test_MLE_start-1)/1024.0/1024.0); // files(); // _=reads(); while(_--){ clr();n=reads(),q=reads(); for(int i=1;i<=n;i++){ a[i]=reads(); st.insert(a[i]); } while(q--){ ve.clear(); int p,b;p=reads(),b=reads(); auto it=st.find(a[p]);st.erase(it); a[p]=b;st.insert(a[p]); it=st.end();--it; if(st.size()<=50){ for(auto p:st) ve.push_back(p); reverse(ve.begin(),ve.end()); } else for(int i=1;i<=50&&it!=st.begin();it--,i++) ve.push_back(*it); int ans=0; for(int i=2;i<ve.size();i++) ans=max(ans,calc(ve[i],ve[i-1],ve[i-2])); printf("%lld\n",ans); } } return 0; } /* 4 5 2 3 4 5 1 1 2 1 3 1 3 5 2 2 */```
- 1
信息
- ID
- 520
- 时间
- 2000ms
- 内存
- 512MiB
- 难度
- 8
- 标签
- (无)
- 递交数
- 46
- 已通过
- 9
- 上传者