제출 #1281182

#제출 시각아이디문제언어결과실행 시간메모리
1281182aren_danceStrah (COCI18_strah)C++20
99 / 110
1066 ms47612 KiB
// oj us strah.cpp : This file contains the 'main' function. Program execution begins and ends there. #define _CRT_SECURE_NO_WARNINGS #include <unordered_map> #include <unordered_set> #include <algorithm> #include <iostream> #include <cstring> #include <complex> #include <cassert> #include <cfloat> #include <memory> #include <chrono> #include <random> #include <climits> #include <limits> #include <bitset> #include <cstdio> #include <vector> #include <string> #include <stack> #include <tuple> #include <queue> #include <ctime> #include <cmath> #include <list> #include <map> #include <set> #define ll long long using namespace std; const int N = 2e3 + 1; const int M = 12; int a[N][N]; ll s[N][N]; ll sp[N][M]; ll dp[N]; int n,m; void fill() { for (int i = 1;i <= n;++i) { for (int j = 1;j <= m;++j) { if (a[i][j]) { s[i][j] = s[i - 1][j] + 1; } else { s[i][j] = 0; } } } } void ar_cin(){ cin >> n >> m; for (int i = 1;i <= n;++i) { string s; cin >> s; for (int j = 1;j <= m;++j) { if (s[j - 1]=='.') { a[i][j] = 1; } else { a[i][j] = 0; } } } } ll get(int l,int r) { if (l > r) { return 1e9; } int x = log2(r - l + 1); return min(sp[l][x],sp[r-(1<<x)+1][x]); } void build(int ind) { for (int i = 1;i <= m;++i) { sp[i][0] = s[ind][i]; } for (int i = 1;i < M;++i) { for (int j = 1;j <= m;++j) { sp[j][i] = min(sp[j][i-1],sp[j+(1<<(i-1))][i-1]); } } } int main() { ar_cin(); fill(); ll answ = 0ll; for (int i = 1;i <= m;++i) { for (int j = 1;j <= i;++j) { dp[i]+=j*(i-j+1); } } for (int i = 1;i <= n;++i) { build(i); for (int j = 1;j <= m;++j) { int l = 1; int r = j-1; ll answl=j; while (l<=r) { ll mid = (l + r) / 2; if (get(mid, j-1) > s[i][j]) { r = mid - 1; answl = mid; } else { l = mid + 1; } } ll answr = j; l = j + 1; r = m; while (l <= r) { ll mid = (l + r) / 2; if (get(j,mid) == s[i][j]) { l = mid + 1; answr = mid; } else { r = mid - 1; } } ll f = (j - answl + 1) * (j - answl+2) / 2; ll e = (answr - j + 1) * (answr - j) / 2;swap(e, f); answ += (e*(answr-j+1)+f*(j-answl+1))*s[i][j]*(s[i][j]+1)/2; } } cout << answ << '\n'; return 0; } // Run program: Ctrl + F5 or Debug > Start Without Debugging menu // Debug program: F5 or Debug > Start Debugging menu // Tips for Getting Started: // 1. Use the Solution Explorer window to add/manage files // 2. Use the Team Explorer window to connect to source control // 3. Use the Output window to see build output and other messages // 4. Use the Error List window to view errors // 5. Go to Project > Add New Item to create new code files, or Project > Add Existing Item to add existing code files to the project // 6. In the future, to open this project again, go to File > Open > Project and select the .sln file
#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...
#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...