Codeforces Round #805 (Div. 3)
A. Round Down the Price:
#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 mod=1e9+7;
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 size(ll n)
{
int ans=0;
while(n)
{
n/=10;
ans++;
}
return ans;
}
ll p[100];
void solve()
{
ll n=read();
int k=size(n)-1;
if(k==0)printf("%lld\n",n-1);
else printf("%lld\n",n-p[k]);
}
int main()
{
p[1]=10;
for(int i=2;i<=10;i++)p[i]=p[i-1]*10;
int T=read();
while(T--){solve();}
return 0;
}
B. Polycarp Writes a String from Memory:
#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 mod=1e9+7;
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;
}
void solve()
{
char a[200010],b[5];
scanf("%s",a);
int n=strlen(a);
b[1]='+',b[2]='+',b[3]='+';
int cnt=0,ans=1;
for(int i=0;i<n;i++)
{
bool flag=1;
for(int j=1;j<=3;j++)
{
if(a[i]==b[j])
{
flag=0;
break;
}
}
if(flag==0)continue;
if(cnt==3)
{
b[1]='+',b[2]='+',b[3]='+';
ans++;
cnt=0;
}
b[++cnt]=a[i];
}
printf("%d\n",ans);
}
int main()
{
int T=read();
while(T--){solve();}
return 0;
}
C. Train and Queries:
#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 mod=1e9+7;
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];
int n,m;
struct qwq{
ll l,r;
};
map<ll,qwq>f;
void solve()
{
map<ll,int>v;
n=read(),m=read();
for(int i=1;i<=n;i++)scanf("%lld",&a[i]),f[a[i]].l=-1,f[a[i]].r=-1,v[a[i]]=1;
for(int i=1;i<=n;i++)
{
if(f[a[i]].l==-1)f[a[i]].l=i;
else f[a[i]].r=i;
}
for(int i=1;i<=m;i++)
{
ll x,y;
scanf("%lld%lld",&x,&y);
if(!v[x]||!v[y])printf("NO\n");
else if((f[x].l<f[y].l)||(f[x].l<f[y].r))printf("YES\n");
else printf("NO\n");
}
}
int main()
{
int T=read();
while(T--){solve();}
return 0;
}
D. Not a Cheap String
#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 mod=1e9+7;
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=2e5+10;
struct qwq{
int a,id;
}f[N];
char a[N];
bool v[N];
bool cmp(qwq a,qwq b){return a.a>b.a;}
void solve()
{
memset(v,0,sizeof(v));
scanf("%s",&a);
int n=strlen(a);
int sum=0;
for(int i=0;i<n;i++)f[i].a=a[i]-'a'+1,f[i].id=i,sum+=f[i].a;
sort(f,f+n,cmp);
int k=read();
if(sum<=k)
{
cout<<a<<endl;
return;
}
for(int i=0;i<n;i++)
{
sum-=f[i].a;
v[f[i].id]=1;
if(sum<=k)break;
}
for(int i=0;i<n;i++)
if(!v[i])cout<<a[i];
cout<<endl;
}
int main()
{
int T=read();
while(T--){solve();}
return 0;
}
E. Split Into Two Sets:
#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 mod=1e9+7;
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;
struct qwq{
int x,y;
}a[N];
int cnt[N],f[N];
int find(int x)
{
if(f[x]==x)return x;
return f[x]=find(f[x]);
}
void solve()
{
memset(cnt,0,sizeof(cnt));
int n=read();
for(int i=1;i<=n;i++)a[i].x=read(),a[i].y=read(),cnt[a[i].x]++,cnt[a[i].y]++,f[i]=i;
for(int i=1;i<=n;i++)
{
if(cnt[i]!=2)
{
printf("NO\n");
return;
}
}
for(int i=1;i<=n;i++)
{
int x=a[i].x,y=a[i].y;
int tx=find(a[i].x),ty=find(a[i].y);
if(tx!=ty)f[tx]=ty;
}
memset(cnt,0,sizeof(cnt));
for(int i=1;i<=n;i++)cnt[f[find(a[i].x)]]++,cnt[f[find(a[i].y)]];
for(int i=1;i<=n;i++)
{
if(cnt[i]&1)
{
printf("NO\n");
return;
}
}
printf("YES\n");
}
int main()
{
int T=read();
while(T--){solve();}
return 0;
}
F. Equate Multisets:
#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 mod=1e9+7;
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=2e5+10;
int a[N],b[N];
int solve(int x)
{
while(x%2==0){x/=2;}
return x;
}
void solve()
{
map<int,int>mp;
int n=read();
for(int i=1;i<=n;i++)a[i]=read(),a[i]=solve(a[i]);
for(int i=1;i<=n;i++)b[i]=read(),b[i]=solve(b[i]);
for(int i=1;i<=n;i++)mp[a[i]]++;
sort(b+1,b+1+n);
bool flag=1;
for(int i=1;i<=n;i++)
{
if(!flag)break;
if(mp[b[i]])mp[b[i]]--;
else
{
while(1)
{
b[i]/=2;
if(mp[b[i]])
{
mp[b[i]]--;
break;
}
if(b[i]==0)
{
flag=0;
printf("NO\n");
break;
}
}
}
}
if(flag)printf("YES\n");
}
int main()
{
int T=read();
while(T--){solve();}
return 0;
}
G1、G2. Passable Paths:
#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 mod=1e9+7;
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=2e5+10;
int n,m;
int a[N],h[N],fa[21][N];
vector<int>g[N];
void dfs(int x)
{
for(int i=0;i<g[x].size();i++)
{
int v=g[x][i];
if(fa[0][x]==v)continue;
fa[0][v]=x;
h[v]=h[x]+1;
dfs(v);
}
}
int lca(int x,int y)
{
if(h[x]<h[y])swap(x,y);
for(int i=20;i>=0;i--)
if(h[x]-h[y]>>i)x=fa[i][x];
if(x==y)return x;
for(int i=20;i>=0;i--)
{
if(fa[i][x]!=fa[i][y])
{
x=fa[i][x];
y=fa[i][y];
}
}
return fa[0][x];
}
void solve()
{
bool v[N];
n=read();
for(int i=1;i<=n-1;i++)
{
int x=read(),y=read();
g[x].push_back(y);
g[y].push_back(x);
v[y]=1;
}
int root;
for(int i=1;i<=n;i++)if(!v[i])root=i;
dfs(root);
for(int i=1;i<=20;i++)
for(int j=1;j<=n;j++)
fa[i][j]=fa[i-1][fa[i-1][j]];
int m=read();
while(m--)
{
int cnt=read();
bool ans=1;
int t=0,u,v,lc;
while(cnt--)
{
int x=read();
if(t==0)
{
t=1;
u=x;
}
else if(t==1)
{
if(lca(u,x)==u)
{
v=x;
t=2;
}
else if(lca(u,x)==x)
{
v=u,u=x;
t=2;
}
else
{
v=x;
t=3;
lc=lca(u,v);
}
}
else if(t==2)
{
if(lca(x,u)==x)u=x;
else if(lca(x,v)==v)v=x;
else if(lca(x,u)==u&&lca(x,v)==x){
}
else if(lca(u,lca(x,v))==lca(x,v))
{
u=x;
lc=lca(u,v);
t=3;
}
else
{
ans=0;
//break;
}
}
else if(t==3)
{
if(lca(x,u)==u)u=x;
else if(lca(x,v)==v)v=x;
else if(lca(lc,x)==lc&&lca(u,x)==x){
}
else if(lca(lc,x)==lc&&lca(v,x)==x){
}
else
{
ans=0;
//break;
}
}
}
if(ans)printf("YES\n");
else printf("NO\n");
}
}
int main()
{
int T=1;
while(T--){solve();}
return 0;
}