好久没打代码啦,今天lu一发百度之星,感觉还是学到不少东西的,写点收获。

第一题就是现在的HDU4831啦,题意很清楚,我一开始以为休息区也可以变为风景区,所以就不敢敲了,后来才得知数据里只会改风景区的,然后就有下面的思路。对于每个点我们用pre,post记录它前一个风景区和后一个风景区,对于每个休息区的热度,我们实际上只需要比较pre,post里哪个景点比较近,另外再开一个cnt数组记录每个风景区的点能到直接影响到的点的个数(其中不包括等距的点)。然后开一个树状数组去存热度为i的点有多少,每次更新lk,vk的时候,只需要将hot[lk]减去cnt[lk],然后修改hot[lk]再在hot[lk]上加上cnt[lk],但是有可能它前后的一些等距的点也会被更新,所以我们看pre[lk]和lk的中点是否存在,存在的话特别的更新一下,同样处理post[lk]. 但是好像本题能够直接模拟过掉,就是询问的时候扫一遍也可以,但是我感觉要是询问很多的时候会跪呀。。

第二题就是比赛的时候想了很久的题,没有思路,后来看了别人的代码才明白,纵向和横向是独立的,我们可以分开两个dp数组去记录横向走x步和纵向走k-x步有多少种走法,然后用组合数合起来就好.

最后一题我想应该很多人也是这样做的,先本地打表,然后上OEIS搜,果然搜到一个序列,然后经过对OEIS的资料进行分析就会发现,该数列的二次差分的数列an表示的是n有多少个奇数因子。然后不难发现如果能求出tau(n)(即n有多少个因子),那么就可以O(n)求出an。令我惊讶的是tau(n)居然能线性预处理,实在是太可怕了。。贴个链接以后好好学习http://blog.sina.com.cn/s/blog_82462ac30100y17u.html

到期末了,不能很舒心的欢乐的打代码了,要准备各科的复习了。。想想就觉得蛋疼。。

贴一下代码。

