Submission #1204755

#TimeUsernameProblemLanguageResultExecution timeMemory
1204755UnforgettableplViruses (BOI20_viruses)C++20
14 / 100
1 ms328 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const unsigned int INF = ((unsigned int)1<<63); int32_t main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); int G,N,M; cin >> G >> N >> M; vector<vector<vector<int>>> mutations(G); for(int i=1;i<=N;i++){ int a,k; cin >> a >> k; for(int&x:mutations[a].emplace_back(k))cin>>x; } vector<vector<int>> antibodies; vector<__int128> bad = {2}; auto combine = [&](vector<__int128> &seqA,vector<__int128> &seqB){ if(!seqA.empty() and seqA[0]==2)return bad; if(!seqB.empty() and seqB[0]==2)return bad; vector<__int128> seqC=seqA; for(__int128&i:seqB)seqC.emplace_back(i); bool isBad=false; for(int i=0;i<seqC.size();i++){ for(auto&antibody:antibodies){ if(i+antibody.size()>seqC.size())continue; bool works = true; for(int j=0;j<antibody.size();j++){ if((__int128)antibody[j]!=seqC[i+j]){ works=false; break; } } if(!works)continue; isBad=true; break; } if(isBad)break; } __int128 middleLength = 0; for(int i=50;i<(int)seqC.size()-50;i++){ if(seqC[i]>=0)middleLength++; else middleLength+=-seqC[i]; } if(isBad){ return bad; } middleLength = -middleLength; if(middleLength!=0){ vector<__int128> seqAns; for(int i=0;i<50;i++){ seqAns.emplace_back(seqC[i]); } seqAns.emplace_back(middleLength); for(int i=seqC.size()-50;i<seqC.size();i++){ seqAns.emplace_back(seqC[i]); } return seqAns; } else return seqC; }; for(int i=1;i<=M;i++){ int l; cin >> l; for(int&x:antibodies.emplace_back(l))cin>>x; } vector<vector<__int128>> ans(G); { // Solving M==0 ans[0]={0}; ans[1]={1}; vector<int> visited(G); visited[0]=visited[1]=2; auto dfs = [&](auto&& self,int x)->void{ if(visited[x]){ if(visited[x]==1){ ans[x]={2}; } return; } visited[x]=1; auto mutation = mutations[x][0]; for(int&i:mutation){ self(self,i); ans[x]=combine(ans[x],ans[i]); } visited[x]=2; }; for(int i=2;i<G;i++){ if(!visited[i])dfs(dfs,i); __int128 lenAns = 0; for(auto&i:ans[i]){ if(i>=0)lenAns++; else lenAns+=-i; } if(ans[i][0]==2 or lenAns>=INF)cout<<"YES\n"; else cout << "NO " << (int)lenAns << '\n'; } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...