The 2025 ICPC China Zhejiang Province Programming Contest
題解:
https://files.cnblogs.com/files/clrs97/ZJCPC_2025.pdf
Code:
A. Outer LIS
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=100005,K=321;
int n,q,m,lim,i,j,k,l,r,a[N],b[N];
int mx,f[N],g[N],pre1[N],suf1[N],bit[N],pre2[K][N],suf2[K][N],tmp[N],ans[K][K];
int at[N],st[K],en[K],pool[N];
inline void up(int&a,int b){a<b?(a=b):0;}
inline void ins(int x,int p){for(;x<=n;x+=x&-x)up(bit[x],p);}
inline int ask(int x){int t=0;for(;x;x-=x&-x)up(t,bit[x]);return t;}
inline bool cmp(int x,int y){return a[x]<a[y];}
inline int query(int l,int r){
l--,r++;
if(l<1)return suf1[r];
if(r>n)return pre1[l];
int L=at[l],R=at[r];
int ret=max(ans[L-1][R+1],max(suf1[r],pre1[l]));
for(int i=st[L];i<=l;i++)up(ret,f[i]+suf2[R+1][a[i]]);
for(int i=en[R];i>=r;i--)up(ret,g[i]+pre2[L-1][a[i]]);
int tmp=0;
for(int i=st[R],ir=en[R],j=st[L],jr=en[L];i<=ir;i++){
int x=pool[i];
if(x<r)continue;
while(j<=jr){
int y=pool[j];
if(a[y]>a[x])break;
if(y<=l)up(tmp,f[y]);
j++;
}
up(ret,tmp+g[x]);
}
return ret;
}
int main(){
ios_base::sync_with_stdio(0);cin.tie(0);
cin>>n>>q;
for(i=1;i<=n;i++)cin>>a[i]>>b[i];
for(i=1;i<=n;i++){
f[i]=ask(a[i])+b[i];
ins(a[i],f[i]);
pre1[i]=max(pre1[i-1],f[i]);
}
for(i=1;i<=n;i++)bit[i]=0;
for(i=n;i;i--){
g[i]=ask(n-a[i]+1)+b[i];
ins(n-a[i]+1,g[i]);
suf1[i]=max(suf1[i+1],g[i]);
}
lim=sqrt(n);
for(i=1;i<=n;i++)at[i]=(i-1)/lim+1;
m=at[n];
for(i=1;i<=n;i++)en[at[i]]=i;
for(i=n;i;i--)st[at[i]]=i;
for(i=1;i<=m;i++){
for(j=st[i];j<=en[i];j++)up(tmp[a[j]],f[j]);
mx=0;
for(j=1;j<=n;j++){
up(mx,tmp[j]);
pre2[i][j]=mx;
}
}
for(i=1;i<=n;i++)tmp[i]=0;
for(i=m;i;i--){
for(j=st[i];j<=en[i];j++)up(tmp[a[j]],g[j]);
mx=0;
for(j=n;j;j--){
up(mx,tmp[j]);
suf2[i][j]=mx;
}
}
for(i=1;i<=n;i++)pool[i]=i;
for(i=1;i<=m;i++){
l=st[i],r=en[i];
sort(pool+l,pool+r+1,cmp);
for(j=i+2;j<=m;j++){
mx=ans[i-1][j];
for(k=l;k<=r;k++)up(mx,f[k]+suf2[j][a[k]]);
ans[i][j]=mx;
}
}
while(q--){
cin>>l>>r;
cout<<query(l,r)<<"\n";
}
}
B. Turn on the Light 3
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+1e3+7;
int T,n,m,vis[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>T;
while(T--)
{
cin>>n>>m;
fill(vis+1,vis+n+1,0);
for(int i=1;i<=m;i++)
{
int x;
cin>>x;
if(vis[x])
cout<<"the lights are already on!\n";
else
{
int cnt=0;
for(int j=x;j<=n;j+=x)
cnt+=1-vis[j],vis[j]=1;
cout<<cnt<<"\n";
}
}
}
}
C. RDDCCD
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
static int n,q;
cin>>n>>q;
auto rev=[&](int x)->int
{
int ans=0;
while(x>0)
{
ans=ans*10+x%10;
x/=10;
}
return ans;
};
vector<int> pd,good,contr;
vector<vector<int>> a(n+5,vector<int>(n+5)),ra(n+5,vector<int>(n+5));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>a[i][j];
ra[i][j]=rev(a[i][j]);
int x=a[i][j],rx=ra[i][j];
if(i==1 and j==1)
{
for(int k=2;k*k<=x;k++)
{
if(x%k==0)
{
int now=k;
while(x%now==0)
pd.push_back(now),now*=k;
now/=k;
x/=now;
}
}
if(x!=1)
pd.push_back(x);
for(int k=2;k*k<=rx;k++)
{
if(rx%k==0)
{
int now=k;
while(rx%now==0)
pd.push_back(now),now*=k;
now/=k;
rx/=now;
}
}
if(rx!=1)
pd.push_back(rx);
sort(pd.begin(),pd.end());
pd.erase(unique(pd.begin(),pd.end()),pd.end());
good.resize(pd.size());
}
else
{
for(int k=0;k<(int)pd.size();k++)
{
if(x%pd[k]==0 or rx%pd[k]==0)
{
good[k]++;
}
}
}
}
}
{
auto tmp=pd;pd.clear();
for(int i=0;i<(int)tmp.size();i++)
{
if(good[i]==n*n-1)
pd.push_back(tmp[i]);
}
contr.resize(pd.size());
for(int i=0;i<(int)pd.size();i++)
{
contr[i]=pd[i];
for(auto p:pd)
{
if(pd[i]!=p and pd[i]%p==0)
{
contr[i]=min(contr[i],pd[i]/p);
}
}
}
}
static int N=n*4;
struct DS
{
vector<int> pa,del,sz,cnt,cur;
int acnt,tot;
DS()
{
pa.resize(N+5);
del.resize(N+5);
sz.resize(N+5,1);
cnt.resize(N+5); // cnt of (cur==del)
cur.resize(N+5);
acnt=tot=0;
}
pair<int,int> find(int x)
{
if(pa[x]==0)
return {x,0};
auto [y,d]=find(pa[x]);
del[x]^=d;
pa[x]=y;
return {y,del[x]};
}
bool unite(int x,int y,int d)
{
auto [px,dx]=find(x);
auto [py,dy]=find(y);
if(px==py)
{
return (d^dx^dy)==0;
}
if(sz[px]<sz[py])
swap(px,py),swap(dx,dy);
del[py]=dx^dy^d;
sz[px]+=sz[py];
pa[py]=px;
return true;
}
bool addedge(int x,int y,int d)
{
int u=x+y,v=x-y+n*3;
return unite(u,v,d);
}
void prep()
{
for(int i=1;i<=N;i++)
{
auto [x,d]=find(i);
if(d==0)
{
cnt[x]++;
}
}
for(int i=1;i<=N;i++)
{
if(find(i).first==i)
{
tot++;
if(cnt[i]==sz[i] or cnt[i]==0)
acnt++;
}
}
}
void change(int ty,int k) // ty=0: +, ty=1: -
{
int u=ty?k+n*3:k;
auto [pu,d]=find(u);
if(cur[u]==d)
{
if(cnt[pu]==sz[pu])
{
acnt--;
}
cnt[pu]--;
if(cnt[pu]==0)
{
acnt++;
}
}
else
{
if(cnt[pu]==0)
{
acnt--;
}
cnt[pu]++;
if(cnt[pu]==sz[pu])
{
acnt++;
}
}
cur[u]^=1;
}
};
vector<DS> info(pd.size());
for(int t=0;t<(int)pd.size();t++)
{
int p=pd[t],flag=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i][j]%p==0 and ra[i][j]%p==0)
{
//do nothing
}
else if(a[i][j]%p==0)
{
flag&=info[t].addedge(i,j,0);
}
else
{
flag&=info[t].addedge(i,j,1);
}
}
}
info[t].prep();
if(flag==0)info[t].tot=-1;
}
while(q--)
{
char op;
int k,ans=1;
cin>>op>>k;
for(int t=0;t<(int)pd.size();t++)
{
if(op=='+')
info[t].change(0,k);
else
info[t].change(1,k);
if(info[t].acnt==info[t].tot)
ans*=contr[t];
}
cout<<ans<<"\n";
}
return 0;
}
D. Too Clever by Half
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+1e3+7,P=1e9+7;
int T,n,c[N],s[N];
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>T;
while(T--)
{
cin>>n;
for(int i=0;i<=n;i++)
cin>>c[i];
c[0]++;
s[n+1]=0;
for(int i=n;i>=0;i--)
s[i]=c[i]-s[i+1];
int ok=1;
if(s[0]!=1)
ok=0;
for(int i=1;i<=n;i++)
if(s[i]<=0)
ok=0;
if(!ok)
{
cout<<"Impossible\n";
continue;
}
string ans;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=(s[i]-1);j++)
ans+='R',ans+='L';
ans+='R';
}
for(int i=1;i<=n;i++)
ans+='L';
cout<<ans<<"\n";
}
}
E. Gold Miner
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=5e5+1e3+7,M=1e9+7;
int qpow(int a,int b)
{
int ret=1;
while(b)
{
if(b&1)
ret=ret*a%M;
b>>=1;
a=a*a%M;
}
return ret;
}
using ll=__int128;
struct P {
int x,y;
}p[N];
int operator ^(const P &a,const P &b)
{
return a.x*b.x+a.y*b.y;
}
int a[N],b[N],k[N];
int n,q;
struct Event {
int p,q,a,b;
};
bool operator <(const Event &a,const Event &b)
{
return (ll)a.p*b.q<(ll)b.p*a.q;
}
bool operator ==(const Event &a,const Event &b)
{
return (ll)a.p*b.q==(ll)b.p*a.q;
}
pair<int,int> gete(P a,P b)
{
if(a.x>b.x)
swap(a,b);
return {(b^b)-(a^a),2*(b.x-a.x)};
}
struct Func {
int a,b,c,d;
int eval(int u){return (((a*u+b)%M*u+c)%M*u+d)%M;}
};
Func operator +(const Func &a,const Func &b)
{
return {(a.a+b.a)%M,(a.b+b.b)%M,(a.c+b.c)%M,(a.d+b.d)%M};
}
Func f[N],s[N],d[N],sd[N];
int dlt[N];
int rk[N],ans[N];
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>q;
for(int i=1;i<=n;i++)
cin>>p[i].x>>p[i].y;
for(int i=1;i<=q;i++)
cin>>a[i]>>b[i]>>k[i];
sort(p+1,p+n+1,[&](const auto &a,const auto &b){
return a.x<b.x||(a.x==b.x&&a.y>b.y);
});
vector<Event> ev;
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
if(p[i].x==p[j].x)
continue;
auto [ax,bx]=gete(p[i],p[j]);
ev.push_back({ax,bx,i,j});
}
vector<Event> qr;
for(int i=1;i<=q;i++)
{
if(a[i]!=b[i])
{
qr.push_back({a[i],1,i,-1});
qr.push_back({b[i],1,i,1});
}
else
qr.push_back({a[i],1,i,0});
}
sort(ev.begin(),ev.end());
sort(qr.begin(),qr.end());
reverse(qr.begin(),qr.end());
for(int i=1;i<=n;i++)
{
d[i]={0,1,(2*M-2*p[i].x)%M,(p[i]^p[i])%M};
f[i]={qpow(3,M-2),(M-p[i].x)%M,(p[i]^p[i])%M,0};
s[i]=s[i-1]+f[i];
sd[i]=sd[i-1]+d[i];
rk[i]=i;
}
vector<int> pos;
vector<int> vis(n+1,-1);
for(int i=0,j;i<ev.size();i=j+1)
{
while(qr.size())
{
auto [p,q,x,t]=qr.back();
if((ll)p*ev[i].q>=ev[i].p)
break;
qr.pop_back();
if(!t)
ans[x]=sd[k[x]].eval(p);
else
ans[x]=(ans[x]+s[k[x]].eval(p)*(M+t))%M;
}
int X=(ev[i].p%M+M)%M*qpow(ev[i].q,M-2)%M;
j=i;
while(j+1<ev.size()&&ev[i]==ev[j+1])
j++;
pos.clear();
for(int k=i;k<=j;k++)
{
if(vis[ev[k].a]!=i)
vis[ev[k].a]=i,pos.push_back(ev[k].a);
if(vis[ev[k].b]!=i)
vis[ev[k].b]=i,pos.push_back(ev[k].b);
}
sort(pos.begin(),pos.end(),[&](const auto &a,const auto &b){
return rk[a]<rk[b];
});
for(int u=0,v;u<pos.size();u=v+1)
{
v=u;
int A=rk[pos[u]];
while(v+1<pos.size())
{
int B=rk[pos[v+1]];
if(p[A].x==p[B].x&&p[A].y==p[B].y)
{
v++;
continue;
}
if(p[A].x==p[B].x)
break;
auto [a,b]=gete(p[A],p[B]);
if((ll)a*ev[i].q!=(ll)b*ev[i].p)
break;
v++;
}
int B=rk[pos[v]];
for(int z=A;z<=B;z++)
dlt[z]=(f[z].eval(X)-f[A+B-z].eval(X)+M)%M;
for(int z=u;z<=v;z++)
rk[pos[z]]=A+B-rk[pos[z]];
reverse(p+A,p+B+1);
reverse(f+A,f+B+1);
reverse(d+A,d+B+1);
for(int z=A;z<=B;z++)
{
f[z].d=(f[z].d+dlt[z])%M;
s[z]=s[z-1]+f[z];
sd[z]=sd[z-1]+d[z];
}
}
}
while(qr.size())
{
auto [p,q,x,t]=qr.back();
qr.pop_back();
if(!t)
ans[x]=sd[k[x]].eval(p);
else
ans[x]=(ans[x]+s[k[x]].eval(p)*(M+t))%M;
}
for(int i=1;i<=q;i++)
{
if(a[i]==b[i])
cout<<ans[i]<<"\n";
else
cout<<ans[i]*qpow(b[i]-a[i],M-2)%M<<"\n";
}
}
F. Challenge NPC III
#include<bits/stdc++.h>
using namespace std;
const int maxc=50,inf=0x3f3f3f3f;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int T;
cin>>T;
while(T--)
{
int n,m,k;
cin>>n>>m>>k;
vector<int> c(n+5);
for(int i=1;i<=n;i++)
{
cin>>c[i];
}
vector<vector<int>> G(n+5);
for(int i=1;i<=m;i++)
{
int u,v;
cin>>u>>v;
G[u].push_back(v);
}
int ok=1;
for(int cc=1;cc<=maxc;cc++)
{
vector<int> dis(n+5,inf),start(n+5),dis2(n+5,inf);
queue<pair<int,int>> q;
for(int i=1;i<=n;i++)
{
if(c[i]==cc)
{
start[i]=i;
dis[i]=0;
q.emplace(i,0);
}
}
while(not q.empty())
{
auto [u,ty]=q.front();q.pop();
if(dis[u]>=k-1)break;
if(ty==0)
{
for(auto v:G[u])
{
if(dis[v]>dis[u]+1)
{
dis[v]=dis[u]+1;
start[v]=start[u];
q.emplace(v,0);
}
if(dis2[v]>dis[u]+1 and start[v]!=start[u])
{
dis2[v]=dis[u]+1;
q.emplace(v,1);
}
}
}
else
{
for(auto v:G[u])
{
if(dis2[v]>dis2[u]+1)
{
dis2[v]=dis2[u]+1;
q.emplace(v,1);
}
}
}
}
for(int i=1;i<=n;i++)
{
if(c[i]==cc and dis2[i]<=k-1)
{
ok=0;
break;
}
}
}
if(ok)cout<<"YES\n";
else cout<<"NO\n";
}
return 0;
}
G. Tariff-ied
/*
x>=0
1+a(x+1)/100
=(100+ax+a)/100
(100+ax+a)/(100+ax)
=1+a/(100+ax)
*/
#include<iostream>
using namespace std;
typedef long long ll;
const int N=45,M=10005;
int Case,n,k,i,a[N],f[N],g[N],len,dot,num[M];ll U,D;
inline int check(ll u,ll d){
ll low=0,high=0;
for(int i=0;i<n;i++){
//a/(100+ax)>=u/d
//a*d>=u*(100+ax)
//a*d/u>=100+ax
//ax<=a*d/u-100
//x<=d/u-100/a
//x<=(d*a-100*u)/(u*a)
ll A=d*a[i]-100*u,B=u*a[i];
if(A<0)continue;
if(A%B==0)low--;
high+=A/B+1;
}
low+=high;
if(low>k)return 1;
if(high<k)return -1;
return 0;
}
inline void solve(){
if(check(1,1)==0){
U=D=1;
return;
}
ll lu=0,ld=1,ru=1,rd=1,mu,md;
while(1){
mu=lu+ru;
md=ld+rd;
int ret=check(mu,md);
if(ret==0){
U=mu,D=md;
break;
}
ll l=1,r,fin,mid;
if(ret>0){//turn right
while(1){
r=l<<1;
if(check(lu+ru*r,ld+rd*r)>0)l=r;else break;
}
fin=l++;r--;
while(l<=r){
ll mid=(l+r)>>1;
if(check(lu+ru*mid,ld+rd*mid)>0)l=(fin=mid)+1;else r=mid-1;
}
lu+=ru*fin,ld+=rd*fin;
}else{//turn left
while(1){
r=l<<1;
if(check(ru+lu*r,rd+ld*r)<0)l=r;else break;
}
fin=l++;r--;
while(l<=r){
ll mid=(l+r)>>1;
if(check(ru+lu*mid,rd+ld*mid)<0)l=(fin=mid)+1;else r=mid-1;
}
ru+=lu*fin,rd+=ld*fin;
}
}
}
inline void mul(int p){
for(int i=1;i<=len;i++)num[i]*=p;
for(int i=1;i<=len;i++)if(num[i]>=10){
if(i==len)num[++len]=0;
num[i+1]+=num[i]/10;
num[i]%=10;
}
}
void show(){
int i;
for(i=len;i>dot;i--)cout<<num[i];
cout<<".";
for(;i;i--)cout<<num[i];
cout<<"\n";
}
int main(){
ios_base::sync_with_stdio(0);cin.tie(0);
cin>>Case;
while(Case--){
cin>>n>>k;
for(i=0;i<n;i++)cin>>a[i];
solve();
for(i=0;i<n;i++){
ll A=D*a[i]-100*U,B=U*a[i];
if(A<0){
f[i]=g[i]=0;
continue;
}
f[i]=A/B+1;
if(A%B==0)f[i]--,g[i]=1;else g[i]=0;
k-=f[i];
}
for(i=0;i<n&&k;i++)if(g[i])f[i]++,k--;
len=1;
num[1]=1;
dot=0;
for(i=0;i<n;i++){
if(!f[i])continue;
mul(f[i]*a[i]+100);
dot+=2;
}
show();
}
}
H. Sweet Sugar IV
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
typedef long long ll;
const int N=1000005,M=200005,Q=300005,K=5;
map<int,ll>T[K];ll bit[K][M];
int n,m,lim,cob,cd,cq,i,j,x,y,z,ord[M],g[M],nxt[Q];ll ans[Q];
int id[N],dfn,dfn1[N],dfn2[N];bool vis[N];
struct P{int x,y,z;}d[M],q[Q];
inline int getid(int x,int y){return (x-1)*m+y;}
void dfs1(int u){
if(vis[u]||id[u]<0)return;
vis[u]=1;
if(u<=lim)dfs1(u+m);
if(u%m)dfs1(u+1);
if(id[u]>0){
dfn++;
ord[dfn]=id[u];
}
dfn1[u]=dfn;
}
void dfs2(int u){
if(!vis[u]||id[u]<0)return;
vis[u]=0;
if(u%m)dfs2(u+1);
if(u<=lim)dfs2(u+m);
if(id[u]>0)dfn++;
dfn2[u]=dfn;
}
inline void modify(ll*f,int x,ll p){for(;x<=cd;x+=x&-x)f[x]+=p;}
inline ll ask(ll*f,int x){ll t=0;for(;x;x-=x&-x)t+=f[x];return t;}
void insert(int o,int x,ll p){
if(o>=K)return;
T[o][x]+=p;
modify(bit[o],x,p);
while(p){
map<int,ll>::iterator it=T[o].lower_bound(x+1);
if(it==T[o].end())return;
ll t=min(p,it->second);
p-=t;
insert(o+1,it->first,t);
modify(bit[o],it->first,-t);
if(t==it->second)T[o].erase(it);else it->second-=t;
}
}
inline ll query(int x,int k){
ll ret=0;
for(int i=0;i<k;i++)ret+=ask(bit[i],x);
return ret;
}
int main(){
ios_base::sync_with_stdio(0);cin.tie(0);
cin>>n>>m>>cob>>cd>>cq;
while(cob--){
int x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
z=getid(x1,y1);
for(i=x1;i<=x2;i++){
int k=z;
for(j=y1;j<=y2;j++,k++)id[k]=-1;
z+=m;
}
}
for(i=1;i<=cd;i++){
cin>>x>>y>>z;
d[i].x=x;
d[i].y=y;
d[i].z=z;
id[getid(x,y)]=i;
}
lim=(n-1)*m;
dfs1(1);
dfn=0;
dfs2(1);
for(i=1;i<=cq;i++){
cin>>x>>y>>z;
j=getid(x,y);
x=dfn1[j];
y=dfn2[j];
nxt[i]=g[x];
g[x]=i;
q[i].y=y;
q[i].z=z;
}
for(i=1;i<=cd;i++){
j=ord[i];
insert(0,dfn2[getid(d[j].x,d[j].y)],d[j].z);
for(j=g[i];j;j=nxt[j])ans[j]=query(q[j].y,q[j].z);
}
for(i=1;i<=cq;i++)cout<<ans[i]<<"\n";
}
I. Version Number
#include<bits/stdc++.h>
#define ll long long
using namespace std;
vector<int>getnum(string A)
{
vector<int>ret;
int x=0;
for(auto cc:A)
{
if(cc=='.') ret.push_back(x),x=0;
else x=x*10+(cc-'0');
}
ret.push_back(x);
return ret;
}
int main()
{
ios_base::sync_with_stdio(false);
int Tcase; cin>>Tcase;
while(Tcase--)
{
string A,B;
cin>>A>>B;
auto ai=getnum(A);
auto bi=getnum(B);
int ok=1;
for(int i=0;i<(int)ai.size();i++)
{
if( ai[i]!=bi[i] )
{
if(ai[i]<bi[i]) cout<<"B\n";
else cout<<"A\n";
ok=0;
break;
}
}
if(ok) cout<<"Equal\n";
}
return 0;
}
J. Chocolate Sweet
#include<bits/stdc++.h>
using namespace std;
#define int long long
using pii=pair<int,int>;
const int N=1e6+1e3+7;
int T,n,m,q;
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>T;
while(T--)
{
cin>>n>>m>>q;
vector<vector<int>> a(n+1,vector<int>(m+1));
vector<vector<int>> s(n+1,vector<int>(m+1));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
}
vector<pii> qry;
vector<int> ans(q);
for(int i=0;i<q;i++)
{
int x;
cin>>x;
qry.push_back({x,i});
}
sort(qry.begin(),qry.end());
priority_queue<pii> dlt;
multiset<int> ms;
for(int j=1;j<m;j++)
ms.insert(n-j);
vector<int> c(m+1);
for(int j=1;j<=m;j++)
dlt.push({-s[1][j],j});
int st=0;
for(auto [qs,id]:qry)
{
while(dlt.size()&&-dlt.top().first<=qs)
{
auto [e,j]=dlt.top();
dlt.pop();
if(j<m)
ms.erase(ms.find(n-c[j]-j));
c[j]++;
if(j<m&&c[j]<n)
ms.insert(n-c[j]-j);
if(c[j]<n)
dlt.push({-s[c[j]+1][j],j});
else
st=max(st,j);
}
if(n-c[m]-m+st==0&&(!ms.size()||*ms.begin()+st>0))
ans[id]=1;
}
for(int i=0;i<q;i++)
cout<<(ans[i]?"Putata":"Budada")<<"\n";
}
}
/*
2
3 3 2
1 2 1
1 1 3
1 4 2
1
5
2 2 1
1000000000 1000000000
1000000000 1000000000
0
*/
K. Wavelike Finding
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll inf=1LL<<60;
const int N=200010;
int n,m,i,a[N],cut,last;ll lim,f[N];
struct DS{
int cnt,len,root,f[N],son[N][2],size[N];
ll v[N],tag[N],sum;
void tag1(int x,ll p){
if(!x)return;
v[x]-=p;
tag[x]+=p;
}
void pb(int x){
if(!tag[x])return;
tag1(son[x][0],tag[x]);
tag1(son[x][1],tag[x]);
tag[x]=0;
}
void up(int x){size[x]=size[son[x][0]]+size[son[x][1]]+1;}
void rotate(int x){
int y=f[x],w=son[y][1]==x;
son[y][w]=son[x][w^1];
if(son[x][w^1])f[son[x][w^1]]=y;
if(f[y]){
int z=f[y];
if(son[z][0]==y)son[z][0]=x;
if(son[z][1]==y)son[z][1]=x;
}
f[x]=f[y];son[x][w^1]=y;f[y]=x;up(y);
}
void splay(int x){
while(f[x]){
int y=f[x];
if(f[y]){if((son[f[y]][0]==y)^(son[y][0]==x))rotate(x);else rotate(y);}
rotate(x);
}
up(x);
root=x;
}
void init(){cnt=len=sum=0;}
void append(int val){
if(!cnt){
cnt=len=root=1;
f[1]=son[1][0]=son[1][1]=0;
size[1]=1;
sum=v[1]=1LL*m*val;
tag[1]=0;
return;
}
int x=root,w=m;
while(1){
size[x]++;
pb(x);
int t=1LL*(w-size[son[x][0]])*val>v[x]?0:1;
if(!son[x][t]){
son[x][t]=++cnt;
f[cnt]=x;
son[cnt][0]=son[cnt][1]=0;
size[cnt]=1;
splay(cnt);
v[cnt]=1LL*(m-size[son[cnt][0]])*val;
tag[cnt]=0;
sum+=1LL*(m-size[cnt]+1)*val;
tag1(son[cnt][1],val);
break;
}
if(t)w-=size[son[x][0]]+1;
x=son[x][t];
}
if(len<m){
len++;
return;
}
x=root;
while(1){
pb(x);
if(son[x][1])x=son[x][1];else break;
}
splay(x);
sum-=v[x];
root=son[x][0];
f[root]=0;
}
ll get(){return len<m?-inf:sum;}
}pre,suf;
inline bool check(int l,int r){
if(r-l+1<m*2)return 0;
while(last+m<=r){
pre.append(a[last]);
f[last]=pre.get();
last++;
}
suf.init();
for(int i=r;i-m>=l;i--){
suf.append(a[i]);
if(i<=r-m+1&&f[i-1]+suf.get()>=lim)return 1;
}
return 0;
}
inline void solve(){
int l=1;
while(l<=n){
int bound=n-l+1;
if(bound<m*2)break;
pre.init();
last=l;
int low=m*2;
int high=m*2;
while(1){
if(l+low-1+m*2>n){
if(check(l,n))cut++;
return;
}
if(check(l,l+high-1))break;
else{
if(high==bound)return;
low=high+1;
high=min(high*2,bound);
}
}
int fin=high--;
while(low<=high){
int mid=(low+high)/2;
if(check(l,l+mid-1))high=(fin=mid)-1;else low=mid+1;
}
cut++;
l+=fin;
}
}
int main(){
ios_base::sync_with_stdio(0);cin.tie(0);
cin>>n>>m>>lim;
for(i=1;i<=n;i++)cin>>a[i];
solve();
cout<<cut;
}
L. Nailoongs Always Lie
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 210000;
int n;
int a[maxn];
int vis[maxn],insta[maxn];
int t[maxn],tp;
int incir[maxn];
vector<int>E[maxn];
vector<int>V[maxn]; int vn;
void go(const int x)
{
if(insta[x])
{
++vn;
int la=0;
while(la!=x)
{
la=t[tp--];
insta[la]=0;
V[vn].push_back(la);
incir[la]=1;
}
return;
}
if(vis[x]) return;
vis[x]=1;
t[++tp]=x;
insta[x]=1;
go(a[x]);
}
int f[maxn][2];
void dp(const int x)
{
f[x][0]=0,f[x][1]=1;
for(auto y:E[x]) if(!incir[y])
{
dp(y);
f[x][0]+=max(f[y][0],f[y][1]);
f[x][1]+=f[y][0];
}
}
int g[2][2],ng[2][2];
int main()
{
ios_base::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
E[a[i]].push_back(i);
}
for(int i=1;i<=n;i++) if(!vis[i])
{
while(tp) insta[t[tp--]]=0;
go(i);
}
int ans=0;
for(int i=1;i<=vn;i++)
{
const auto &Vi= V[i];
for(auto x:Vi)
dp(x);
g[0][0]= f[Vi[0]][0];
g[0][1]=g[1][0]= -n;
g[1][1]= f[Vi[0]][1];
for(int j=1;j< (int)Vi.size();j++)
{
int x=Vi[j];
for(int k=0;k<2;k++)
{
ng[k][0]=max(g[k][0]+f[x][0], g[k][1]+f[x][0]);
ng[k][1]=g[k][0]+f[x][1];
}
memcpy(g,ng,sizeof g);
}
int cc=-n;
for(int u=0;u<2;u++) for(int v=0;u+v<2;v++)
cc=max(cc, g[u][v]);
ans+=cc;
}
cout<<ans<<endl;
return 0;
}
M. Master of Both VII
#include<bits/stdc++.h>
using namespace std;
int qry(int u,int v)
{
cout<<"? "<<u<<" "<<v<<endl;
int r;
cin>>r;
if(r==-1)
exit(0);
return r;
}
signed main()
{
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
stack<int> st;
vector<pair<int,int> >ans;
for(int i=3;i<=n-1;i++)
{
int w=qry(1,i);
if(w==0)
{
ans.push_back({1,i});
while(st.size())
ans.push_back({st.top(),i}),st.pop();
}
else
{
int d=w-st.size();
if(d>0)
{
for(int j=1;j<=d;j++)
st.push(i-1);
}
else
{
for(int j=1;j<=-d;j++)
ans.push_back({st.top(),i}),st.pop();
}
}
}
while(st.size())
ans.push_back({st.top(),n}),st.pop();
cout<<"!";
for(auto [x,y]:ans)
cout<<" "<<x<<" "<<y;
cout<<endl;
int r;
cin>>r;
if(r!=1)
return 0;
}
}

浙公網安備 33010602011771號