//HDU4831
#pragma warning(disable:4996)
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <map>
using namespace std; #define ll long long
#define maxn 100000
#define imp 1000000000
#define imp2 1000000001 int bit[maxn + 50]; void inc(int x, int val)
{
while (x <= maxn){
bit[x] += val;
x += x&(-x);
}
} int query(int x)
{
int ret = 0;
while (x > 0){
ret += bit[x];
x -= x&(-x);
}
return ret;
} int hot[10050];
int dis[10050];
int pre[10050];
int post[10050];
int cnt[10050];
map<int, int> mm; int n,m; int main()
{
int T; cin >> T; int ca = 0;
while (T--)
{
memset(cnt, 0, sizeof(cnt));
memset(pre, -1, sizeof(pre));
memset(post, -1, sizeof(post));
mm.clear();
memset(bit, 0, sizeof(bit));
scanf("%d", &n);
for (int i = 1; i <= n; i++){
scanf("%d%d", dis + i, hot + i);
mm[dis[i]] = i;
}
int mark = -1;
for (int i = 1; i <= n; i++){
if (hot[i] == 0){
pre[i] = mark;
}
else{
pre[i] = mark;
mark = i;
}
}
mark = -1;
for (int i = n; i >= 1; i--){
if (hot[i] == 0){
post[i] = mark;
}
else{
post[i] = mark;
mark = i;
}
}
for (int i = 1; i <= n; i++){
if (hot[i] == 0){
int dpre =imp , dpost = imp2;
if (pre[i] != -1) dpre = abs(dis[pre[i]] - dis[i]);
if (post[i] != -1) dpost = abs(dis[post[i]] - dis[i]);
if (dpre == dpost) {
inc(max(hot[pre[i]], hot[post[i]]), 1);
hot[i] = max(hot[pre[i]], hot[post[i]]);
}
else{
if (dpre >= imp && dpost >= imp){
inc(0, 1); continue;
}
if (dpre < dpost){
cnt[pre[i]]++;
inc(hot[pre[i]], 1);
}
else{
cnt[post[i]]++;
inc(hot[post[i]], 1);
}
}
}
else{
inc(hot[i], 1);
cnt[i]++;
}
}
scanf("%d", &m);
printf("Case #%d:\n", ++ca);
char s[5]; int lk, vk;
for (int i = 0; i < m; i++){
scanf("%s", s);
if (s[0] == 'Q'){
scanf("%d", &lk);
printf("%d\n", query(lk));
}
else{
scanf("%d%d", &lk, &vk); ++lk;
inc(hot[lk], -cnt[lk]);
hot[lk] = vk;
inc(hot[lk], cnt[lk]);
if (post[lk] != -1 && !((dis[lk] + dis[post[lk]]) & 1)){
int d = (dis[lk] + dis[post[lk]]) / 2;
if (mm.count(d)){
int id = mm[d];
inc(hot[id], -1);
hot[id] = max(hot[pre[id]], hot[post[id]]);
inc(hot[id], 1);
}
}
if (pre[lk] != -1 && !((dis[lk] + dis[pre[lk]]) & 1)){
int d = (dis[lk] + dis[pre[lk]]) / 2;
if (mm.count(d)){
int id = mm[d];
inc(hot[id], -1);
hot[id] = max(hot[pre[id]], hot[post[id]]);
inc(hot[id], 1);
}
}
}
}
}
return 0;
}
//HDU4832
#pragma warning(disable:4996)
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <map>
using namespace std; #define maxn 1200
#define ll long long
#define mod 9999991
using namespace std; int dp1[maxn][maxn];
int dp2[maxn][maxn];
int row[maxn];
int col[maxn];
int c[maxn][maxn]; int n, m, k, x, y; int main()
{
c[1][0] = c[1][1] = 1;
for (int i = 2; i <= maxn-1; i++){
for (int j = 0; j <= i; j++){
c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod;
}
}
int T; cin >> T; int ca = 0;
while (T--)
{
scanf("%d%d%d%d%d", &n, &m, &k, &x, &y);
memset(dp1, 0, sizeof(dp1));
memset(dp2, 0, sizeof(dp2));
memset(row, 0, sizeof(row));
memset(col, 0, sizeof(col));
dp1[0][x] = 1;
for (int i = 1; i <= k; i++){
for (int j = 1; j <= n; j++){
if (j - 2 >= 0) dp1[i][j] = (dp1[i][j] + dp1[i - 1][j - 2]) % mod;
(dp1[i][j] += ((dp1[i - 1][j - 1] + dp1[i - 1][j + 1]) % mod + dp1[i - 1][j + 2]) % mod) %= mod;
}
}
dp2[0][y] = 1;
for (int i = 1; i <= k; i++){
for (int j = 1; j <= m; j++){
if (j - 2 >= 0) dp2[i][j] = (dp2[i][j] + dp2[i - 1][j - 2]) % mod;
(dp2[i][j] += ((dp2[i - 1][j - 1] + dp2[i - 1][j + 1]) % mod + dp2[i - 1][j + 2]) % mod) %= mod;
}
}
for (int i = 0; i <= k; i++){
for (int j = 1; j <= n; j++){
row[i] = (row[i] + dp1[i][j]) % mod;
}
}
for (int i = 0; i <= k; i++){
for (int j = 1; j <= m; j++){
col[i] = (col[i] + dp2[i][j]) % mod;
}
}
ll ans = 0;
for (int i = 0; i <= k; i++){
ans = (ans + (ll)row[i] * col[k - i] % mod*c[k][i]%mod) % mod;
}
printf("Case #%d:\n", ++ca);
printf("%I64d\n", ans);
}
return 0;
}
//HDU4834
#pragma warning(disable:4996)
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <map>
using namespace std; #define N 10000050
#define ll long long
using namespace std; int prime[N], p;
int cnt[N];
int divv[N];
int odd[N];
bool iscomp[N]; void getCount()
{
for (int i = 2; i<N; i++)
{
if (iscomp[i] == false)
{
prime[p++] = i;
cnt[i] = 1;
divv[i] = 2;
}
for (int j = 0; j < p&&i*prime[j] < N; j++)
{
iscomp[i*prime[j]] = true;
if (i%prime[j] == 0)
{
divv[i*prime[j]] = divv[i] / (cnt[i] + 1)*(cnt[i] + 2);
cnt[i*prime[j]] = cnt[i] + 1;
break;
}
else
{
cnt[i*prime[j]] = 1;
divv[i*prime[j]] = divv[i] * divv[prime[j]];
}
}
}
divv[1] = 1;
} int a[N];
ll ans[N]; int main()
{
getCount();
for (int i = 1; i < N; i++){
int num = 0; int tmp = i;
while (tmp % 2 == 0){
tmp >>= 1; num++;
}
odd[i] = divv[i] / (num + 1);
}
for (int i = 1; i < N; i++){
a[i] = a[i - 1] + odd[i];
}
ll sum = 0;
for (int i = 1; i < N; i++){
ans[i] = 1 + i + sum;
sum += a[i];
}
int x;
int T; cin >> T; int ca = 0;
while (T--){
scanf("%d", &x);
printf("Case #%d:\n", ++ca);
printf("%I64d\n", ans[x]);
}
return 0;
}

