数组开小,100变35,警示后人
  • 板块灌水区
  • 楼主小木虫
  • 当前回复7
  • 已保存回复7
  • 发布时间2022/3/26 15:11
  • 上次更新2023/10/28 05:34:31
查看原帖
数组开小,100变35,警示后人
213173
小木虫楼主2022/3/26 15:11

rt,考试时候T1没注意顺手开了2e52e5空间,结果100活生生变35了
改前
改后
附代码:

#include <bits/stdc++.h>
using namespace std;
const int N=5e5+10;
int n,q;
int a[N];int b[N];int l,r;
int p[N];int bucket[N];int t[N];
struct qry{int l,id;};
vector <qry> Q[N];vector <int> w[N];
bool vis[N];int Stack[N];int Top;
int tree[2000010];
int lowbit(int k){return k & -k;}
void add(int x,int k){while(x<=n+1){tree[x]+=k;x+=lowbit(x);}}
int sum(int x){
    int ans=0;
    while(x!=0){ans+=tree[x];x-=lowbit(x);}
    return ans;
}
int res[N];
int main(){
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	for(int i=1;i<=n;i++)scanf("%d",&b[i]);
	for(int i=1;i<=q;i++){
		scanf("%d%d",&l,&r);
		Q[r].push_back((qry){l,i});
		w[l-1].push_back(i);
	}
	Top=0;Stack[0]=1;
	for(int i=1;i<=n;i++){
		while(Top!=0&&((a[i]==a[Stack[Top]-1])||(b[i]>=b[Stack[Top]-1])))Top--;
		add(Stack[Top],1);Stack[++Top]=i+1;
		for(int j=0;j<w[i].size();j++)res[w[i][j]]-=sum(i);
		for(int j=0;j<Q[i].size();j++)res[Q[i][j].id]+=sum(Q[i][j].l);
	}
	for(int i=1;i<=q;i++)printf("%d\n",res[i]);
	return 0;
}

各位一定不要想当然地开空间啊!!!血的教训。。

2022/3/26 15:11
加载中...