QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#287027 | #7967. 二进制 | lrher | ML | 12ms | 67304kb | C++14 | 4.2kb | 2023-12-19 12:15:06 | 2023-12-19 12:15:07 |
Judging History
answer
#include<set>
#include<map>
#include<cmath>
#include<ctime>
#include<stack>
#include<queue>
#include<deque>
#include<string>
#include<bitset>
#include<vector>
#include<cstdio>
#include<random>
#include<complex>
#include<cstdlib>
#include<climits>
#include<iomanip>
#include<cstring>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
#include<unordered_map>
using namespace std;
// #define getchar()(p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
// char buf[1<<21],*p1=buf,*p2=buf;
const long long _base=107374183;
int writetemp[30];
inline int read()
{
char c=getchar();int x=0;bool f=0;
for(;!isdigit(c);c=getchar())f^=!(c^45);
for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+(c^48);
if(f)x=-x;
return x;
}
inline void write(int x)
{
int t;
int tot=(x==0);
writetemp[1]=0;
while(x) t=x/10,writetemp[++tot]=x-(t<<1)-(t<<3),x=t;
for(int i=tot;i>=1;i--) putchar(writetemp[i]+'0');
putchar('\n');
return ;
}
const int sq=100001;
int n;
int nowl,nowr;
bool qvis[1000010];
char s[1000010];
int temp[1000010];
struct list
{
int l,r;
}l[1000010];
int sz[1000010];
unordered_map<int,bool> vis[1000010];
priority_queue<int,vector<int>,greater<int> > q[100010];
struct BIT
{
int c[1000010];
void change(int x,int val)
{
while(x<=n) c[x]+=val,x+=x&(-x);
return ;
}
int query(int x)
{
int ans=0;
while(x) ans+=c[x],x-=x&(-x);
return ans;
}
}T;
void del(int x)
{
if(l[x].l) l[l[x].l].r=l[x].r;
if(l[x].r<=n) l[l[x].r].l=l[x].l;
for(auto now:vis[x]) if(now.second==1&&nowl<=now.first&&now.first<=nowr) sz[now.first%sq]--;
vis[x].clear();
T.change(x,-1);
return ;
}
void listdel(int x,int val)
{
int len=__lg(val)+1;
while(len--) del(x),x=l[x].r;
return ;
}
void clear(int x)
{
x=l[x].l;
int len=20;
while(len--) if(x)
{
for(auto now:vis[x]) if(now.second==1&&nowl<=now.first&&now.first<=nowr) sz[now.first%sq]--;
vis[x].clear(),x=l[x].l;
}
return ;
}
void add(int x)
{
x=l[x].l;
int len=20;
while(len--) if(x)
{
int nowpos=x,now=0;
if(s[nowpos]=='1')
{
while(nowpos<=n)
{
now=(now<<1)+(s[nowpos]-'0');
if(now>nowr) break;
if(nowl<=now&&!qvis[now])
{
q[now%sq].push(x);
vis[x][now]=1;
sz[now%sq]++;
}
nowpos=l[nowpos].r;
}
}
x=l[x].l;
}
return ;
}
void init()
{
int pos=0;
for(int i=1;i<=n;i++) sz[i]=0;
for(int i=1;i<=sq;i++) while(!q[i].empty()) q[i].pop();
for(int i=1;i<=n;i++) if(T.query(i)!=T.query(i-1))
{
pos=i;
break;
}
for(int i=pos;i<=n;i=l[i].r)
{
int now=0;
vis[i].clear();
if(s[i]=='0') continue;
for(int j=i;j<=n;j=l[j].r)
{
now=(now<<1)+(s[j]-'0');
if(now>nowr) break;
if(nowl<=now)
{
// if(i==11) printf("initnow:%d\n",now);
q[now%sq].push(i);
vis[i][now]=1;
sz[now%sq]++;
}
}
}
// printf("%d %d\n",nowl,nowr);
// for(int i=pos;i<=n;i=l[i].r) printf("%c",s[i]);
// printf("\n");
return ;
}
int main()
{
// freopen("s.out","r",stdin);
// freopen("a.out","w",stdout);
scanf("%d",&n);
scanf("%s",s+1);
for(int i=1;i<=n;i++) l[i].l=i-1,l[i].r=i+1;
for(int i=1;i<=n;i++) T.change(i,1);
nowr=-1;
while(nowl<=n)
{
nowl=nowr+1,nowr=nowl+sq-1;
init();
for(int i=max(1,nowl);i<=min(nowr,n);i++)
{
while(!q[i%sq].empty()&&vis[q[i%sq].top()][i]==0) q[i%sq].pop();
if(q[i%sq].empty()) printf("-1 0\n");
else
{
int pos=q[i%sq].top();
printf("%d %d\n",T.query(pos),sz[i%sq]);
qvis[i]=1;
clear(pos),listdel(pos,i),add(pos);
}
}
}
return 0;
}
/*
*/
详细
Test #1:
score: 100
Accepted
time: 12ms
memory: 67304kb
input:
20 01001101101101110010
output:
2 11 5 5 4 5 11 1 4 2 7 1 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0
result:
ok 20 lines
Test #2:
score: -100
Memory Limit Exceeded
input:
1000000 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111...
output:
1 1000000 -1 0 1 999998 -1 0 -1 0 -1 0 1 999995 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 1 999991 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 1 999986 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0...