QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#44465 | #4583. Concerto de Pandemic | eyiigjkn | WA | 0ms | 3796kb | C++14 | 2.9kb | 2022-08-17 18:20:09 | 2022-08-17 18:20:11 |
Judging History
answer
# include <bits/stdc++.h>
# define cur_time() chrono::steady_clock::now()
# define clock() chrono::duration<double>(cur_time()-BEGIN).count()
using namespace std;
typedef long long ll;
const int INF=1e6;
int n,m,K,lim,a[200010],b[200010],d[200010],nxt[20][200010],len[20][200010],cnt[200010],cnt1[200010];
ll sum[200010];
pair<int,int> upd[400010];
int add(int x,int y){return (x+=y)<INF?x:INF;}
int goleft(int x,int k){return (x-=k)>0?x:x+m;}
int goright(int x,int k){return (x+=k)<=m?x:x-m;}
ll calc(int l,int r){return l<=r?sum[r]-sum[l-1]+r-l:sum[n]-sum[l-1]+sum[r]+n-l+r;}
int dis(int x,int y){return x<y?y-x:m-x+y;}
void update(int x,int y){for(int i=x;i<=m;i+=i&-i) cnt[i]+=y;}
int query(int x)
{
int ans=cnt1[x];
for(int i=x;i;i-=i&-i) ans+=cnt[i];
return ans;
}
int getle(int l,int r)
{
if(l>r) return 0;
int cur=-query(--l),t=0,s;
for(int i=__lg(r);i>=0;i--)
if(t+(1<<i)<=r && cur+(s=cnt[t+(1<<i)]+cnt1[t+(1<<i)]-cnt1[t])<=0)
cur+=s,t+=1<<i;
return (++t)<=r?t:0;
}
bool judge(ll x)
{
int tot=0;
for(int i=1;i<=K;i++)
{
int t=b[d[i]],l=0,r=m-1,mid,L,R;
while(l<r)
{
mid=(l+r+1)/2;
if(calc(a[goleft(t,mid)],d[i])<=x) l=mid;
else r=mid-1;
}
L=goleft(t,l);l=0;r=m-1;
while(l<r)
{
mid=(l+r+1)/2;
if(calc(d[i],a[goright(t,mid)])<=x) l=mid;
else r=mid-1;
}
R=goright(t,l);
if(L<=R)
{
if(t<L || t>R) continue;
cnt1[R]++;
upd[++tot]={R+1,R};
upd[++tot]={L,-R};
}
else
{
if(t>R && t<L) continue;
upd[++tot]={R+1,R};
upd[++tot]={L,-R};
}
}
for(int i=1;i<=m;i++) cnt1[i]+=cnt1[i-1];
sort(upd+1,upd+tot+1);
for(int i=1,j=1;i<=m;i++)
{
for(;j<=tot && upd[j].first<=i;j++)
{
int x=upd[j].second;
if(x>0) update(x,1);
else update(-x,-1);
}
nxt[0][i]=getle(i+1,m);
if(!nxt[0][i]) nxt[0][i]=getle(1,i-1);
}
for(int i=1;i<=m+1;i++) cnt[i]=cnt1[i]=0;
for(int i=1;i<=m;i++)
if(!nxt[0][i]) return 1;
else len[0][i]=dis(i,nxt[0][i]);
int mx=1;
for(;;mx++)
{
bool flag=0;
int *_nxt=nxt[mx],*__nxt=nxt[mx-1],*_len=len[mx],*__len=len[mx-1];
for(int i=1;i<=m;i++)
{
_nxt[i]=__nxt[__nxt[i]];
_len[i]=add(__len[i],__len[__nxt[i]]);
flag|=(_len[i]<m);
}
if(!flag || mx==17) break;
}
for(int i=1;i<=m;i++)
{
int u=i,cur=0,cnt=1;
for(int j=mx;j>=0 && cnt<=lim;j--)
if(cur+len[j][u]<m)
{
cur+=len[j][u];
cnt+=1<<j;
u=nxt[j][u];
}
if(cnt<=lim) return 1;
}
return 0;
}
int main()
{
int x,y;
auto BEGIN=cur_time();
cin>>n>>m>>K>>lim;
ll l=1,r=n,mid;
for(int i=1;i<=m;i++) scanf("%d%d",&x,&y),r+=(sum[x]=y);
m=0;
for(int i=1;i<=n;i++)
if(!sum[i])
a[b[i]=++m]=i;
for(int i=1;i<=n;i++) sum[i]+=sum[i-1];
for(int i=1;i<=K;i++) scanf("%d",&d[i]);
while(l<r)
{
mid=(l+r)/2;
if(judge(mid)) r=mid;
else l=mid+1;
if(clock()>1.5) break;
}
if(l==r) cout<<l<<endl;
else cout<<l<<" , "<<r<<endl;
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3796kb
input:
10 4 3 2 1 2 4 4 6 2 7 5 2 5 8
output:
4
result:
ok single line: '4'
Test #2:
score: -100
Wrong Answer
time: 0ms
memory: 3704kb
input:
8 1 3 5 1 5 4 2 7
output:
1
result:
wrong answer 1st lines differ - expected: '0', found: '1'