Educational Codeforces Round 131 (Rated for Div. 2)
A:
#include<cstdio>
#include<cstring>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<math.h>
#define ll long long
using namespace std;
const int INF=0x3f3f3f3f;
inline int read()
{
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0',c=getchar();}
return x*f;
}
int a[5];
void solve()
{
for(int i=1;i<=4;i++)a[i]=read();
if(a[1]==0&&a[2]==0&a[3]==0&a[4]==0)printf("0\n");
else if(a[1]==1&a[2]==1&a[3]==1&a[4]==1)printf("2\n");
else printf("1\n");
}
int main()
{
int T=read();
while(T--){solve();}
return 0;
}
B:
#include<cstdio>
#include<cstring>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<math.h>
#define ll long long
using namespace std;
const int INF=0x3f3f3f3f;
inline int read()
{
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0',c=getchar();}
return x*f;
}
bool v[200010];
void solve()
{
int n=read();
printf("2\n");
memset(v,0,sizeof(v));
for(int i=1;i<=n;i++)
{
if(v[i])continue;
int t=i;
while(t<=n)
{
printf("%d ",t);
v[t]=1;
t*=2;
}
}
printf("\n");
}
int main()
{
int T=read();
while(T--){solve();}
return 0;
}
C:
#include<cstdio>
#include<cstring>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<math.h>
#define ll long long
using namespace std;
const int INF=0x3f3f3f3f;
inline int read()
{
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0',c=getchar();}
return x*f;
}
const int N=200010;
ll a[N],b[N];
int n,m;
bool check(ll mid)
{
ll ans=0;
for(int i=1;i<=n;i++)
{
if(mid>b[i])
{
ans+=b[i];
ans+=(mid-b[i])/2;
}
else ans+=mid;
}
if(ans>=m)return true;
return false;
}
void solve()
{
n=read(),m=read();
memset(b,0,sizeof(b));
for(int i=1;i<=m;i++)a[i]=read(),b[a[i]]++;
ll l=1,r=2*m+1;
while(l<r)
{
ll mid=(l+r)/2;
if(check(mid))r=mid;
else l=mid+1;
}
printf("%lld\n",l);
}
int main()
{
int T=read();
while(T--){solve();}
return 0;
}
D:
#include<cstdio>
#include<cstring>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<math.h>
#define ll long long
using namespace std;
const int INF=0x3f3f3f3f;
inline int read()
{
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0',c=getchar();}
return x*f;
}
const int N=500010;
int q[N];
struct QwQ{
int l,r,id;
}a[N];
bool cmp(QwQ a,QwQ b)
{
if(a.r==b.r)return a.l<b.l;
return a.r<b.r;
}
int fa[N];
int find(int x)
{
if(fa[x]==x)return x;
return fa[x]=find(fa[x]);
}
int ans[N];
void solve()
{
int n=read();
for(int i=1;i<=n;i++)q[i]=read(),fa[i]=i;
for(int i=1;i<=n;i++)
{
if(q[i]==0)a[i].l=i+1,a[i].r=n,a[i].id=i;
else a[i].l=i/(q[i]+1)+1,a[i].r=i/q[i],a[i].id=i;
}
//for(int i=1;i<=n;i++)cout<<a[i].l<<" "<<a[i].r<<endl;
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++)
{
int t=find(a[i].l);
ans[a[i].id]=t;
fa[t]=t+1;
}
for(int i=1;i<=n;i++)printf("%d ",ans[i]);
printf("\n");
}
int main()
{
int T=read();
while(T--){solve();}
return 0;
}
E:不会
F:
#include<cstdio>
int n,a,q,d,l[800011],r[800011];
bool p[400001];
long long lz[800011][2],sum[800011][2],ct[800011],ans,ss,s,ls,rs,ll,rr;
int getmax(int aa,int bb)
{
if(aa>bb)return(aa);
else return(bb);
}
int getmin(int aa,int bb)
{
if(aa>bb)return(bb);
else return(aa);
}
void built(int num,int x,int y)
{
l[num]=x;
r[num]=y;
for(int i=0;i<=1;i++)lz[num][i]=0;
for(int i=0;i<=1;i++)sum[num][i]=0;
ct[num]=0;
if(x==y)return;
int mid=(x+y)/2;
built(num*2,x,mid);
built(num*2+1,mid+1,y);
}
void update(int num,int opt,long long zz)
{
lz[num][opt]=lz[num][opt]+zz;
sum[num][opt]=sum[num][opt]+zz*ct[num];
}
void gai(int num,int x,int y,int opt,long long zz)
{
if(y<=0)return;
if(x>n)return;
if((l[num]==x)&&(r[num]==y))
{
update(num,opt,zz);
return;
}
int mid=(l[num]+r[num])/2;
if(lz[num][opt]!=0)
{
update(num*2,opt,lz[num][opt]);
update(num*2+1,opt,lz[num][opt]);
lz[num][opt]=0;
}
if(y<=mid)gai(num*2,x,y,opt,zz);
else
{
if(x>mid)gai(num*2+1,x,y,opt,zz);
else
{
gai(num*2,x,mid,opt,zz);
gai(num*2+1,mid+1,y,opt,zz);
}
}
sum[num][opt]=sum[num*2][opt]+sum[num*2+1][opt];
}
long long ask1(int num,int x,int y)
{
if(y<=0)return 0;
if(x>n)return 0;
if((l[num]==x)&&(r[num]==y))return(ct[num]);
int mid=(l[num]+r[num])/2;
if(y<=mid)return(ask1(num*2,x,y));
else
{
if(x>mid)return(ask1(num*2+1,x,y));
else return(ask1(num*2,x,mid)+ask1(num*2+1,mid+1,y));
}
}
long long ask2(int num,int x,int y,int opt)
{
if(y<=0)return 0;
if(x>n)return 0;
if((l[num]==x)&&(r[num]==y))return(sum[num][opt]);
int mid=(l[num]+r[num])/2;
if(lz[num][opt]!=0)
{
update(num*2,opt,lz[num][opt]);
update(num*2+1,opt,lz[num][opt]);
lz[num][opt]=0;
}
if(y<=mid)return(ask2(num*2,x,y,opt));
else
{
if(x>mid)return(ask2(num*2+1,x,y,opt));
else return(ask2(num*2,x,mid,opt)+ask2(num*2+1,mid+1,y,opt));
}
}
void rev(int num,int x)
{
if(l[num]==r[num])
{
ct[num]=1-ct[num];
sum[num][0]=sum[num][1]=0;
if(ct[num]>0)
{
sum[num][0]=ask1(1,l[num]+1,getmin(n,l[num]+d));
sum[num][1]=ask1(1,getmax(1,l[num]-d),l[num]-1);
}
return;
}
for(int opt=0;opt<=1;opt++)if(lz[num][opt]!=0)
{
update(num*2,opt,lz[num][opt]);
update(num*2+1,opt,lz[num][opt]);
lz[num][opt]=0;
}
if(r[num*2]>=x)rev(num*2,x);
else rev(num*2+1,x);
ct[num]=ct[num*2]+ct[num*2+1];
for(int i=0;i<=1;i++)sum[num][i]=sum[num*2][i]+sum[num*2+1][i];
}
int main()
{
n=200000;
for(int i=0;i<=200000;i++)p[i]=false;
scanf("%d%d",&q,&d);
built(1,1,200000);
ans=0;
for(int i=1;i<=q;i++)
{
scanf("%d",&a);
if(p[a])
{
gai(1,getmax(a-d,1),a-1,0,-1);
gai(1,a+1,getmin(a+d,n),1,-1);
ls=ask2(1,getmax(a-d,1),a-1,0);
rs=ask2(1,a+1,getmin(a+d,n),1);
ll=ask1(1,getmax(a-d,1),a-1);
rr=ask1(1,a+1,getmin(a+d,n));
rev(1,a);
ans=ans-((ls+rs+(ll*(ll-1)/2)+(rr*(rr-1)/2))/2);
p[a]=false;
}
else
{
ls=ask2(1,getmax(a-d,1),a-1,0);
rs=ask2(1,a+1,getmin(a+d,n),1);
ll=ask1(1,getmax(a-d,1),a-1);
rr=ask1(1,a+1,getmin(a+d,n));
rev(1,a);
ans=ans+((ls+rs+(ll*(ll-1)/2)+(rr*(rr-1)/2))/2);
gai(1,getmax(a-d,1),a-1,0,1);
gai(1,a+1,getmin(a+d,n),1,1);
p[a]=true;
}
printf("%lld\n",ans);
}