Educational Codeforces Round 41 A B C D E
A. Tetris
题意
俄罗斯方块,问能得多少分。
思路
即求最小值
Code
#include <bits/stdc++.h>
#define F(i, a, b) for (int i = (a); i < (b); ++i)
#define F2(i, a, b) for (int i = (a); i <= (b); ++i)
#define dF(i, a, b) for (int i = (a); i > (b); --i)
#define dF2(i, a, b) for (int i = (a); i >= (b); --i)
using namespace std;
typedef long long LL;
#define maxn 1010
int cnt[maxn];
int main() {
int n,m,x;
scanf("%d%d", &n, &m);
F(i, 0, m) {
scanf("%d", &x);
++cnt[x];
}
int ans = m;
F2(i ,1, n) ans = min(ans, cnt[i]);
printf("%d\n", ans);
return 0;
}
B. Lecture Sleep
题意
一节课共\(n\)秒,\(t_i=1\)当且仅当小明在第\(i\)秒会打盹,小明能学习到\(a_i\)个知识点当且仅当他在第\(i\)秒不打盹。
现在有一种魔法能让小明连续\(k\)秒不打盹,但只能使用一次,要求最大化小明能学习到的知识点个数。
思路
计算两个前缀和,枚举使用魔法的开始时刻借助前缀和\(O(1)\)计算对应的收益。
时间复杂度:\(O(n)\).
// 菜菜我被条件表达式实力坑了一波,切记切记它的优先级相当低,低于算术运算,低于位运算,低于逻辑运算,切记切记加括号加括号。
Code
#include <bits/stdc++.h>
#define F(i, a, b) for (int i = (a); i < (b); ++i)
#define F2(i, a, b) for (int i = (a); i <= (b); ++i)
#define dF(i, a, b) for (int i = (a); i > (b); --i)
#define dF2(i, a, b) for (int i = (a); i >= (b); --i)
#define maxn 100010
using namespace std;
typedef long long LL;
LL a[maxn], pre[maxn], pre2[maxn];
int main() {
int n, k;
scanf("%d%d", &n, &k);
F2(i, 1, n) {
scanf("%I64d", &a[i]);
pre[i] = pre[i-1] + a[i];
}
F2(i, 1, n) {
int t = 0;
scanf("%d", &t);
pre2[i] = pre2[i-1] + (t?a[i]:0);
}
LL ans = 0;
F2(i, 1, n-k+1) {
ans = max(ans, pre2[i-1]-pre2[0]+pre2[n]-pre2[i+k-1]+pre[i+k-1]-pre[i-1]);
}
printf("%I64d\n", ans);
return 0;
}
C. Chessboard
题意
一个合法的棋盘中,相邻格子的颜色(黑、白)不同。
现在一个\(2n\times2n\)的棋盘碎成了四块\(n\times n\)的棋盘,并且有一些格子的颜色发生了变化。
要求将它拼起来,并且修改最少格子的颜色,得到一个合法的棋盘。
思路
将棋盘拼起来有\(4!=24\)种方案,对每种方案去计算一个数目,最后取最小值。
注意到,合法的棋盘只可能有两种,且由左上角的格子唯一确定。
所以对每种方案去计算数目的只需要与这两种棋盘对比,取最小。
时间复杂度:\(O(48n^2)\)
Code
#include <bits/stdc++.h>
#define F(i, a, b) for (int i = (a); i < (b); ++i)
#define F2(i, a, b) for (int i = (a); i <= (b); ++i)
#define dF(i, a, b) for (int i = (a); i > (b); --i)
#define dF2(i, a, b) for (int i = (a); i >= (b); --i)
#define maxn 110
#define maxm 210
using namespace std;
typedef long long LL;
char s[maxn];
int n;
bool b[maxm][maxm], st1[maxm][maxm], st2[maxm][maxm];
struct board {
int c[maxn][maxn];
}a[4];
void concat(int x1,int x2,int x3,int x4) {
F(i, 0, n) F(j, 0, n) b[i][j] = a[x1].c[i][j];
F(i, n, n<<1) F(j,0,n) b[i][j] = a[x2].c[i-n][j];
F(i, 0, n) F(j, n, n<<1) b[i][j] = a[x3].c[i][j-n];
F(i, n, n<<1) F(j, n, n<<1) b[i][j] = a[x4].c[i-n][j-n];
int m = n<<1;
}
void init() {
int m=n<<1;
F(i, 0, m) F(j, 0, m) st1[i][j] = (i+j)&1, st2[i][j] = !st1[i][j];
}
int work() {
int m = n<<1, ret1=0, ret2=0;
F(i, 0, m) F(j, 0, m) ret1 += st1[i][j]!=b[i][j];
F(i, 0, m) F(j, 0, m) ret2 += st2[i][j]!=b[i][j];
return min(ret1, ret2);
}
int main() {
scanf("%d", &n);
init();
F(i, 0, 4) {
F(j, 0, n) {
scanf("%s", s);
F(k, 0, n) a[i].c[j][k] = s[k]=='1'?1:0;
}
}
int ans = n*n*4;
F(x1,0,4) {
F(x2,0,4) {
if (x2==x1) continue;
F(x3,0,4) {
if (x3==x2||x3==x1) continue;
F(x4,0,4) {
if (x4==x1||x4==x2||x4==x3) continue;
concat(x1,x2,x3,x4);
ans = min(ans, work());
}
}
}
}
printf("%d\n", ans);
return 0;
}
D. Pair Of Lines
题意
平面上一些点,问是否能画出两条直线,使得穿过平面上所有点。
思路
若点数\(\leq 3\),显然可行。
否则,取前三个点,必有\(1,2\)共线或是\(1,3\)共线或是\(2,3\)共线(若2,3不共线,则必有至少一点与1共线),对这三种情况\(check\)其他点是否满足要求,若均不满足,则为\(NO\).
\(check\)时将共线的所有点扔掉,再\(check\)剩下的所有点是否共线。
共线用叉积计算。
Code
#include <bits/stdc++.h>
#define F(i, a, b) for (int i = (a); i < (b); ++i)
#define F2(i, a, b) for (int i = (a); i <= (b); ++i)
#define dF(i, a, b) for (int i = (a); i > (b); --i)
#define dF2(i, a, b) for (int i = (a); i >= (b); --i)
#define maxn 100010
using namespace std;
typedef long long LL;
struct Point {
LL x, y;
Point operator - (const Point& p) const { return {x-p.x, y-p.y}; }
}p[maxn];
int n;
inline bool cross(Point a, Point b) { return a.y*b.x==a.x*b.y; }
inline bool collinear(int x, int y, int z) { return cross(p[x]-p[y], p[x]-p[z]); }
bool ok(int x, int y) {
vector<int> v;
F(i, 0, n) {
if (!collinear(x,y,i)) v.push_back(i);
}
if (v.size()<=2) return true;
x=v[0], y=v[1];
for (auto i : v) {
if (!collinear(x,y,i)) return false;
}
return true;
}
int main() {
scanf("%d", &n);
F(i, 0, n) scanf("%I64d%I64d", &p[i].x, &p[i].y);
if (n<=4) puts("YES");
else if (ok(0, 1)) puts("YES");
else if (ok(0, 2)) puts("YES");
else if (ok(1, 2)) puts("YES");
else puts("NO");
return 0;
}
E. Tufurama
题意
给定一个序列,问有多少对\(i,j\)满足\(a[i]\geq j,a[j]\geq i\).
思路
考虑对于某个\(i\)去找有多少个\(j\)满足条件,首先,寻找的下标范围为\(j\in[1,a[i]]\),此外需要满足的条件为\(a[j]\geq i\).
下标范围的条件好处理,第二个条件怎么办呢?要是每次计算的时候范围内的点都是满足第二个条件的该多好啊!
所以,每次算完之后将不满足条件的扔掉就行了。因为\(i\)是递增的,所以可以放心大胆扔。
从小到大,对于每个\(i\),统计有多少个下标在\([1,a[i]]\)的范围内,然后扔掉值为\(i\)的所有下标,这样每次算的时候统计到的都是满足第二个条件的下标了。
// 其实是种很常见的想法...。
// 翻了一下很容易就找到了hdu 3887...。
用\(vector[x]\)记录值为\(x\)的所有下标,用树状数组维护下标的个数。
注意最后去掉多算的部分,一部分是和本身,另一部分因为该关系是等价关系所以会算两次。
Code
#include <bits/stdc++.h>
#define F(i, a, b) for (int i = (a); i < (b); ++i)
#define F2(i, a, b) for (int i = (a); i <= (b); ++i)
#define dF(i, a, b) for (int i = (a); i > (b); --i)
#define dF2(i, a, b) for (int i = (a); i >= (b); --i)
#define maxn 200010
using namespace std;
typedef long long LL;
int c[maxn], a[maxn], n;
vector<int> v[maxn];
inline int lowbit(int x) { return x & (-x); }
inline void add(int x, int d) { while (x<=n) c[x]+=d, x+=lowbit(x); }
inline LL query(int x) { LL ret=0; while (x) ret+=c[x], x-=lowbit(x); return ret; }
int main() {
scanf("%d", &n);
F2(i, 1, n) {
scanf("%d", &a[i]);
if (a[i]<=n) v[a[i]].push_back(i);
add(i, 1);
}
LL ans = 0;
F2(i, 1, n) {
ans += query(min(a[i], n));
for (auto x : v[i]) add(x, -1);
}
F2(i, 1, n) if (a[i]>=i) --ans;
printf("%I64d\n", ans>>1);
return 0;
}
Educational Codeforces Round 41 A B C D E的更多相关文章
- Educational Codeforces Round 41 967 E. Tufurama (CDQ分治 求 二维点数)
Educational Codeforces Round 41 (Rated for Div. 2) E. Tufurama (CDQ分治 求 二维点数) time limit per test 2 ...
- Educational Codeforces Round 41
Educational Codeforces Round 41 D. Pair Of Lines 考虑先把凸包找出来,如果凸包上的点数大于\(4\)显然不存在解,小于等于\(2\)必然存在解 否则枚 ...
- Educational Codeforces Round 41 B、C、D
http://codeforces.com/contest/961 B题 可以将长度为k的连续区间转化成1 求最大和 解析 简单尺取 #include <stdio.h> #include ...
- Educational Codeforces Round 41 (Rated for Div. 2)F. k-substrings
题意比较麻烦略 题解:枚举前缀的中点,二分最远能扩展的地方,lcp来check,然后线段树维护每个点最远被覆盖的地方,然后查询线段树即可 //#pragma GCC optimize(2) //#pr ...
- Educational Codeforces Round 41 (Rated for Div. 2)(A~D)
由于之前打过了这场比赛的E题,而后面两道题太难,所以就手速半个多小时A了前4题. 就当练手速吧,不过今天除了C题数组开小了以外都是1A A Tetris 题意的抽象解释可以在Luogu里看一下(话说现 ...
- Educational Codeforces Round 41 (Rated for Div. 2)
这场没打又亏疯了!!! A - Tetris : 类似俄罗斯方块,模拟一下就好啦. #include<bits/stdc++.h> #define fi first #define se ...
- Educational Codeforces Round 41 (Rated for Div. 2) ABCDEF
最近打的比较少...就只有这么点题解了. A. Tetris time limit per test 1 second memory limit per test 256 megabytes inpu ...
- Educational Codeforces Round 41 E. Tufurama (961E)
[题解] 第一眼看题飞快地想到一种做法,然后假掉了. 这道题其实是主席树的模板题来着.但是也有别的水法. 我们可以发现每个位置的查询区间是[1,min(a[i],i-1)],所以我们可以把查询区间按照 ...
- D. Pair Of Lines( Educational Codeforces Round 41 (Rated for Div. 2))
#include <vector> #include <iostream> #include <algorithm> using namespace std; ty ...
随机推荐
- 第三十篇 面向对象的三大特性之继承 supre()
继承 一 .什么是继承? 类的继承跟现实生活中的父.子.孙子.重孙子的继承关系一样,父类又称基类. Python中类的继承分为:单继承 和 多继承. # 定义父类 class ParentClass ...
- Java IO学习--File类
一.File类 File类具备一定的误导性,可能容易认为它指代的是文件,实际并非如此,它既能代表一个特定文件的名称,又能表示一个目录下一组文件的名称.简而言之,File类是文件或者目录路径名的抽象表示 ...
- Python 把两个列表遍历为一个
两个list, 有对应关系,希望同时完成遍历 用迭代器迭代的方法也不是不可以,python提供了更直观的方法: 可以使用zip把两个list打包 , 类似: list1 = [1,2,3,4] lis ...
- DFS(7)——poj1011Sticks
一.题目回顾 题目链接:Sticks 题意:给出一定数量的小木棒的长度,它是由等长的若干木棒随意砍断所得到的.对于给定的一组小木棒,请求出原始木棒的最小长度. 二.解题思路 DFS+剪枝 本题剪枝不到 ...
- 基本数据类型的成员变量放在jvm的哪块内存区域里?
几个月前自己提问的一个问题没人回答,现在突然翻到,自己回答下: 问题: 比如class{private int i;}如上代码,之前一直以为基本数据类型都是放在虚拟机栈中的,最近看了<深入理解j ...
- 编程练习:寻找发帖"水王"扩展问题一
回顾 寻找发帖水王的问题总结起来就是在一个数组中某一个元素出现次数超过了数组长度的一半,那么可以很顺利的找到这个元素,实现见"编程练习:寻找发帖水王" 扩展 上面的问题中,强调了某 ...
- 修改CodeSmith中的SchemaExplorer.MySQLSchemaProvider
修改C:\Program Files (x86)\CodeSmith\v6.5\Samples\Projects\CSharp\MySQLSchemaProvider\MySQLSchemaProvi ...
- 健康领域今年开始井喷了,养老地产和私人医生这两个领域目测成为下一轮BAT在健康领域布局的竞争方向
医疗行业做了六年多的时间,今年到了井喷的阶段,腾讯先是入股了丁香园,然后又一亿美金融资挂号网,春雨医生获得5000万美元的C轮融资,这是要上市的节奏.. 从互联网战略上,健康网和医疗网都是做资料刚开始 ...
- C++编码规范101
组织和策略问题 第0条 不要拘泥于小节(又名:了解哪些东西不应该标准化) 第1条 在高警告级别干净利落地进行编译 第2条 使用自动构建系统 第3条 使用版本控制系统 第4条 在代码审查上投入 设计风格 ...
- 批处理中的IF详解
在CMD使用IF /?打开IF的系统帮助会发现IF有3种基本的用法! 第一种用法:IF [NOT] ERRORLEVEL number command 这种用法现在很少用了,因为它需要使用到CHOIC ...