社区讨论

洛谷AC学校OJ TLE求助

P4396[AHOI2013] 作业参与者 2已保存回复 1

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@lyzyj3zf
此快照首次捕获于
2024/07/24 22:46
2 年前
此快照最后确认于
2024/07/25 09:00
2 年前
查看原帖
下面这份代码在洛谷上AC了,但是在学校OJ上 MM 取到了 10610^6,然后就T了,调不出来。。。
CPP
#include<bits/stdc++.h>
#define int long long
#define fi first
#define se second
using namespace std;
const int N=4e6+10,M=1e6,K=1e7+10;
int n,m,a[N],pre[N],lst[N],tot;
pair<int,int> ans[N];
int read(){char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return x*f;}
struct bitT{
	int t[N];
    void add(int x,int k){while(x<=M)t[x]+=k,x+=x&-x;}
	int sum(int x){int res=0;while(x)res+=t[x],x-=x&-x;return res;}
	int sum(int l,int r){return sum(r)-sum(l-1);}
}bitT;
struct ques{
	int k,a,b,x,p;
	bool operator<(ques b){return k<b.k;}
}q[N>>1];
struct segT{
    int rt[K],t[K],ls[K],rs[K],tot;
    void pushup(int p){t[p]=t[ls[p]]+t[rs[p]];}
    void update(int &p,int l,int r,int x,int v){
        if (!p) p=++tot;
        if (l==r){t[p]+=v;return;}
        int mid=l+r>>1;
        if (x<=mid)
            update(ls[p],l,mid,x,v);
        else
            update(rs[p],mid+1,r,x,v);
        pushup(p);
    }
    int query(int p,int l,int r,int ql,int qr){
        if (!p) return 0;
        if (ql<=l&&r<=qr) return t[p];
        int mid=l+r>>1;
        if (qr<=mid)
            return query(ls[p],l,mid,ql,qr);
        if (ql>mid)
            return query(rs[p],mid+1,r,ql,qr);
        return query(ls[p],l,mid,ql,qr)+query(rs[p],mid+1,r,ql,qr);
    }
}segT;
struct outT{
    void add(int x,int v){
        x++;
        while (x<=M)
            segT.update(segT.rt[x],0,M,v,1),
            x+=x&-x;
    }
    int sum(int x,int a,int b){
        x++;
        int res=0;
        while (x)
            res+=segT.query(segT.rt[x],0,M,a,b),
            x-=x&-x;
        return res;
    }
}outT;
signed main(){
    n=read();m=read();
	for (int i=1;i<=n;i++){
		a[i]=read();
		pre[i]=lst[a[i]];
        lst[a[i]]=i;
	}
	for (int i=1;i<=m;i++){
		int l=read(),r=read(),a=read(),b=read();
		q[++tot]={l-1,a,b,-i,l-1};
		q[++tot]={r,a,b,i,l-1};
	}
	sort(q+1,q+tot+1);
	int x=0;
	for (int i=1;i<=tot;i++){
		while (x<q[i].k)
            x++,
			bitT.add(a[x],1),
            outT.add(pre[x],a[x]);
        int t=abs(q[i].x),w=q[i].x/t;
		ans[t].fi+=w*bitT.sum(q[i].a,q[i].b);
		ans[t].se+=w*outT.sum(q[i].p,q[i].a,q[i].b);
	}
	for (int i=1;i<=m;i++)
        cout<<ans[i].fi<<' '<<ans[i].se<<'\n';
	return 0;
}
注:学校OJ上时限是3000ms,我最慢一个点是3061ms。。。

回复

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

正在加载回复...