RT 听说三分可以直接日掉95pts 我内心:这我退火不是随便过?
写完之后:50 tle
有无神仙看看怎么优化优化退火过程或者帮忙调调参啥的/kel
#include<bits/stdc++.h>
using namespace std;
int n,m1,m2,ansx,nowans;
pair<int,int>a[2][100005];
double eps=1e-18;
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>s;
inline int f(int x){//稳定的O((m1+m2)log(m1+m2))的统计答案
if(x<0||x>n)return 0;
int ans=0;
for(int i=1;i<=m1;i++){
while(s.size()&&s.top().first<a[0][i].first)s.pop();
if(s.size()<x)s.push(make_pair(a[0][i].second,i)),ans++;
}
while(!s.empty())s.pop();
for(int i=1;i<=m2;i++){
while(s.size()&&s.top().first<a[1][i].first)s.pop();
if(s.size()<n-x)s.push(make_pair(a[1][i].second,i)),ans++;
}
while(!s.empty())s.pop();
return ans;
}
inline void mnth(){//退火过程
double T=200;
while(T>eps){
int nx=(ansx+(int)((rand()*2-RAND_MAX)*T))%n;
int qxe=f(ansx)-f(nx);
T*=0.88;
if(qxe<0){ansx=nx;continue;}
if(exp(-qxe/T)*RAND_MAX>rand())ansx=nx;
}
cout<<max(max(f(ansx),f(0)),f(n));
}
int main(){
ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
cin>>n>>m1>>m2;
for(int i=1;i<=m1;i++)cin>>a[0][i].first>>a[0][i].second;
for(int i=1;i<=m2;i++)cin>>a[1][i].first>>a[1][i].second;
sort(a[0]+1,a[0]+m1+1);
sort(a[1]+1,a[1]+m2+1);
mnth();
// cout<<f(1);
return 0;
}
我自己进行的调参尝试包括0.88->0.7,对T在不同范围内按不同参数退火等,总之就是或者T或者WA
球球了,救救退火都写不对的孩子吧/kel