HDU4831&&4832&&4834的更多相关文章

  1. 【leecode】小练习(简单8题)

    def twoSum(nums, target): """ 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[ ...

  2. HDU 4832(DP+计数问题)

    HDU 4832 Chess 思路:把行列的情况分别dp求出来,然后枚举行用几行,竖用几行.然后相乘累加起来就是答案 代码: #include <stdio.h> #include < ...

  3. 【BZOJ 4832 】 4832: [Lydsy2017年4月月赛]抵制克苏恩 (期望DP)

    4832: [Lydsy2017年4月月赛]抵制克苏恩 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 275  Solved: 87 Descripti ...

  4. hdu4831 Scenic Popularity(线段树)

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4831 题目大概意思就是有多个风景区和休息区,每个风景区有热度,休息区的热度与最接近的分景区的热度相同, ...

  5. HDU 4832 Chess (DP)

    Chess Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  6. hdu 4832 Chess(dp)

    Chess Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  7. hdu 4832 dp ***

    dp1[i][j]表示只走x轴走j步到i位置有多少总走法,dp2同,dp方程就很好写 wa了无数发,发现MOD写在INF上了 #include<cstdio> #include<io ...

  8. HDU 4834 JZP Set(数论+递推)(2014年百度之星程序设计大赛 - 初赛(第二轮))

    Problem Description 一个{1, ..., n}的子集S被称为JZP集,当且仅当对于任意S中的两个数x,y,若(x+y)/2为整数,那么(x+y)/2也属于S.例如,n=3,S={1 ...

  9. HDU 4832 Chess(DP+组合数学)(2014年百度之星程序设计大赛 - 初赛(第二轮))

    Problem Description 小度和小良最近又迷上了下棋.棋盘一共有N行M列,我们可以把左上角的格子定为(1,1),右下角的格子定为(N,M).在他们的规则中,“王”在棋盘上的走法遵循十字路 ...

随机推荐

  1. Python学习教程(learning Python)--2.2.2 Python全局和局部变量

    Python的变量也有全局和局部变量之分. 1. 局部变量 用在子函数里的变量称之为局部变量,其生命周期为该函数执行周期,即函数执行完后变量即不存在.由于局部变量和某个函数直接相关,故不同子函数里可以 ...

  2. 263. Ugly Number

    Write a program to check whether a given number is an ugly number. Ugly numbers are positive numbers ...

  3. EMVTag系列1《数据分组》

    数据分组的设计在个人化过程中承担着重要的作用.数据分组标识符(DGI)是两字节十六进制数.数据分组标识的第一个字节等于'01'到'1E',表明数据存储的SFI.第二个字节表明SFI记录的记录编号.其他 ...

  4. 【转】Oracle中如何用一条SQL快速生成10万条测试数据

    转自http://blog.csdn.net/welken/article/details/4971887   做数据库开发或管理的人经常要创建大量的测试数据,动不动就需要上万条,如果一条一条的录入, ...

  5. AngularJS与RequireJS集成方案

    关于angularjs.requirejs的基础知识请自行学习 一.简单事例的项目目录如下: -index.html -scripts文件夹 --controller文件夹 --- mianContr ...

  6. asp.net web.config 经典模式和集成模式相关配置

    <?xml version="1.0"?> <configuration> <!--IIS经典模式下使用--> <system.web&g ...

  7. 从一个Activity返回上一个Activity

    从一个Activity返回上一个Activity 要求:保留上一个Activity的数据 方法: 第一步:从Activity1转向Activity2时,用startActivityForResult而 ...

  8. Kibana4学习<一>

    Kibana4 安装方式依然简单,你可以在几分钟内安装好 Kibana 然后开始探索你的 Elasticsearch 索引.只需要预备: Elasticsearch 1.4.4 或者更新的版本 一个现 ...

  9. 原生javascript开发仿微信打飞机小游戏

    今天闲来无事,于是就打算教一个初学javascript的女童鞋写点东西,因此为了兼顾趣味性与简易程度,果断想到了微信的打飞机小游戏.. 本来想用html5做的,但是毕竟人家才初学,连jquery都还不 ...

  10. 自定义右键菜单,禁用浏览器自带的右键菜单[右键菜单实现--Demo]

    许多从事Web开发的会发现有些事,我们需要禁用浏览器本事自带的右键菜单,而实现自定义的右键菜单下面我们也来实现一个自定义的右键菜单 首先来创建JSP页面 <%@ page language=&q ...