复杂度假了吗?
查看原帖
复杂度假了吗?
479952
hexiang_xiaoyang楼主2022/9/10 21:34

n*sqrt(n)过不了100000?

#include <bits/stdc++.h> 
#define int unsigned int
using namespace std; 
inline int read() {
	int s = 0, f = 1; char ch = getchar(); 
	for(; ch >  '9' || ch <  '0'; ch = getchar()) if(ch == '-') f = -1; 
	for(; ch <= '9' && ch >= '0'; s = s * 10 + (ch ^ 48), ch = getchar()); 
	return (f == 1) ? s : -s;   
} 
inline void write(long long n) {
	if(n > 9) write(n / 10); 
	putchar(n % 10 | 48); 
	return ; 
}
const int maxn = 1e5 + 114; 
const int maxq = 1e5 + 514; 
struct node{
	int data, rank; 
}x[maxn];
int n, m, len; 
int a[maxn], fa[maxn]; 
int b(int i) {
	return (i - 1) / len + 1; 
}
bool cmp1(node aa, node bb) {
	return aa.data < bb.data; 
}
void init() {
	n = read(); m = read(); len = sqrt(n); 
	for(register int i = 1; i <= n; ++i) {
		x[i].data = read(); 
		x[i].rank = i; 
	}
	sort(x + 1, x + n + 1, cmp1); 
	return ; 
}
int tot; 
void LSH() {
	int lst = -114514; 
	for(register int i = 1; i <= n + 1; ++i) {
		if(x[i].data != lst) {
			fa[tot] = lst; 
			tot++;
		} 
		a[x[i].rank] = tot; 
		lst = x[i].data; 
	}
	return ; 
}
struct Q{
	int l, r, id;
}qsn[maxq]; 
bool cmp2(Q aa, Q bb) {
	return (b(aa.l) == b(bb.l)) ? aa.r < bb.r : b(aa.l) < b(bb.l); 
}
void in_q_sort_q() {
	for(register int i = 1; i <= m; ++i) {
		qsn[i].l = read(), qsn[i].r = read(); 
		qsn[i].id = i; 
	} 
	sort(qsn + 1, qsn + m + 1, cmp2); 
	return ; 
}
int cnt[maxn]; 
long long ans[maxn]; 
void work() {
	int blk = 0, l = 0, r = 0;
	long long now = 0;
	for(register int i = 1; i <= m; ++i) {
		int L = qsn[i].l, R = qsn[i].r; 
		if(b(L) == b(R)) {
			now = 0; 
			for(register int k = 1; k <= tot; ++k) cnt[k] = 0; 
			for(register int j = L; j <= R; ++j) {
				cnt[a[j]]++; 
				if(cnt[a[j]])
				now = max(now, 1ll * fa[a[j]] * cnt[a[j]]); 
			}
			for(register int j = L; j <= R; ++j) {
				memset(cnt, 0, sizeof(cnt)); 
			}
			ans[qsn[i].id] = now; 
			continue; 
		}
		int p1 = b(L); 
		if(blk != p1) {
			now = 0; 
			for(register int k = 1; k <= tot; ++k) cnt[k] = 0; 
			l = p1 * len; r = l - 1; 
			blk = p1; 
		}
		while(r < R) {
			r++; 
			cnt[a[r]]++; 
			if(cnt[a[r]])
			now = max(now, 1ll * cnt[a[r]] * fa[a[r]]); 
		}
		int p = l; 
		long long now1 = 0; 
		while(p > L) {
			p--; 
			cnt[a[p]]++; 
			if(cnt[a[p]])
			now1 = max(now1, 1ll * fa[a[p]] * cnt[a[p]]); 
		}
		while(p < l) { 
			cnt[a[p]]--; 
			p++; 
		}
		ans[qsn[i].id] = max(now, now1); 
	} 
	return ; 
}
void print() {
	for(register int i = 1; i <= m; ++i) {
		write(ans[i]), putchar('\n'); 
	}
	return ; 
}
signed main() {
	init(); 
	LSH(); 
	in_q_sort_q(); 
	work(); 
	print(); 
	return 0; 
}

到底是算法的问题还是常数的问题呢?

2022/9/10 21:34
加载中...