Submission #13211029
Source Code Expand
Copy
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define int ll #define REP(i,n) for(int i=0;i<n;++i) #define ALL(name) name.begin(),name.end() #define SORT(name) sort(name.begin(), name.end()) #define ZERO(p) memset(p, 0, sizeof(p)) #define MINUS(p) memset(p, -1, sizeof(p)) #if 1 # define DBG(fmt, ...) printf(fmt, ##__VA_ARGS__) #else # define DBG(fmt, ...) #endif const ll LLINF = (1LL<<60); const int INF = (1LL<<30); const double DINF = std::numeric_limits<double>::infinity(); const int MOD = 1000000007; #define MAX_N 100010 int N; vector<int> A; int func(int val) { int ret = 0; REP(i, N) { ret += abs(A[i] + val); } return ret; } // [lb, ub] の範囲の値を下に凸な func 関数で得られるとき、 // 三分探索で最小解を求める // func は返り値 ll, 引数ひとつで型 ll の関数を与える ll tri_search(ll lb, ll ub, function< ll(ll) > func) { while(ub - lb > 1) { ll t1 = (2 * lb + ub) / 3; ll t2 = (lb + 2 * ub) / 3; if(func(t1) > func(t2)) { // 上に凸ならここの不等号を逆転させれば OK if(lb == t1) { break; } // もう変化しないくらい範囲が狭くなった lb = t1; } else { if(ub == t2) { break; } ub = t2; } } // この時点でだいたい ub - lb <= 6 くらいになってるはず ll ret = LLINF; // 上に凸ならここを -LLINF にする for(ll i = lb; i <= ub; ++i) { ret = min(ret, func(i)); // 上に凸ならここを max にする } return ret; } signed main() { cin.tie(0); cout.tie(0); ios::sync_with_stdio(false); cin >> N; A.resize(N); REP(i, N) { cin >> A[i]; A[i] -= (i + 1); } int ans = tri_search(-INF * 2, INF * 2, func); printf("%lld\n", ans); return 0; }
Submission Info
Submission Time | |
---|---|
Task | C - Linear Approximation |
User | VTR |
Language | C++14 (GCC 5.4.1) |
Score | 300 |
Code Size | 1995 Byte |
Status | AC |
Exec Time | 46 ms |
Memory | 1792 KB |
Judge Result
Set Name | Sample | All | ||||
---|---|---|---|---|---|---|
Score / Max Score | 0 / 0 | 300 / 300 | ||||
Status |
|
|
Set Name | Test Cases |
---|---|
Sample | sample_01.txt, sample_02.txt, sample_03.txt, sample_04.txt |
All | sample_01.txt, sample_02.txt, sample_03.txt, sample_04.txt, sample_01.txt, sample_02.txt, sample_03.txt, sample_04.txt, subtask_1_01.txt, subtask_1_02.txt, subtask_1_03.txt, subtask_1_04.txt, subtask_1_05.txt, subtask_1_06.txt, subtask_1_07.txt, subtask_1_08.txt, subtask_1_09.txt, subtask_1_10.txt, subtask_1_11.txt |
Case Name | Status | Exec Time | Memory |
---|---|---|---|
sample_01.txt | AC | 1 ms | 256 KB |
sample_02.txt | AC | 1 ms | 256 KB |
sample_03.txt | AC | 1 ms | 256 KB |
sample_04.txt | AC | 1 ms | 256 KB |
subtask_1_01.txt | AC | 1 ms | 256 KB |
subtask_1_02.txt | AC | 9 ms | 512 KB |
subtask_1_03.txt | AC | 8 ms | 512 KB |
subtask_1_04.txt | AC | 21 ms | 1024 KB |
subtask_1_05.txt | AC | 37 ms | 1664 KB |
subtask_1_06.txt | AC | 41 ms | 1792 KB |
subtask_1_07.txt | AC | 46 ms | 1792 KB |
subtask_1_08.txt | AC | 43 ms | 1792 KB |
subtask_1_09.txt | AC | 43 ms | 1792 KB |
subtask_1_10.txt | AC | 42 ms | 1792 KB |
subtask_1_11.txt | AC | 42 ms | 1792 KB |