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;
    }
}

  

posted @ 2025-08-10 17:20  Claris  阅读(68)  评论(0)    收藏  举报