代码附在文末.

多组数据一定要初始化啊啊啊

贪心要[大胆]猜想,小心证明


A

题目翻译

题目描述

有两个正整数A和B,两个操作+3或者-2。

问,至少多少次操作可以让A变到B

输入

多组数据,第一行一个整数T(1<=T<=5)

两个整数A和B(1<=A,B<=100)

输出

最少操作次数

样例输入

3
10 14
23 23
18 12

样例输出

3
0
3

Solution

多种做法, 是一道有趣的题.

最方便的做法是 \(A<B\) 就 \(+3\), \(A>B\) 就 \(-2\), 贪心的合理性显然可证.

至于我是类似的方法只是讨论了 A 和 B 的大小关系,手动算了一下.

考试时候神奇地把 \(A-B\) 写成了 \(B-A\) emm.


B

题目翻译

题目描述

有一个N*M的迷宫,每个格子是空地或者障碍,现在从一个起点出发,共有2中操作。

  1. 沿着上、下、左、右4个方向走到相邻的空地上,时间是1
  2. 沿着上下左右4个方向,跨越障碍,跳到最近的空地上,时间是2

    问,从起点到终点最少的时间。如果不能到达输出-1

输入

多组数据,第一行一个整数T(1<=T<=10)

第一行两个整数N和M(1<=N,M<=50),表示地图的大小

接下来N行,每行M个字符,仅包含两种字符“.”和“#”,分别表示空地和障碍

接下来4个整数r1、c1、r2、c2,表示起点和终点的行列。

起点终点保证唯一,且都是空地。

输出

从起点到终点最少时间。

样例输入

2
4 4
.##.
.###
.###
....
0 0 3 3
2 2
#.
.#
0 1 1 0

样例输出

4
-1

Solution

SPFA/Dijkstra最短路直接跑啊,

这种弱鸡题目我也会做我真是无话可说.

注意多组数据的初始化处理.


C

题目翻译

题目描述

我们称一个序列A中的某一个数为重数,当且仅当该数在序列中出现的次数超过序列长度的一半。

例如:序列{1,2,1}中,1就是重数。而在序列{1,2,3}和{1,2,1,3}中都不存在重数。

现在给定一个包含n个元素的序列A,每个元素为整数,范围在[0,m-1]。你的任务是统计出包含重数的子区间共有多少个。

由于出题人不想生成大文件。。。输入数据有3个整数构成,分别为n,seed和m。出题人告诉你用如下方法生成数据:

for i = 0 .. n-1:
A[i] = (seed div 2^16) modulo m
seed = (seed * 1103515245 + 12345) modulo 2^31

其中:div表示整除;^表示乘幂;modulo 表示取模

输入

三个整数n(1<=n<=10^5), seed(0<=seed<=2^31-1), m(1<=m<=50)

输出

输出生成的序列中,包含重数的子区间数量

样例输入

5
200
5 10
15
3 8
12345678
1

样例输出

8

23

36

提示

样例1解释

A = {0, 0, 1, 2, 0},包含1个元素的子区间有5个

剩下三个分别为{0, 0}、{0, 0, 1}、{0, 0, 1, 2, 0}.

Solution

这是一类典型的数列题; 不妨先考虑 \(O(n^2)\) 的做法;

因为 m 较小, 不妨把每种元素值看做颜色.

首先显然每个区间 最多只有 1 个重数, 我们可以分别考虑每种颜色对答案的贡献.

对于每种颜色, 显然我们需要枚举 两端 后在 \(O(1)\) 时间复杂度内判断该区间是否有 "重数".

可以用 前缀和 优化, 用 cnt[col][i] 表示前 i 个元素中颜色 col 出现的个数, 那么区间 [l,r] 中颜色 col 是重数的条件就是:

\[ cnt[col][r] - cnt[col][l-1] > \frac {r - l + 1}{2}
\]

移项后得到:

\[ 2cnt[l-1]-l \leq 2cnt[r] - r - 2
\]

那么枚举右端点 \(i\) 后只要统计有多少个 \(1 \leq j < i\) 满足 \(2cnt[j-1] - j \leq 2cnt[r] - r - 2\) 即可, 这个操作可以中 树状数组/线段树 在 \(O(n log n)\) 时间内求解.

这道题还有另外一种做法: 对于每种颜色, 把该颜色的点的值赋为 1, 其它颜色点的值fuw赋为 -1, 那么问题就转化为了查找有多少区间内数字的和大于0, 前缀和操作枚举右端点也可以用树状数组维护.这种方法常数更小(因为维护值的范围是原来的2/3).

我这个蒟蒻成功的又没有初始化树状数组...

参考代码

A

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std; int A, B;
const int cost1[3] = {0, 2, 4};
const int cost2[2] = {0, 3}; int main(){
int T; scanf("%d", &T);
while (T--){
scanf("%d%d", &A, &B);
if (A < B) printf("%d\n", (B - A) / 3 + cost1[(B-A) % 3]);
else printf("%d\n", (A - B) / 2 + cost2[(A-B) % 2]);
}
return 0;
}

