求助RE
  • 板块学术版
  • 楼主MadokaKaname
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/12/17 16:18
  • 上次更新2023/12/17 18:25:18
查看原帖
求助RE
361356
MadokaKaname楼主2023/12/17 16:18

rt,H,输出完就RE了,不知道为什么,痛失AC/fn/fn/fn

#include <bits/stdc++.h>
using namespace std;
int num[2000005];
int val[2000005];
int ans[2000005],id[2000005];
int nowid[2000005];
int tree[2000005];
int numid[2000005];
int tmp1[2000005];
bool flag[2000005];
bool del[2000005];
bool tag[2000005];
string s,s1,s2;
int n,i,j,k,m;
queue<int> q1,q2;
deque<int> q;
int lowbit(int x){
	return x & -x;
}
int query(int x){
	int sum=0;
	while(x){
		sum+=tree[x];
		x-=lowbit(x);
	}
	return sum;
}
void insert(int x){
	while(x<=n){
		tree[x]++;
		x+=lowbit(x); 
	}
}
int main() {
    cin>>n; 
    cin>>s;
    s=" "+s; 
    memset(tag,false,sizeof(tag));
    for(i=n+1;i<=1000000;i++)
      tag[i]=true;
    tag[0]=true;
    for(i=0;1<<(i)<=n;i++){
    	while(!q1.empty()) q1.pop();
    	while(!q2.empty()) q2.pop();
    	memset(tree,0,sizeof(tree));
    	memset(tmp1,0,sizeof(tmp1));
    	if(i>0){
    		for(j=(1<<(i-1))+1;j<(1<<i);j++)
    		  tag[j]=true;
		}
    	int len=s.length()-1;
		/*for(j=0;j<=len;j++)
		  printf("%c",s[j]); 
		printf("\n");*/
    	int cnt=0;
    	val[len+1]=0;
    	for(j=len;j>=1;j--)
		  val[j]=(val[j+1]>>1)|((s[j]-'0')<<i);
		/*printf("%d ",len);
		for(j=1;j<=len;j++)
		  printf("%d ",val[j]);
		printf("\n");*/ 
		int now=1;
		int minx=0x7fffffff;
		s1=" ";
		for(j=1;j<=i;j++){
			if(tag[val[j]]==false){
				if(!q.empty() && val[q.back()]>val[j]) q.pop_back();
			    q.push_back(j);
			}
			s1[++cnt]=s[j];
			numid[cnt]=j;
		}
		int nowtag=i+1;
		while(nowtag<=len){
			while(!q1.empty() && q1.front()<=nowtag){
				q1.pop();
				insert(q2.front());
				q2.pop();
			}
		    if(tag[val[nowtag]]==false){
				while(!q.empty() && val[q.back()]>val[nowtag]) q.pop_back();
				q.push_back(nowtag);
			}
			s1[++cnt]=s[nowtag]; 
			numid[cnt]=nowtag;
			while(!q.empty() && q.front()==numid[now]) q.pop_front();
			nowtag++;
			//printf("%d %d %d ",now,val[numid[now]],nowtag);
			//if(!q.empty()) printf("%d %d %d\n",nowtag,val[numid[now]],val[q.front()]);
			if(s1[now]=='0'){
				now++;
				continue;
			}
			if(q.empty() || val[q.front()]>=val[numid[now]]) ans[val[numid[now]]]++;
			if(tag[val[numid[now]]]==false){
				if(q.empty() || val[q.front()]>=val[numid[now]]){
					//printf("%d %d %d ",val[numid[now]],cnt,nowtag);
					tag[val[numid[now]]]=true;
					id[val[numid[now]]]=nowtag-i-query(val[numid[now]])*(i+1)-1;
					while(!q.empty()){
						if(val[q.front()]==val[numid[now]]) ans[val[numid[now]]]++;
						q.pop_front();
					}
					q1.push(numid[now]);q2.push(val[numid[now]]);
					for(j=1;j<=i;j++)
					  del[nowid[numid[j]]]=true;
					cnt=max(cnt-i-1,0);
					//printf("%d ",now);
					val[numid[cnt]]=(val[nowtag]>>1)|((s[numid[cnt]]-'0')<<i);
					//printf("fuckccf");
					for(j=cnt-1;j>=max(1,cnt-i);j--)
					  val[numid[j]]=(val[numid[j+1]]>>1)|((s[numid[j]]-'0')<<i);
					
					for(j=now-i+1;j<now;j++){
						if(tag[val[numid[j]]]==false){
							while(!q.empty() && val[q.back()]>val[numid[j]]) q.pop_back();
							q.push_back(numid[j]);
						}
					}
					now=max(now-i,0);
				}
				else now++;
			} 
			else now++;
		}
		//printf("%d ",cnt);
		s="";
		for(j=0;j<=cnt;j++)
		  s+=s1[j];
		//for(j=0;j<=cnt;j++)
		  //printf("%d ",s1[j]); 
		//printf("\n");
	}
	//cout<<id[20]<<"\n";
	for(i=1;i<=n;i++){
		if(id[i]==0) printf("0 -1\n");
		else printf("%d %d\n",id[i],ans[i]);
		//printf("%d ",i);
	}
	return 0;
}

2023/12/17 16:18
加载中...