Skip to content

Commit

Permalink
20160529
Browse files Browse the repository at this point in the history
  • Loading branch information
Jaehyun Koo authored and Jaehyun Koo committed May 29, 2016
1 parent cd19a5f commit 759719a
Show file tree
Hide file tree
Showing 6 changed files with 316 additions and 130 deletions.
112 changes: 112 additions & 0 deletions APIO/apio16_fireworks.cpp
@@ -0,0 +1,112 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <limits.h>
#include <math.h>
#include <time.h>
#include <iostream>
#include <functional>
#include <numeric>
#include <algorithm>
#include <stack>
#include <queue>
#include <deque>
#include <vector>
#include <string>
#include <bitset>
#include <map>
#include <set>
using namespace std;
typedef long long lint;
typedef long double llf;
typedef pair<int, int> pi;
const lint inf = 1e16;

int n, m, sz[250005];
lint dep[250005], c[250005];

vector<int> gph[250005];

struct func{
priority_queue<lint> 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<lint> 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<gph[x].size(); i++){
dep[gph[x][i]] = dep[x] + c[gph[x][i]];
dfs(gph[x][i]);
sz[x] += sz[gph[x][i]];
}
sort(gph[x].begin(), gph[x].end(), cmp);
}

int solve(int x){
if(x > n){
dp[x].init();
return x;
}
int ret = solve(gph[x][0]);
dp[ret].upperize(gph[x][0]);
for(int i=1; i<gph[x].size(); i++){
int t = solve(gph[x][i]);
dp[t].upperize(gph[x][i]);
dp[ret].cost += dp[t].cost;
dp[ret].slope += dp[t].slope;
while(!dp[t].pq.empty()){
dp[ret].pq.push(dp[t].pq.top());
dp[t].pq.pop();
}
}
return ret;
}

int main(){
cin >> 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);
}
58 changes: 58 additions & 0 deletions BOI/boi09_candy.cpp
@@ -0,0 +1,58 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <limits.h>
#include <math.h>
#include <time.h>
#include <iostream>
#include <functional>
#include <numeric>
#include <algorithm>
#include <stack>
#include <queue>
#include <deque>
#include <vector>
#include <string>
#include <bitset>
#include <map>
#include <set>
using namespace std;
typedef long long lint;
typedef long double llf;
typedef pair<int, int> pi;

int n;
pi a[100005];
int ret[100005];
int main(){
cin >> n;
for(int i=0; i<n; i++){
int s, t;
scanf("%d %d",&s, &t);
a[i] = pi(t+s, t-s);
}
sort(a, a+n);
map<int, int> mp;
int pt = 0;
for(int i=0; i<n; i++){
auto tmp = mp.upper_bound(a[i].second);
if(tmp == mp.begin()){
mp[a[i].second] = ++pt;
ret[i] = pt;
}
else{
tmp--;
int pnt = tmp->second;
mp.erase(tmp);
mp[a[i].second] = pnt;
ret[i] = pnt;
}
}
printf("%d\n",pt);
for(int i=0; i<n; i++){
lint s = (1ll * a[i].first - 1ll * a[i].second) / 2;
lint t = a[i].first - s;
printf("%lld %lld %d\n",s, t, ret[i]);
}
}
122 changes: 60 additions & 62 deletions BOI/boi09_monument.cpp
Expand Up @@ -20,91 +20,89 @@ using namespace std;
typedef long long lint;
typedef long double llf;
typedef pair<int, int> 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<int> 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<int> 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);
}
7 changes: 7 additions & 0 deletions BOI/boi09_stupid.cpp
@@ -0,0 +1,7 @@
#include <cstdio>

int main(){
int a, b;
scanf("%d %d",&a,&b);
printf("%d",a+b);
}

0 comments on commit 759719a

Please sign in to comment.