第三个点网络大小4e5,T飞掉了
#include<bits/stdc++.h>
using namespace std;
const int N =2e5+10;
const int M =1e6+10;
const int INF=INT_MAX;
int source,endg,n,m,cnt,tot_L,tot_R,tot;
int cur[M],dep[M],t[N],La[N],Ra[N],cntp,plL[N],plR[N],tot_num[N];
struct edge
{
int nxt,flow,opp;
};
vector<edge>G[M];
struct node
{
int nu,line;
};
vector<node>nu_begin[N];
vector<int>nu_end[N];
vector<int>waypl[N];
string printS[2]={"L","R"};
inline int read()
{
int x=0;
char c=getchar();
while(c<'0'||c>'9')
{
c=getchar();
}
while(c>='0'&&c<='9')
{
x=(x<<1)+(x<<3)+(c^48);
c=getchar();
}
return x;
}
inline void add_new_edge(int u,int v,int flow)
{
G[u].push_back(edge{v,flow,G[v].size()});
G[v].push_back(edge{u,0,G[u].size()-1});
}
inline bool find_rest_graph()
{
memset(dep,0,sizeof(dep));
dep[source]=1;
cur[source]=0;
queue<int>q;
q.push(source);
while(!q.empty())
{
int now=q.front();
q.pop();
for(auto i:G[now])
{
int flow=i.flow;
int nxt=i.nxt;
if(!dep[nxt]&&flow)
{
dep[nxt]=dep[now]+1;
cur[nxt]=0;
if(nxt==endg)
return true;
q.push(nxt);
}
}
}
return false;
}
inline int find_extended_path(int now,int limit)
{
if(now==endg)
return limit;
int out_flow=0;
for(int i=cur[now];out_flow<limit&&i<G[now].size();++i)
{
int nxt=G[now][i].nxt;
int flow=G[now][i].flow;
cur[now]=i;
if(dep[nxt]==dep[now]+1&&flow)
{
int k=find_extended_path(nxt,min(flow,limit-out_flow));
if(!k)
dep[nxt]=0;
out_flow+=k;
G[now][i].flow-=k;
G[nxt][G[now][i].opp].flow+=k;
}
}
return out_flow;
}
inline int Dinic()
{
int addtional_flow,Max_flow=0,cnt=0;
while(find_rest_graph())
{
while(addtional_flow=find_extended_path(source,INF))
Max_flow+=addtional_flow;
}
return Max_flow;
}
inline void print(bool flag)
{
if(!flag)
{
printf("NO");
exit(0);
}
else
{
printf("YES\n");
for(int i=1;i<=n;++i)
{
bool ans[nu_begin[i].size()+1];
int cnt=-1;
bool f=0;
int p=-1;
for(int j=0;j<nu_begin[i].size();++j)
{
int k=nu_begin[i][j].line;
if((j==nu_begin[i].size()-1||nu_begin[i][j].nu!=nu_begin[i][j+1].nu))
{
if((j-p)&1)
{
cnt++;
if(!G[La[i]][waypl[i][cnt]].flow)
ans[k]=0;
else
ans[k]=1;
}
else
{
f=!f;
ans[k]=f;
}
p=j;
}
else
{
f=!f;
ans[k]=f;
}
}
for(int j=0;j<nu_begin[i].size();++j)
cout<<printS[ans[j]];
puts("");
}
}
}
inline void build_graph()
{
for(int i=1;i<=n;++i)
{
if(!nu_end[i].size())
continue;
La[i]=++cntp;
Ra[i]=++cntp;
}
for(int i=1;i<=n;++i)
{
tot+=nu_end[i].size();
for(int j:nu_end[i])
{
tot_num[j]++;
if(!plL[j])
{
plL[j]=++cntp;
plR[j]=++cntp;
}
add_new_edge(La[i],plL[j],1);
waypl[i].push_back(G[La[i]].size()-1);
add_new_edge(Ra[i],plR[j],1);
}
}
tot_L=++cntp;
tot_R=++cntp;
source=++cntp;
endg=++cntp;
for(int i=1;i<=n;++i)
{
if(!nu_end[i].size())
continue;
add_new_edge(source,La[i],nu_end[i].size()>>1);
add_new_edge(source,Ra[i],nu_end[i].size()>>1);
}
for(int i=1;i<=n;++i)
{
if(!tot_num[i])
continue;
if(tot_num[i]&1)
print(0);
add_new_edge(plL[i],tot_L,tot_num[i]>>1);
add_new_edge(plR[i],tot_R,tot_num[i]>>1);
}
add_new_edge(tot_L,endg,tot>>1);
add_new_edge(tot_R,endg,tot>>1);
}
inline bool cmp(node a,node b)
{
return a.nu<b.nu;
}
inline void dispersed()
{
sort(t+1,t+cnt+1);
int len=unique(t+1,t+cnt+1)-t-1;
for(int i=1;i<=n;++i)
{
for(int j=0;j<nu_begin[i].size();++j)
{
nu_begin[i][j].nu=lower_bound(t+1,t+len+1,nu_begin[i][j].nu)-t;
}
sort(nu_begin[i].begin(),nu_begin[i].end(),cmp);
}
for(int i=1;i<=n;++i)
{
int p=-1;
for(int j=0;j<nu_begin[i].size();++j)
{
if((j==nu_begin[i].size()-1||nu_begin[i][j].nu!=nu_begin[i][j+1].nu)&&(j-p)&1)
nu_end[i].push_back(nu_begin[i][j].nu),p=j;
}
}
}
int main()
{
n=read();
for(int i=1;i<=n;++i)
{
int sum;
sum=read();
for(int j=0;j<sum;++j)
{
int number;
number=read();
t[++cnt]=number;
nu_begin[i].push_back(node{number,j});
}
}
dispersed();
build_graph();
if(Dinic()<tot)
print(0);
else
print(1);
}