제출 #1314347

#제출 시각아이디문제언어결과실행 시간메모리
1314347boclobanchatPaths (BOI18_paths)C++20
70 / 100
430 ms103388 KiB
#include<bits/stdc++.h> using namespace std; const int MAXN=3e5+5; vector<int> ds[MAXN]; long long cntmask[MAXN][36],cntmask2[MAXN][36],pos[MAXN],cnt[6]; int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n,m,k; cin>>n>>m>>k; long long ans=0; for(int i=1;i<=n;i++) { cin>>pos[i]; pos[i]--; } for(int i=1;i<=m;i++) { int l,r; cin>>l>>r; ds[l].push_back(r),ds[r].push_back(l); if(pos[l]!=pos[r]) ans+=2,cntmask[l][(1<<pos[l])|(1<<pos[r])]++,cntmask[r][(1<<pos[l])|(1<<pos[r])]++; } if(k>=3) { long long s=0; for(int i=1;i<=n;i++) for(int j=0;j<32;j++) if(((1<<pos[i])&j)==0) for(auto v:ds[i]) s+=cntmask[v][j]; ans+=s; } if(k>=4) { long long s=0; for(int i=1;i<=n;i++) for(int j=0;j<32;j++) for(int k=31-j;k;k=(k-1)&(31-j)) for(auto v:ds[i]) s+=cntmask[v][j]*cntmask[i][k]; ans+=s; } if(k>=5) { for(int i=1;i<=n;i++) { for(auto v:ds[i]) cnt[pos[v]]++; for(auto v:ds[i]) if(pos[i]!=pos[v]) for(int j=0;j<5;j++) if(pos[i]!=j&&pos[v]!=j) cntmask2[v][(1<<j)|(1<<pos[i])|(1<<pos[v])]+=cnt[j]; } long long s=0; for(int i=1;i<=n;i++) for(int j=0;j<32;j++) for(int k=31-j;k;k=(k-1)&(31-j)) for(auto v:ds[i]) ans+=cntmask[v][j]*cntmask2[i][k]; ans+=s; } cout<<ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...