Codeforces Round #411 (Div. 2), problem: (E) Ice cream coloring Solution In C/C++

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<set>
using namespace std;
const int MX=600111;
int n,m;
int pool[MX],*c[MX],s[MX];
int hed[MX],nxt[MX],t[MX],ec,vis[MX],vism[MX],no[MX];
set<int>cur;
inline void ade(int u,int v){
ec++;nxt[ec]=hed[u];t[ec]=v;hed[u]=ec;
}
void dfs(int k){
vis[k]=1;
for(int *i=c[k];i!=c[k+1];i++)if(vism[*i])cur.erase(no[*i]);
for(int *i=c[k];i!=c[k+1];i++)if(!vism[*i]){
no[*i]=*(cur.lower_bound(1));
cur.erase(no[*i]);
vism[*i]=1;
}
for(int *i=c[k];i!=c[k+1];i++)cur.insert(no[*i]);
for(int i=hed[k];i;i=nxt[i])if(!vis[t[i]])dfs(t[i]);
}
int main(){
scanf(“%d%d”,&n,&m);
c[1]=pool;int ans=0;
for(int i=1;i<=n;i++){
scanf(“%d”,&s[i]);
for(int j=0;j<s[i];j++)scanf(“%d”,&c[i][j]);
c[i+1]=c[i]+s[i];
ans=max(ans,s[i]);
}
for(int i=1;i<n;i++){
int u,v;scanf(“%d%d”,&u,&v);
ade(u,v),ade(v,u);
}
ans=max(ans,1);
for(int i=1;i<=ans;i++)cur.insert(i);
printf(“%d\n”,ans);
dfs(1);
for(int i=1;i<=m;i++)if(!vism[i])no[i]=1;
for(int i=1;i<=m;i++)printf(“%d “,no[i]);puts(“”);
return 0;
}

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<set>
using namespace std;
const int MX=600111;
int n,m;
int pool[MX],*c[MX],s[MX];
int hed[MX],nxt[MX],t[MX],ec,vis[MX],vism[MX],no[MX];
set<int>cur;
inline void ade(int u,int v){
ec++;nxt[ec]=hed[u];t[ec]=v;hed[u]=ec;
}
void dfs(int k){
vis[k]=1;
for(int *i=c[k];i!=c[k+1];i++)if(vism[*i])cur.erase(no[*i]);
for(int *i=c[k];i!=c[k+1];i++)if(!vism[*i]){
no[*i]=*(cur.lower_bound(1));
cur.erase(no[*i]);
vism[*i]=1;
}
for(int *i=c[k];i!=c[k+1];i++)cur.insert(no[*i]);
for(int i=hed[k];i;i=nxt[i])if(!vis[t[i]])dfs(t[i]);
}
int main(){
scanf(“%d%d”,&n,&m);
c[1]=pool;int ans=0;
for(int i=1;i<=n;i++){
scanf(“%d”,&s[i]);
for(int j=0;j<s[i];j++)scanf(“%d”,&c[i][j]);
c[i+1]=c[i]+s[i];
ans=max(ans,s[i]);
}
for(int i=1;i<n;i++){
int u,v;scanf(“%d%d”,&u,&v);
ade(u,v),ade(v,u);
}
ans=max(ans,1);
for(int i=1;i<=ans;i++)cur.insert(i);
printf(“%d\n”,ans);
dfs(1);
for(int i=1;i<=m;i++)if(!vism[i])no[i]=1;
for(int i=1;i<=m;i++)printf(“%d “,no[i]);puts(“”);
return 0;
}

More from author

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Related posts

Advertismentspot_img

Latest posts

Tech Workers Made ChatGPT Drive a Toyota Corolla

In an unexpected and creative showcase of modern artificial intelligence, a group of tech enthusiasts and engineers in San Francisco managed to connect OpenAI's...

7 Reasons This Viral Kitchen Gadgets Is Worth Every Single Penny

📢 As an Amazon Associate, I earn from qualifying purchases.I stumbled across this while desperately trying to fix a recurring problem in my routine....

Flock Forces Website Showing Camera Locations To Shut Down, Because ‘Transparency Matters’

In an era where digital surveillance grows increasingly ubiquitous, Flock Safety has established itself as a major player in automated license plate reader (ALPR)...

Want to stay up to date with the latest news?

We would love to hear from you! Please fill in your details and we will stay in touch. It's that simple!