代码求调
  • 板块学术版
  • 楼主popossible
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/9/9 16:29
  • 上次更新2024/9/9 16:34:37
查看原帖
代码求调
579857
popossible楼主2024/9/9 16:29
#include<bits/stdc++.h>
using namespace std;

#define int ll
typedef long long ll;

#define mk make_pair
#define fi first
#define se second
typedef pair<int,int> pii;
typedef pair<double,double> pdd;

#define ReadIn(s) freopen(s,"r",stdin)
#define OutPut(s) freopen(s,"w",stdout)

namespace fastio{
	#define FILE_SIZE 1<<21
	char rbuf[FILE_SIZE],*p1=rbuf,*p2=rbuf,wbuf[FILE_SIZE],*p3=wbuf;
	inline char getc(){return p1==p2&&(p2=(p1=rbuf)+fread(rbuf,1,FILE_SIZE,stdin),p1==p2)?-1:*p1++;}
	inline void putc(char x){(*p3++=x);}
	template<typename T> void read(T &x){
		x=0;char c=getchar();T neg=0;
		while(!isdigit(c)) neg|=!(c^'-'),c=getchar();
		while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar();
		if(neg) x=(~x)+1;
	}
	template<typename T> void recursive_print(T x){if(!x) return;recursive_print(x/10);putc(x%10^48);}
	template<typename T> void print(T x){if(!x) putc('0');if(x<0) putc('-'),x=~x+1;recursive_print(x);}
	void print_final(){fwrite(wbuf,1,p3-wbuf,stdout);}
}using namespace fastio;

const int N=1e4+10;
const int M=1e5+10;
const int m998=998244353;
const int m107=1e9+7;
const int inf=0x3f3f3f3f3f3f3f3f;
const int eps=0;

template <typename T>
inline int comp (const T &x,const T &y) {
	if(x-y>eps) return 1;
	if(y-x>eps) return -1;
	return 0;
}

template <typename T>
struct line {
	T k,b;
	line () :k(0),b(0) {;}
	line (T _k,T _b) :k(_k),b(_b) {;}
	T operator () (const T &x) {
		return k*x+b;
	}
};

template <typename T>
inline line<T> Max(const line<T> &a,const line<T> &b,const T &x) {
	return a(x)>b(x)?a:b;
}

template <typename T>
struct Node {
	int ls,rs;
	line<T> seg;
	Node () :ls(0),rs(0),seg(line<T>()) {;}
	Node (int _ls,int _rs,line<T> s) : ls(_ls),rs(_rs),seg(s) {;}
};

int g[M],V;
int tot;
int rt[N];
inline int New() {return ++tot;}

template <typename T>
#define ls(x) tr[x].ls
#define rs(x) tr[x].rs
#define seg(x) tr[x].seg
#define mid ((l+r)>>1)
struct Seg_Tree {
	Node <T> tr[M*10];
	void pushdown (int &x,int l,int r,line<T> s) {
		if(!x) return tr[x=New()]=Node<T>(0,0,s),void();
		if(comp(seg(x)(g[mid]),s(g[mid]))==-1) swap(seg(x),s);
		if(comp(seg(x)(g[l]),s(g[l]))==-1) pushdown(ls(x),l,mid,s);
		if(comp(seg(x)(g[r]),s(g[r]))==-1) pushdown(rs(x),mid+1,r,s);
	}
	void update(int &x,int l,int r,int L,int R,line<T> s) {
		if(l>R||r<L) return ;
		if(L<=l&&r<=R) return pushdown(x,l,r,L,R,s);
		if(!x) x=New();
		update(ls(x),l,mid,L,R,s);
		update(rs(x),mid+1,r,L,R,s);
	}
	T query(int x,int l,int r,int aim) {
		if(!x) return 0;
		if(l==r) return seg(x)(g[aim]);
		if(mid>=aim) return max(query(ls(x),l,mid,aim),seg(x)(g[aim]));
		return max(query(rs(x),mid+1,r,aim),seg(x)(g[aim]));
	}
};
Seg_Tree<int> T[N];

int n;
int s[M],dp[M];
int cnt[M],la[M];

signed main() {
	
	read(n);
	for(int i=1;i<=n;i++) {
		read(s[i]);
		cnt[i]=cnt[la[s[i]]]+1;
		la[s[i]]=i;
		g[++V]=s[i]*(cnt[i]+1);
	}
	sort(g+1,g+V+1);
	V=unique(g+1,g+V+1)-g-1;
	
	for(int i=1;i<=n;i++) {
		T[s[i]].pushdown(rt[s[i]],1,V,line<int>(-2*cnt[i-1],dp[i-1]+cnt[i-1]*cnt[i-1]));
		int t=lower_bound(g+1,g+V+1,s[i]*(cnt[i]+1))-g;
		dp[i]=T[s[i]].query(rt[s[i]],1,V,t)+s[i]*(cnt[i]+1)*(cnt[i]+1);
	}
	cout<<dp[n];
	
	return 0;
}

编译器为 tmd-gcc 4.9.2

2024/9/9 16:29
加载中...