BZOJ2216【决策单调性】

通过这题学习了决策单调性.顺便学习了wmg_1001【科学】的代码风格.

/* I will wait for you */  
  
#include <cstdio>  
#include <cstdlib>  
#include <cstring>  
#include <cmath>  
#include <ctime>  
#include <algorithm>  
#include <iostream>  
#include <fstream>  
#include <vector>  
#include <queue>  
#include <deque>  
#include <set>  
#include <map>  
#include <string>  
#define make make_pair  
#define fi first  
#define se second  
  
using namespace std;  
  
typedef long long LL;  
typedef unsigned long long ULL;  
typedef pair<int, int> PII;  
  
const int maxn = 500010;  
const int maxm = 1000;  
const int maxs = 100;  
const int INF = 1 << 29;  
const int P = 1000000007;  
const double error = 1e-9;  

inline int read() {
	int x = 0,f = 1;
	char ch = getchar();
	while (ch < '0' || ch > '9') {
		f = (ch == '-' ? -1 : 1);
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9') {
		x = x * 10 + ch - '0';
		ch = getchar();
	}
	return x * f;
}
  
struct policy {
	int pos, l, r;
} q[maxn];
  
int n, a[maxn];
double f[maxn], g[maxn];
  
double cal(int x, int y) {
	return a[x] + sqrt(abs(x - y)) - a[y];
}

double fac(int x, int y, int z) {
	return cal(x, z) > cal(y, z);
}

int binary(int x, policy a) {
	int y = a.pos;
	int l = a.l, r = a.r;
	
	while (l <= r) {
		int mid = (l + r) / 2;
		if (fac(x, y ,mid)) r = mid - 1;
		else l = mid + 1;
	}
	
	return l;
}

void dp(double *ans) {
	int head = 1, tail = 0;
	
	for (int i = 0; i < n; i++) {
		q[head].l++;
		if (head <= tail && q[head].l > q[head].r) head++;
		
		if (head > tail || fac(i, q[head].pos, n - 1)) {
			
			while (head <= tail && fac(i, q[tail].pos, q[tail].l)) tail--;
			
			if (head > tail) q[++tail] = (policy) {i, i, n};
			
			else {
				int mid = binary(i, q[tail]);
				q[tail].r = mid - 1;
				q[++tail] = (policy) {i, mid, n};
			}
		}
		
		ans[i] = max(ans[i], cal(q[head].pos, i));
	}
}

int main() {  
	n = read();
	for (int i = 0; i < n; i++) a[i] = read();
	
	dp(f);
	for (int i = 0; i < n / 2; i++) swap(a[i], a[n - i - 1]);
	dp(g);

	for (int i = 0; i < n; i++) {
		double ans = max(f[i], g[n - i - 1]);
		ans = max(ans, 0.0);
		printf("%d\n", (int) ceil(ans));
	}
	
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BZOJ 2908 题目是一个数据下载任务。这个任务要求下载指定的数据文件,并统计文件中小于等于给定整数的数字个数。 为了完成这个任务,首先需要选择一个合适的网址来下载文件。我们可以使用一个网络爬虫库,如Python中的Requests库,来帮助我们完成文件下载的操作。 首先,我们需要使用Requests库中的get()方法来访问目标网址,并将目标文件下载到我们的本地计算机中。可以使用以下代码实现文件下载: ```python import requests url = '目标文件的网址' response = requests.get(url) with open('本地保存文件的路径', 'wb') as file: file.write(response.content) ``` 下载完成后,我们可以使用Python内置的open()函数打开已下载的文件,并按行读取文件内容。可以使用以下代码实现文件内容读取: ```python count = 0 with open('本地保存文件的路径', 'r') as file: for line in file: # 在这里实现对每一行数据的判断 # 如果小于等于给定整数,count 加 1 # 否则,不进行任何操作 ``` 在每一行的处理过程中,我们可以使用split()方法将一行数据分割成多个字符串,并使用int()函数将其转换为整数。然后,我们可以将该整数与给定整数进行比较,以判断是否小于等于给定整数。 最后,我们可以将统计结果打印出来,以满足题目的要求。 综上所述,以上是关于解决 BZOJ 2908 数据下载任务的简要步骤和代码实现。 希望对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值