1 条题解

  • 0
    @ 2025-10-27 22:19:05

    这道题也是一个很神奇的题目,具体证明我不会证,说一下做法:

    使用set维护出来前 5050 大的边长,然后暴力求相邻三个边长的面积的最大值,具体证明看看别人的题解

    笑点解析:我场上想了一个假贪心,但是最大值并没有找到一个就退出,所以就过了

    有一个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
    上传者