HDU4831&&4832&&4834
好久没打代码啦,今天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的更多相关文章
- 【leecode】小练习(简单8题)
def twoSum(nums, target): """ 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[ ...
- HDU 4832(DP+计数问题)
HDU 4832 Chess 思路:把行列的情况分别dp求出来,然后枚举行用几行,竖用几行.然后相乘累加起来就是答案 代码: #include <stdio.h> #include < ...
- 【BZOJ 4832 】 4832: [Lydsy2017年4月月赛]抵制克苏恩 (期望DP)
4832: [Lydsy2017年4月月赛]抵制克苏恩 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 275 Solved: 87 Descripti ...
- hdu4831 Scenic Popularity(线段树)
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4831 题目大概意思就是有多个风景区和休息区,每个风景区有热度,休息区的热度与最接近的分景区的热度相同, ...
- HDU 4832 Chess (DP)
Chess Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- hdu 4832 Chess(dp)
Chess Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- hdu 4832 dp ***
dp1[i][j]表示只走x轴走j步到i位置有多少总走法,dp2同,dp方程就很好写 wa了无数发,发现MOD写在INF上了 #include<cstdio> #include<io ...
- 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 ...
- HDU 4832 Chess(DP+组合数学)(2014年百度之星程序设计大赛 - 初赛(第二轮))
Problem Description 小度和小良最近又迷上了下棋.棋盘一共有N行M列,我们可以把左上角的格子定为(1,1),右下角的格子定为(N,M).在他们的规则中,“王”在棋盘上的走法遵循十字路 ...
随机推荐
- Linux内核学习笔记——VFS
概念: ①硬链接:若一个 inode 号对应多个文件名,则称这些文件为硬链接.即硬链接就是同一个文件使用了多个别名.硬链接可由命令 link 或 ln 创建. 其特性: 文件有相同的 inode 及 ...
- spring与mysql整合数据源的配置
需要解决两点,数据源的配置交给spring完成,事务管理交个spring来管理. <context:property-placeholder location="classpath:c ...
- Percona-Xtrabackup 2.3.3 慢查询不再堵塞备份(一)
在Percona-Xtrabackup 2.3.3[root@b28-19-17 bak]# rpm -q percona-xtrabackuppercona-xtrabackup-2.3.3-1.e ...
- 详谈 oracle 索引 (笔记)
1.oracle索引空值问题 当在有空值得列上建立单列索引时,如果搜索条件为 is null 在解释计划中可以看到,对于此列oracle并没有使用索引查询: 但是当建立的是多列索引是,就会按照索引来进 ...
- Windows PowerShell ISE
Windows PowerShell 集成脚本环境 (ISE) 是 Windows PowerShell 的主机应用程序.在 Windows PowerShell ISE 中,可以在单一 Window ...
- 怎么解决/bin/sh: arm-linux-gcc: not found make
1.arm-linux-gcc 环境变量没有设,所以找不到这个编译器 在/etc/profile里添加arm-linux-gcc的存放路径 sudo -s gedit /etc/profile 编 ...
- 2015年iOS测试现状
本文由 伯乐在线 - nathanw 翻译,dopcn 校稿.未经许可,禁止转载! 英文出处:www.mokacoding.com.欢迎加入翻译小组. 几周前,我决定将将我在 mokacoding 上 ...
- RSA和DES------加密和解密类
public class CryptogramUtil { //******************************************************************** ...
- [uwp开发]数据绑定那些事(2)
接着上一篇来侃. 二.实体到控件之间的绑定 这儿不知道用实体这个词恰不恰当,凑活着理解就行了.他可以是一个类实例,也可以是一个集合. 所以,相应的我们就引入两个Demo,第一个介绍用简单的类作为作为数 ...
- jQuery多库共存处理
jQuery多库共存处理(来自慕课网) 多库共存换句话说可以叫无冲突处理. 总的来说会有2种情况会遇到: 1.$太火热,jQuery采用$作为命名空间,不免会与别的库框架或者插件相冲突. 2.jQue ...