社区讨论

为什么别人的代码只要650ms-,而我却要1.9s-?

P1972[SDOI2009] HH 的项链参与者 11已保存回复 28

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
28 条
当前快照
1 份
快照标识符
@m0arfbaj
此快照首次捕获于
2024/08/26 16:52
2 年前
此快照最后确认于
2025/11/05 00:32
4 个月前
查看原帖
rt,求优化\Huge\text{求优化}
我家的莫队:
CPP
//# pragma GCC optimize("Ofast,no-stack-protector")
//
//# pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")

# include <bits/stdc++.h>

# define I return

# define AK 0

# define IOI ;

using namespace std;

typedef long long ll;

typedef pair <int, int> pii;

int n, m, len, pie[1000005], a[1000005], ans[1000005], sum, col[1000005], lst[1000005], nxt[1000005];

struct node {

	int l, r, id;

	bool operator < (const node& a) const {

		return pie[l] != pie[a.l] ? pie[l] < pie[a.l] : pie[l] & 1 ? r > a.r : r < a.r;

	}

} q[1000005];

int read () {

	int x = 0;

	char c = getchar ();

	while (c < '0' || c > '9')
		c = getchar ();

	while (c >= '0' && c <= '9')
		x *= 10, x += c ^ 48, c = getchar ();

	return x;

}

void print (const int x) {

	if (! x)
		return ;

	print (x / 10);

	putchar ('0' + x % 10);

	return ;

}

int main () {

//	ios::sync_with_stdio (0);
//
//	cin.tie (0);
//
//	cout.tie (0);

	n = read ();

	for (int i = 1; i <= n; ++ i) {

		a[i] = read ();

		lst[i] = col[a[i]], col[a[i]] = i;

	}

	memset (col, 0x3f, sizeof col);

	for (int i = n; i; -- i)
		nxt[i] = col[a[i]], col[a[i]] = i;

	m = read ();

	len = n/sqrt (m);

	for (int i = 1; i <= n; ++ i)
		pie[i] = i / len;

	for (int i = 0; i < m; ++ i)
		q[i].l = read (), q[i].r = read (), q[i].id = i;

	sort (q, q + m);

	for (int i = 0, l = 1, r = 0; i < m; ++ i) {

		while (l > q[i].l)
			if (nxt[-- l] > r)
				++ sum;

		while (l < q[i].l)
			if (nxt[l ++] > r)
				-- sum;

		while (r < q[i].r)
			if (lst[++ r] < l)
				++ sum;

		while (r > q[i].r)
			if (lst[r --] < l)
				-- sum;

		ans[q[i].id] = sum;

	}

	for (int i = 0; i < m; ++ i)
		print (ans[i]), putchar ('\n');

	I AK IOI

}
别人的莫队:
CPP
#include<bits/stdc++.h>
//#pragma GCC optimize(2)
using namespace std;
const int N=1e6+10;
struct problem{
	int l,r,id;
}q[N];
int a[N],k[N],ans[N],cnt[N],pre[N],suf[N],flag[N];
int n,m,l=1,r=0,now,t,sum; 
char *p1,*p2,buf[100000];
#define nc() (p1==p2 && (p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
int read(){
    int x=0,f=1;
    char ch=nc();
    while(ch<48||ch>57){
        if(ch=='-')
            f=-1;
        ch=nc();
    }
    while(ch>=48&&ch<=57) x=x*10+ch-48,ch=nc();
	return x*f;
}
void write(int x){
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10+'0');
    return;
}
int cmp1(problem a,problem b){
	if(k[a.l]!=k[b.l]) return a.l<b.l;
	if(k[a.l]%2==0) return a.r>b.r;	
	return a.r<b.r;	
}
int cmp2(problem a,problem b){
	return a.id<b.id;
}
int main(){
	n=read();
	t=sqrt(n);
//	sum=ceil(double(n/t));
	for(int i=1;i<=n;i++) k[i]=(i-1)/t+1;
	for(int i=1;i<=n;i++) a[i]=read();
	m=read();
	for(int i=1;i<=m;i++){
		q[i].l=read(),q[i].r=read();
		q[i].id=i;
	}
	sort(q+1,q+m+1,cmp1);
	for(int i=1;i<=n;i++) pre[i]=flag[a[i]],flag[a[i]]=i;
	memset(flag,0x3f, sizeof(flag));
	for(int i=n;i>=1;i--) suf[i]=flag[a[i]],flag[a[i]]=i;
	for(int i=1;i<=m;i++){
		while(l>q[i].l) now+=(suf[--l]>r);
		while(l<q[i].l) now-=(suf[l++]>r);
		while(r>q[i].r) now-=(pre[r--]<l);
		while(r<q[i].r) now+=(pre[++r]<l);
		ans[q[i].id]=now;
	}
	for(int i=1;i<=m;i++) 		 				write(ans[i]),putchar('\n');
//	sort(q+1,q+m+1,cmp2);
	return 0;
}

回复

28 条回复,欢迎继续交流。

正在加载回复...