B

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define pii pair<int,int>
using namespace std; const int INF = 10000000;
const int maxn = 55;
int T, n, m, r1, c1, r2, c2;
char mat[maxn][maxn];
int edgenum, head[maxn * maxn], vet[200007], nxt[200007], val[200007];
inline void addedge(int u, int v, int w){
++edgenum;
vet[edgenum] = v;
val[edgenum] = w;
nxt[edgenum] = head[u];
head[u] = edgenum;
} inline int id(int x, int y){
return x * m + y;
} int up[maxn][maxn], left[maxn][maxn];
inline void pre(){
for (int i = 0; i < m; ++i)
up[0][i] = (mat[0][i] == '.') ? 0 : INF;
for (int i = 0; i < n; ++i)
left[i][0] = (mat[i][0] == '.') ? 0 : INF; for (int i = 1; i < n; ++i)
for (int j = 0; j < m; ++j)
up[i][j] = (mat[i][j] == '.') ? 0 : (up[i-1][j] + 1);
for (int i = 0; i < n; ++i)
for (int j = 1; j < m; ++j)
left[i][j] = (mat[i][j] == '.') ? 0 : (left[i][j-1] + 1);
} const int dx[4] = {1, 0, 0, -1};
const int dy[4] = {0, 1, -1, 0};
inline void build(){
memset(head, 0, sizeof(head));
edgenum = 0;
for (int x = 0; x < n; ++x)
for (int y = 0; y < m; ++y){
if (mat[x][y] == '#') continue;
for (int k = 0; k < 4; ++k){
int xx = x + dx[k], yy = y + dy[k];
if (xx >= 0 && xx < n && yy >= 0 && yy < m){
if (mat[xx][yy] == '.') addedge(id(x,y), id(xx,yy), 1);
else{
if (up[xx][yy] < INF){
addedge(id(x,y), id(x - up[xx][yy] - 1, y), 2);
addedge(id(x - up[xx][yy] - 1, y), id(x,y), 2);
}
if (left[xx][yy] < INF){
addedge(id(x, y), id(x, y - left[xx][yy] - 1), 2);
addedge(id(x, y - left[xx][yy] - 1), id(x, y), 2);
}
}
}
}
}
} int dist[maxn * maxn]; bool vis[maxn * maxn];
priority_queue< pii, vector< pii >, greater< pii > >Qmin;
inline void Dijkstra(int s){
for (int i = 0; i <= id(n, m); ++i){
dist[i] = INF;
vis[i] = false;
}
dist[s] = 0; Qmin.push( make_pair(0, s) );
for (int i = 0; i <= id(n, m); ++i){
while (!Qmin.empty() && vis[Qmin.top().second]) Qmin.pop();
if (Qmin.empty()) break;
int u = Qmin.top().second; Qmin.pop();
vis[u] = true;
for (int e = head[u]; e; e = nxt[e]){
int v = vet[e], w = val[e];
if (dist[v] > dist[u] + w){
dist[v] = dist[u] + w;
Qmin.push(make_pair(dist[v], v));
}
}
}
} int main(){
scanf("%d", &T);
while (T--){
scanf("%d%d", &n, &m);
for (int i = 0; i < n; ++i)
scanf("%s", mat[i]);
scanf("%d%d%d%d", &r1, &c1, &r2, &c2); pre();
build();
Dijkstra(id(r1,c1)); if (dist[id(r2,c2)] < INF) printf("%d\n", dist[id(r2,c2)]);
else printf("-1\n");
}
return 0;
}

C

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll; const int maxn = 100007;
const int delta = 100001;
const int maxval = 300005;
int a[maxn], cnt[maxn];
int n, seed, m;
ll Ans; int C[maxn * 3];
inline int lowbit(int x){return x & (-x);}
inline void add(int i, int x){
i = i + delta;
for (; i <= maxval; i += lowbit(i))
C[i] += x;
}
inline int sum(int i){
i = i + delta;
if (i < 1) return 0;
int res = 0;
for (; i >= 1; i -= lowbit(i))
res += C[i];
return res;
} int main(){
scanf("%d%d%d", &n, &seed, &m);
for (int i = 1; i <= n; ++i){
a[i] = seed / (1 << 16) % m;
seed = ((ll)seed * 1103515245 + 12345) % (1LL << 31);
//printf("%d\n", a[i]);
} Ans = 0; for (int col = 0; col < m; ++col){
memset(C, 0, sizeof(C)); cnt[0] = 0;
for (int i = 1; i <= n; ++i)
cnt[i] = cnt[i-1] + (a[i] == col); add(-1, 1);
for (int i = 1; i <= n; ++i){
Ans += sum(cnt[i] * 2 - i - 2);
//if (col <= 2)printf("%d %d\n", col, sum(cnt[i] * 2 - i - 2));
add(cnt[i]*2-i-1, 1);
}
} printf("%lld\n", Ans);
return 0;
}

