Submission #232834

#TimeUsernameProblemLanguageResultExecution timeMemory
232834shayan_pRaspad (COI17_raspad)C++14
0 / 100
254 ms434168 KiB
// Never let them see you bleed... #include<bits/stdc++.h> #define F first #define S second #define PB push_back #define sz(s) int((s).size()) #define bit(n,k) (((n)>>(k))&1) using namespace std; typedef long long ll; typedef pair<int,int> pii; const int maxn = 1e5 + 10, MAX = 26, mod = 1e9 + 7, inf = 1e9 + 10; ll MSK[maxn]; ll vec[maxn][MAX][MAX], arr[MAX]; int ID[maxn][MAX]; int n, m; void origin(int i){ ll msk = 0; int cnt = 0; for(int j = 0; j < m; j++){ if(bit(MSK[i], j)) msk|= 1ll<<j; if(bit(MSK[i], j) && !bit(MSK[i], j+1)) arr[cnt++] = msk, msk = 0; } memcpy(vec[i][cnt], arr, sizeof arr); ID[i][cnt] = i; } int aft[66], bef[66], col[66], colId; ll _MSK; void dfs(int u){ col[u] = colId; arr[colId]|= 1ll<<u; if(bef[u] != -1 && col[bef[u]] == -1) dfs(bef[u]); if(aft[u] != -1 && col[aft[u]] == -1) dfs(aft[u]); if(u != 0 && bit(_MSK, u-1) && col[u-1] == -1) dfs(u-1); if(bit(_MSK, u+1) && col[u+1] == -1) dfs(u+1); } void mrg(int id, ll *ARR, int SZ, int _ID){ memset(aft, -1, sizeof aft); memset(bef, -1, sizeof bef); memset(col, -1, sizeof col); memset(arr, 0, sizeof arr); colId = 0; _MSK = MSK[id]; for(int i = 0; i < SZ; i++){ ll msk = MSK[id] & ARR[i]; int bf = -1; while(msk){ int nw = __builtin_ctzll(msk); msk^= 1ll<<nw; if(bf != -1) bef[nw] = bf, aft[bf] = nw; bf = nw; } } for(int i = 0; i < m; i++){ if(col[i] == -1 && bit(_MSK, i)){ dfs(i); colId++; } } if(ID[id][colId] == -1){ ID[id][colId] = _ID; memcpy(vec[id][colId], arr, sizeof arr); } } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(); memset(ID, -1, sizeof ID); cin >> n >> m; for(int i = 0; i < n; i++){ string s; cin >> s; for(int j = 0; j < m; j++) MSK[i]|= (1ll * (s[j] == '1')) << j; } origin(0); for(int i = 1; i < n; i++){ origin(i); for(int j = MAX-1; j >= 0; j--){ if(ID[i-1][j] == -1) continue; mrg(i, vec[i-1][j], j, ID[i-1][j]); } } ll ans = 0; for(int i = 0; i < n; i++){ if(MSK[i] == 0) continue; for(int j = MAX-1; j > 0; j--){ if(ID[i][j] == -1) continue; for(int k = 0; k < j; k++){ int cof = 1; if((MSK[i+1] & vec[i][j][k]) == 0) cof = n-i; ans+= 1ll * cof * (ID[i][j] - ID[i][j-1]); } } } return cout << ans << endl, 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...