From 759719ab4dbd05d6e22ba35caf4286f60df04501 Mon Sep 17 00:00:00 2001 From: Jaehyun Koo Date: Sun, 29 May 2016 22:14:33 +0900 Subject: [PATCH] 20160529 --- APIO/apio16_fireworks.cpp | 112 ++++++++++++++++++++++++++++++++++ BOI/boi09_candy.cpp | 58 ++++++++++++++++++ BOI/boi09_monument.cpp | 122 +++++++++++++++++++------------------- BOI/boi09_stupid.cpp | 7 +++ CEOI/ceoi11_teams.cpp | 101 +++++++++++++++++-------------- IOI/ioi02_frog.cpp | 46 +++++++------- 6 files changed, 316 insertions(+), 130 deletions(-) create mode 100644 APIO/apio16_fireworks.cpp create mode 100644 BOI/boi09_candy.cpp create mode 100644 BOI/boi09_stupid.cpp diff --git a/APIO/apio16_fireworks.cpp b/APIO/apio16_fireworks.cpp new file mode 100644 index 00000000..6271c297 --- /dev/null +++ b/APIO/apio16_fireworks.cpp @@ -0,0 +1,112 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; +typedef long long lint; +typedef long double llf; +typedef pair pi; +const lint inf = 1e16; + +int n, m, sz[250005]; +lint dep[250005], c[250005]; + +vector gph[250005]; + +struct func{ + priority_queue pq; + lint cost; + int slope; + void init(){ + cost = 0; + slope = -1; + pq.push(0); + pq.push(0); + } + void upperize(int x){ + cost += c[x]; + while(slope + (int)pq.size() > 1){ + pq.pop(); + } + vector v; + while(!pq.empty() && slope + (int)pq.size() >= 0){ + v.push_back(pq.top()); + pq.pop(); + } + while(!v.empty()){ + pq.push(v.back() + c[x]); + v.pop_back(); + } + } +}dp[250005]; + +bool cmp(int a, int b){ + return sz[a] > sz[b]; +} + +void dfs(int x){ + if(x > n){ + sz[x] = 1; + return; + } + for(int i=0; i n){ + dp[x].init(); + return x; + } + int ret = solve(gph[x][0]); + dp[ret].upperize(gph[x][0]); + for(int i=1; i> n >> m; + for(int i=2; i<=n+m; i++){ + int p; + scanf("%d %lld",&p,&c[i]); + gph[p].push_back(i); + } + dfs(1); + func ret = dp[solve(1)]; + ret.upperize(0); + lint ansp = ret.pq.top(); + lint ans = ret.cost + ansp * ret.slope; + while(!ret.pq.empty()){ + ans += ansp - ret.pq.top(); + ret.pq.pop(); + } + printf("%lld",ans); +} \ No newline at end of file diff --git a/BOI/boi09_candy.cpp b/BOI/boi09_candy.cpp new file mode 100644 index 00000000..051e2f22 --- /dev/null +++ b/BOI/boi09_candy.cpp @@ -0,0 +1,58 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; +typedef long long lint; +typedef long double llf; +typedef pair pi; + +int n; +pi a[100005]; +int ret[100005]; +int main(){ + cin >> n; + for(int i=0; i mp; + int pt = 0; + for(int i=0; isecond; + mp.erase(tmp); + mp[a[i].second] = pnt; + ret[i] = pnt; + } + } + printf("%d\n",pt); + for(int i=0; i pi; - + char str[155][155][155]; bool tab[155][155][155]; int p, q, r; + +int maxr[155][155][155]; +int h[155]; -int height[155][155]; - -int solve2(int n, int m){ +int maxrect(int n){ int ret = 0; + stack stk; for(int i=1; i<=n; i++){ - int h[151] = {}; - for(int j=1; j<=m; j++){ - int minp = 1e9; - for(int k=i; k; k--){ - minp = min(minp, height[k][j]); - if(h[j] + 1 <= minp){ - h[j]++; - } - else break; - } - } - stack stk; - for(int j=1; j<=m; j++){ - while(!stk.empty() && h[stk.top()] >= h[j]){ - int bk = stk.top(); - stk.pop(); - ret = max(ret, (j - 1 - (stk.empty() ? 0 : stk.top())) * h[bk]); - } - stk.push(j); - } - while(!stk.empty()){ - int bk = stk.top(); + while(!stk.empty() && h[stk.top()] >= h[i]){ + int l = stk.top(); stk.pop(); - ret = max(ret, (m - (stk.empty() ? 0 : stk.top())) * h[bk]); + int bef = (!stk.empty() ? stk.top() : 0); + ret = max(ret, (i - bef - 1) * h[l]); } + stk.push(i); } - return ret; -} - -int solve(int p, int q, int r){ - memset(height,0,sizeof(height)); - int ret = 0; - for(int i=1; i<=p; i++){ - for(int j=1; j<=q; j++){ - for(int k=1; k<=r; k++){ - height[j][k] = (tab[i][j][k] ? height[j][k] + 1 : 0); - } - } - ret = max(ret, solve2(q, r) * 4); + while(!stk.empty()){ + int l = stk.top(); + stk.pop(); + int bef = (!stk.empty() ? stk.top(): 0); + ret = max(ret, (n - bef) * h[l]); } return ret; } -int main(){ - scanf("%d %d %d",&q,&p,&r); - for(int i=1; i<=p; i++){ - for(int j=1; j<=q; j++){ - scanf("%s",str[i][j] + 1); - } - } +int solve(int p, int q, int r){ + memset(maxr, 0, sizeof(maxr)); for(int i=1; i<=p; i++){ for(int j=1; j<=q; j++){ for(int k=1; k<=r; k++){ - tab[i][j][k] = (str[i][j][k] == 'N'); + maxr[i][j][k] = min(min(maxr[i][j-1][k], maxr[i][j][k-1]), maxr[i][j-1][k-1]) + 1; + if(!tab[i][j][k]) maxr[i][j][k] = 0; } } } - int ret = solve(p, q, r); - memset(tab, 0, sizeof(tab)); + int ret = 0; for(int i=1; i<=q; i++){ for(int j=1; j<=r; j++){ for(int k=1; k<=p; k++){ - tab[i][j][k] = (str[k][i][j] == 'N'); - } - } - } - ret = max(ret, solve(q, r, p)); - memset(tab, 0, sizeof(tab)); - for(int i=1; i<=r; i++){ - for(int j=1; j<=p; j++){ - for(int k=1; k<=q; k++){ - tab[i][j][k] = (str[j][k][i] == 'N'); + h[k] = maxr[k][i][j]; } + ret = max(ret, maxrect(p) * 4); } } - ret = max(ret, solve(r, p, q)); - printf("%d",ret); + return ret; } + +int main(){ + scanf("%d %d %d",&q,&p,&r); + for(int i=1; i<=p; i++){ + for(int j=1; j<=q; j++){ + scanf("%s",str[i][j] + 1); + } + } + for(int i=1; i<=p; i++){ + for(int j=1; j<=q; j++){ + for(int k=1; k<=r; k++){ + tab[i][j][k] = (str[i][j][k] == 'N'); + } + } + } + int ret = solve(p, q, r); + memset(tab, 0, sizeof(tab)); + for(int i=1; i<=q; i++){ + for(int j=1; j<=r; j++){ + for(int k=1; k<=p; k++){ + tab[i][j][k] = (str[k][i][j] == 'N'); + } + } + } + ret = max(ret, solve(q, r, p)); + memset(tab, 0, sizeof(tab)); + for(int i=1; i<=r; i++){ + for(int j=1; j<=p; j++){ + for(int k=1; k<=q; k++){ + tab[i][j][k] = (str[j][k][i] == 'N'); + } + } + } + ret = max(ret, solve(r, p, q)); + printf("%d",ret); +} \ No newline at end of file diff --git a/BOI/boi09_stupid.cpp b/BOI/boi09_stupid.cpp new file mode 100644 index 00000000..01979029 --- /dev/null +++ b/BOI/boi09_stupid.cpp @@ -0,0 +1,7 @@ +#include + +int main(){ + int a, b; + scanf("%d %d",&a,&b); + printf("%d",a+b); +} \ No newline at end of file diff --git a/CEOI/ceoi11_teams.cpp b/CEOI/ceoi11_teams.cpp index 623112ba..db1de572 100644 --- a/CEOI/ceoi11_teams.cpp +++ b/CEOI/ceoi11_teams.cpp @@ -1,66 +1,77 @@ -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include -#include +#include +#include +#include +#include +#include +#include +#include +#include using namespace std; -typedef pair pi; +typedef long long lint; +typedef long double llf; +typedef pair pi; int n; pi a[1000005]; -int up[1000005]; -int dp2[1000005]; +int dp[1000005], ok[1000005], pref[1000005], opt[1000005], par[1000005]; -void track(int x){ - if(x == 0) return; - track(up[x]); - printf("%d ",x - up[x]); - for (int i=up[x]+1; i<=x; i++) { - printf("%d ",a[i].second); +int getans(int x){ + memset(ok, 0, sizeof(ok)); + ok[0] = 1; + for(int i=1; i<=n; i++){ + if(i - a[i].first < 0){ + dp[i] = -1e9; + } + else{ + dp[i] = pref[i - a[i].first] + 1; + if(opt[i - a[i].first] >= i - x) ok[i] = 1, par[i] = opt[i - a[i].first]; + } + pref[i] = pref[i-1]; + opt[i] = opt[i-1]; + if(ok[i] && pref[i] <= dp[i]){ + opt[i] = i; + pref[i] = dp[i]; + } } - puts(""); + return ok[n]; } -int dp_max[1000005], max_pos[1000005]; - -int trial(int x){ - for (int i=1; i dp_val + 1 || track < i - x) continue; - dp2[i] = dp_val + 1; - up[i] = track; - dp_max[i] = dp_val + 1; - max_pos[i] = i; - } - dp2[n] = -1e9; - for (int j=n-x; j<=n - a[n].first; j++) { - if(dp2[n] < dp2[j] + 1){ - dp2[n] = dp2[j] + 1; - up[n] = j; - } +void track(int x){ + if(x == 0) return; + int p = par[x]; + track(p); + printf("%d ",x - p); + for(int j=p+1; j<=x; j++){ + printf("%d ",a[j].second); } - return dp2[n]; + puts(""); } int main(){ - scanf("%d",&n); - for (int i=1; i<=n; i++) { + cin >> n; + for(int i=1; i<=n; i++){ scanf("%d",&a[i].first); a[i].second = i; } - sort(a+1,a+n+1); - int t = trial(n); - printf("%d\n",t); - int s = a[n].first, e = n; - while (s != e) { + sort(a+1, a+n+1); + int s = 1, e = n; + while(s != e){ int m = (s+e)/2; - if(trial(m) == t) e = m; + if(getans(m)) e = m; else s = m+1; } - // printf("%d\n",s); - trial(s); + getans(s); + printf("%d\n",dp[n]); track(n); } \ No newline at end of file diff --git a/IOI/ioi02_frog.cpp b/IOI/ioi02_frog.cpp index 9f92b4a0..d0605576 100644 --- a/IOI/ioi02_frog.cpp +++ b/IOI/ioi02_frog.cpp @@ -2,33 +2,33 @@ #include using namespace std; -int dp[5005][5005]; -int r,c,n; -int pan[5005][5005]; +int vis[5005][160]; +short pan[5005][5005]; +int r, c, n; int x[5005], y[5005]; int f(int pa, int p){ - if(dp[pa][p]) return dp[pa][p]; - int nx = 2 * x[p] - x[pa]; - int ny = 2 * y[p] - y[pa]; - if(nx <= 0 || ny <= 0 || nx > r || ny > c) return dp[pa][p] = 2; - if(pan[nx][ny] == 0) return dp[pa][p] = -1e9; - return dp[pa][p] = 1 + f(p,pan[nx][ny]); + vis[pa][p >> 5] |= (1 << (p & 31)); + int nx = 2 * x[p] - x[pa]; + int ny = 2 * y[p] - y[pa]; + if(nx <= 0 || ny <= 0 || nx > r || ny > c) return 2; + if(pan[nx][ny] == 0) return -1e9; + return 1 + f(p, pan[nx][ny]); } int main(){ - scanf("%d %d %d",&r,&c,&n); - for (int i=1; i<=n; i++) { - scanf("%d %d",&x[i],&y[i]); - pan[x[i]][y[i]] = i; - } - int res = 0; - for (int i=1; i<=n; i++) { - for (int j=1; j<=n; j++) { - int px = 2 * x[i] - x[j]; - int py = 2 * y[i] - y[j]; - if(px <= 0 || py <= 0) res = max(res,f(i,j)); - } - } - printf("%d",res == 2 ? 0 : res); + scanf("%d %d %d",&r,&c,&n); + for (int i=1; i<=n; i++) { + scanf("%d %d",&x[i],&y[i]); + pan[x[i]][y[i]] = i; + } + int res = 0; + for (int i=1; i<=n; i++) { + for (int j=1; j<=n; j++) { + int px = 2 * x[i] - x[j]; + int py = 2 * y[i] - y[j]; + if((px <= 0 || py <= 0) && (vis[i][j>>5]>>(j&31)) % 2 == 0) res = max(res, f(i, j)); + } + } + printf("%d",res == 2 ? 0 : res); } \ No newline at end of file