TopCoder Div2的更多相关文章

  1. Topcoder Srm 673 Div2 1000 BearPermutations2

    \(>Topcoder \space Srm \space 673 \space Div2 \space 1000 \space BearPermutations2<\) 题目大意 : 对 ...

  2. Topcoder Srm 671 Div2 1000 BearDestroysDiv2

    \(>Topcoder \space Srm \space 671 \space Div2 \space 1000 \space BearDestroysDiv2<\) 题目大意 : 有一 ...

  3. 记第一次TopCoder, 练习SRM 583 div2 250

    今天第一次做topcoder,没有比赛,所以找的最新一期的SRM练习,做了第一道题. 题目大意是说 给一个数字字符串,任意交换两位,使数字变为最小,不能有前导0. 看到题目以后,先想到的找规律,发现要 ...

  4. 求拓扑排序的数量,例题 topcoder srm 654 div2 500

    周赛时遇到的一道比较有意思的题目: Problem Statement      There are N rooms in Maki's new house. The rooms are number ...

  5. Topcoder srm 632 div2

    脑洞太大,简单东西就是想复杂,活该一直DIV2; A:水,基本判断A[I]<=A[I-1],ANS++; B:不知道别人怎么做的,我的是100*N*N;没办法想的太多了,忘记是连续的数列 我们枚 ...

  6. TopCoder 603 div1 & div2

    div2 250pts MiddleCode 题意:s串长度为奇数时,将中间字符取掉并添加到t末尾:长度为偶数时,将中间两个较小的字符取掉并添加到末尾. 分析:直接做,学习了一下substr(s, p ...

  7. TopCoder 649 div1 & div2

    最近一场TC,做得是在是烂,不过最后challenge阶段用一个随机数据cha了一个明显错误的代码,最后免于暴跌rating,还涨了一点.TC题目质量还是很高的,非常锻炼思维,拓展做题的视野,老老实实 ...

  8. topcoder SRM 628 DIV2 BracketExpressions

    先用dfs搜索所有的情况,然后判断每种情况是不是括号匹配 #include <vector> #include <string> #include <list> # ...

  9. topcoder SRM 628 DIV2 BishopMove

    题目比较简单. 注意看测试用例2,给的提示 Please note that this is the largest possible return value: whenever there is ...

随机推荐

  1. [jzoj]4271. 【NOIP2015模拟10.27】魔法阵(37种转移的dp)

    题意不说 应该这辈子都不会忘记了... 这是我人生中做的最SB的一道DP题. 真的打的我心态崩了.... 可是竟然被我调出来了..... 也是没谁了... 我们设\(F[i][j][S]\)表示到第\ ...

  2. 分布式监控系统开发【day37】:填充表配置项目(三)

    一.注册站点初始化数据库 1.目录结构 2.初始化数据库 python3 manage.py makemigrations python3 manage.py migrate #django2.0之前 ...

  3. 分布式监控系统开发【day38】:报警阈值程序逻辑解析(三)

    一.需求讨论 1.请问如何解决延迟问题 1000台机器,每1分钟循环一次但是刚好第一次循环第一秒刚处理完了,结果还没等到第二分钟又出问题,你那必须等到第二次循环,假如我这个服务很重要必须实时知道,每次 ...

  4. 盒子显隐,伪类边框,盒子阴影,2d平面形变

    -盒子显隐 显隐的盒子尽量不影响其他盒子的布局 display:none; 消失的时候不占位置,显示的时候占位 opacity:0-1; 盒子透明度 overflow: hidden; 超出部分隐藏 ...

  5. html - 表单form

    一.表单 功能:表单用于向服务器传输数据,从而实现用户与Web服务器的交互 表单能够包含input系列标签,比如文本字段.复选框.单选框.提交按钮等等. 表单还可以包含textarea.select. ...

  6. Java 基础知识点

    很多 Java 基础的东西都忘记了, 有必要再复习一些基本的知识点. 本文主要参考 https://github.com/Snailclimb/JavaGuide ================== ...

  7. 【Unity]】AR小工具-Vuforia

    很有意思的增强现实玩具,六分钟应用. https://www.youtube.com/watch?v=khavGQ7Dy3c

  8. JAVA写JSON的三种方法,java对象转json数据

    JAVA写JSON的三种方法,java对象转json数据 转自:http://www.xdx97.com/#/single?bid=5afe2ff9-8cd1-67cf-e7bc-437b74c07a ...

  9. python数据结构之堆(heap)

    本篇学习内容为堆的性质.python实现插入与删除操作.堆复杂度表.python内置方法生成堆. 区分堆(heap)与栈(stack):堆与二叉树有关,像一堆金字塔型泥沙:而栈像一个直立垃圾桶,一列下 ...

  10. Djangol里面MVT的原理

    MVT Django是一款python的web开发框架与MVC有所不同,属于MVT框架m表示model,负责与数据库交互v 表示view,是核心,负责接收请求.获取数据.返回结果t 表示templat ...