社区讨论
为什么别人的代码只要650ms-,而我却要1.9s-?
P1972[SDOI2009] HH 的项链参与者 11已保存回复 28
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 28 条
- 当前快照
- 1 份
- 快照标识符
- @m0arfbaj
- 此快照首次捕获于
- 2024/08/26 16:52 2 年前
- 此快照最后确认于
- 2025/11/05 00:32 4 个月前
rt,
我家的莫队:
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 条回复,欢迎继续交流。
正在加载回复...