Codeforces 一眼题系列
Posted caturra
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 一眼题系列相关的知识,希望对你有一定的参考价值。
最近感觉思路不怎么开阔,顺便挑些题扫一遍找找灵感
都是实现相当简单的题,代码我会有空补上
(唉希望这不是我的最后一次...)
580B 略
743B 每一次操作s = s + mex{s} + s,二进制查询.
911B Max = max(Max, min(b / ret, a / i));
701C 在字符串中找一个最短的包含其所有字母种类的子串,输出最小长度,左边的字母不断出队(如果出队后不会使某字母缺失),就可以更新最小长度。一旦无法出队,则右边的字母进队,然后继续判左边字母
604B 把n个数放入k个盒子中,每个盒子最多只能放两个数字,求盒子最小固定大小(不够大直接输出最后一个,否则贪心从后往前插,排序后再从前往后插(用最后的数字))
348A 有N个人玩游戏,给出每个人想玩的局数,每局中必须有一个人当裁判,剩下N-1个人比赛,问最少设多少局比赛 二分l是想玩的最大局数(个人),r是局数之和 局数mid*(n-1)>=和sum
251A 给出n和k,然后给出一个大小为 n 的集合,从集合中取出3个数,最大数与最小数的差值小于k的方式有多少种。 思路:每加进来一个数,只考虑这个数的贡献,例如,加进来第4个数的时候,假设前面四个数都符合要求,那么4的贡献就是从前面3个数当中取出两个来的总数,所以就是C 3 2, 这是个组合数。所以考虑每一个数,把每个数的组合数加起来就是了for(int i=1;i<n;i++)
{
LL j=i-(lower_bound(a,a+i,a[i]-d)-a);
ans+=j*(j-1)/2;
}
755B 有两个人轮流说单词,已经说过的单词不能再说。给出两人掌握的不同的单词,两人可能掌握相同的单词,但是这个单词也只能说一边。问在两人都是最优策略下先手是否必胜.我们发现最优策略一定是先说两人都掌握的单词。
所以我们求出所有同时被掌握的单词
然后根据这种单词的奇偶性来判断即可.
778A 给出字符串s和字符串p,还有n个位置,每一个位置代表删除s串中的第i个字符,问最多可以删除多少个字符使得s串依旧包含p串。 if(vis[i]) continue;
12 if(p[cnt] == s[i]) cnt++;
13 if(cnt == m + 1) return true;
567C 给你一个序列,求序列中长度为3的公比为k的子序列的个数. 定义:dp[i][j] 以j结尾的长度为i的子序列的个数有转移方程dp[i][j]=dp[i?1][j/k]
map
274A 待看
607A 待看 题意是在一条直线上坐落着不同位置的灯塔,每一个灯塔有自己的power level,当作是射程范围。现在从最右边的灯塔开始激发,如果左边的灯塔在这个灯塔的范围之内,那么将会被毁灭。否则会被激发,留下自己。现在可以从右边放置一个灯塔,位置和power level都可以自己定义。问各种情况中最小的灯塔被毁灭的数量。
[solve]
c[i]表示第i个激活时,不考虑i右边的,有几个灯台能保留。
对第i个灯塔,找到它激活时,左边第一个能存活的塔j,
c[i] =c[j] + 1,没有能存活的则c[i] = 1
448D N*M的乘法表,找到第K个数.第i行小于X的个数为min((x-1)/i,m) N行累加后与K进行比较
96B 求大于n的4和7相同数量的最小数
int b[6] = {4,4,4,7,7,7};
int c[8] = {4,4,4,4,7,7,7,7};
do{
for(i=0;i<6;i++)
{
num[k] += b[i]f[5-i];
}
k++;
}while(next_permutation(b,b+6));
do{
for(i=0;i<8;i++)
{
num[k] += c[i]f[7-i];
}
k++;
}while(next_permutation(c,c+8));
num[k] = 4444477777;
192A 判断n是否A(A-1)/2和B(B-1)/2的和,暴力A二分B/打表也行?
527C 对于一个矩形,宽为w,高为h。现在对其进行一系列的切割。让你求出每次切割后的最大面积的矩形
set:内部已经有序,记录已经切割了的位置。
multiset:内部已经有序,记录切割出来的长度。
lower_bound(val):返回第一个>=val的数的位置。(二分)
每次切割的时候,在set里面寻找最近左右两侧所切割的位置,再把新的切割位置插入到set,可以得到该段的长度。
然后在multiset里找到这个长度erase掉(可能有多个,只需要删除一个),再把切割后的得到两个长度插入multiset。最大面积等于最大的宽度最大的高度,搞定。
setit,l=(--it);
S[t].insert(val);
MS[t].insert(r-val),MS[t].insert(val-l);
MS[t].erase(MS[t].find(r-l));
return (long long)(MS[t].rbegin())(MS[t^1].rbegin());
}
int main()
{
cin.sync_with_stdio(false);
cin>>W>>H>>N;
S[0].insert(0),S[0].insert(H);
S[1].insert(0),S[1].insert(W);
MS[0].insert(H),MS[1].insert(W);
char ch;
int val;
for (int i=1;i<=N;i++)
{
cin>>ch>>val;
cout<<(ch==‘H‘?Solve(0,val):Solve(1,val))<
385C 待看
424B 二分找人数,这篇预处理r排序很简明https://blog.csdn.net/wilver/article/details/50320285
734C 待看
777C 给你一个二维数组问你从L行到R行是否存在着一列是非递减数列,如果有输出 Yes 否则 No
以上是关于Codeforces 一眼题系列的主要内容,如果未能解决你的问题,请参考以下文章
Educational Codeforces Round 84 (Rated for Div. 2)
Codeforces Round #587 (Div. 3) C题 判断两个矩形是否完全覆盖一个矩形问题 {补题 [差点上分系列]}