【赛时总结】 ◇赛时·I◇ AtCoder ARC-098
◆赛时I◆ ARC-098
■试题&解析■
◆本场最水◆ C-Attention
长点儿信心吧……
【解析】
既然只存在左右(东西)两个朝向,那么领导右侧的人应朝左,相反左侧的人朝右。则要找到一个人作为领导使上述人的数量最多。
我们可以用 tot[0]、tot[1] 分别储存最初朝东、西的人的个数。然后从第一个人开始枚举,统计当前人左侧的分别朝向东、西的人的个数,从而算出当前人左侧朝右、右侧朝左的人的个数,记为F。领导人即是算出F最大的人。
注意统计时要排开当前人的数量(领导人不算在内,不需要改变朝向)。【源代码】
/*Lucky_Glass*/
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN int(3*1e5)
int len,tot[2],res[2],ans;
char s[MAXN+5];
int main()
{
scanf("%d%s",&len,s);
for(int i=0;i<len;i++)
tot[s[i]=='E']++;
ans=1e9;
for(int i=0;i<len;i++)
{
int F=0;
F+=res[0];
F+=tot[1]-res[1]-int(s[i]=='E');
res[s[i]=='E']++;
ans=min(ans,F);
}
printf("%d\n",ans);
return 0;
}
◆脑壳开窍◆ D-Xor Sum 2
没办法,作者就是脑壳不开窍啊 QwQ
- 【AtCoder ARC-098 D】
- 【解析】
其实这道题我没有看出来我哪里TLE了,和正解的算法一样——滑动窗口,可能是写的丑吧。
对于异或有一个技巧——如果 A^BA+B ,则 A&B0 即A、B的二进制的各个数位都不相同。现在问题就变成寻找一个区间 [l,r] 使得 Ai&Aj=0
(i≠j 且 l≤i,j≤r)。
定义区间左右端点l、r,并初始化l=1,r=0。保证 r < n(即 r+1≤n 且 l≤r )。定义当前区间的所有数异或所得到的值为F,初始化为0。
若 A[r+1]&F0 即当前区间向右扩充1后,仍然满足所给条件,则更新F、r,向右扩充,并同时更新ans,增加的答案个数为扩充后区间的长度。用while循环执行此操作。
第一次while循环结束后,则要么枚举完了,要么 F&A[r+1]!=0 ,此时无论如何向右扩充都无法满足题目所给条件,所以只能删除左侧,直到再次满足 F&A[r+1]0 (当区间为空时,也满足 F&A[r+1]==0 )。
注意:ans用 long long 储存。
- 【源代码】
/*Lucky_Glass*/
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=2*1e5;
int n,A[MAXN+5];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&A[i]);
int l=1,r=0,F=0;
long long ans=0;
while(r<n)
{
while(r<n && !(F&A[r+1]))
{
r++;ans+=r-l+1;
F^=A[r];
}
while(l<=r && (F&A[r+1]))
F^=A[l++];
}
printf("%lld\n",ans);
return 0;
}
◆想不到吧◆ E - Range Minimum Queries
这个是真的想不到 (u_u)
- 【AtCoder ARC-098 E】
- 【解析】
对答案有影响的变量主要是最大值和最小值,那么就可以先通过枚举限制其中一个变量(这里我用最小值)。
限制最小值,也就是说枚举Ai,在选取区间时,区间中最小的元素不能小于Ai。这样我们就可以将 A 分成多个段——每个段中的元素都大于等于Ai。这样就限制了区间中取到的最小值,但是此时的最小值不一定是Ai(比如枚举到的Ai=2,则当k=2时数据“1 2 1”就取不到2)。最小值确定后,要使最大值减最小值最小,则需要让最大值尽量小,即抽取到的数要尽量小。
那么我们可以提取出各个满足长度大于等于k的段。这些段可以作为选取区间的段,且设段的长度为len,我们可以在这个段里取 len-k+1 次区间(每一次选取都会使段的长度减少1,直到区间长度小于k)。可见如果取 len-k+1 次区间,则一定可以取出这个段里前 len-k+1 小的数。
为了使取出的数尽量小,我们需要尽量使每个段中取出的数都尽量小,也就是段中前 len-k+1 小的数。我们可以将这些数存入另外一个数组(pri),方便最后找到最小的最大值。由于我们要进行Q次抽取,最小的最大值一定是 pri 中第 Q 小的数,而最小值就是 pri 中最小的数。 - 【源代码】
/*Lucky_Glass*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int MAXN=2000;
const int INF=(int)1e9+5;
int n,k,q,A[MAXN+5],ans=INF;
void SOLVE(int x)
{
vector<int> pri;
int i=0;
while(i<n)
{
vector<int> que;
while(A[i]<x && i<n) i++;
while(A[i]>=x && i<n) que.push_back(A[i++]);
if(que.size()>=k)
{
sort(que.begin(),que.end());
for(int j=0;j<(int)que.size()-k+1;j++)
pri.push_back(que[j]);
}
}
sort(pri.begin(),pri.end());
if((int)pri.size()>=q)
ans=min(ans,pri[q-1]-pri[0]);
}
int main()
{
scanf("%d%d%d",&n,&k,&q);
for(int i=0;i<n;i++)
scanf("%d",&A[i]);
for(int i=0;i<n;i++)
SOLVE(A[i]);
printf("%d\n",ans);
return 0;
}
(F题真的不会做了,请各位神牛多多指点)
The End
Thanks for reading!
-Lucky_Glass
【赛时总结】 ◇赛时·I◇ AtCoder ARC-098的更多相关文章
- 【AtCoder】 ARC 098
link C-Attention 题意:一个字符队列,每个位置是\(W\)或\(E\),计算最小的修改数量,使得存在一个位置,它之前的都是\(E\),之后的都是\(F\) #include<bi ...
- 【题解】Atcoder ARC#90 F-Number of Digits
Atcoder刷不动的每日一题... 首先注意到一个事实:随着 \(l, r\) 的增大,\(f(r) - f(l)\) 会越来越小.考虑暴力处理出小数据的情况,我们可以发现对于左端点 \(f(l) ...
- AtCoder ARC 076E - Connected?
传送门:http://arc076.contest.atcoder.jp/tasks/arc076_c 平面上有一个R×C的网格,格点上可能写有数字1~N,每个数字出现两次.现在用一条曲线将一对相同的 ...
- AtCoder ARC 076D - Built?
传送门:http://arc076.contest.atcoder.jp/tasks/arc076_b 本题是一个图论问题——Manhattan距离最小生成树(MST). 在一个平面网格上有n个格点, ...
- AtCoder ARC 082E - ConvexScore
传送门:http://arc082.contest.atcoder.jp/tasks/arc082_c 本题是一个平面几何问题. 在平面直角坐标系中有一个n元点集U={Ai(xi,yi)|1≤i≤n} ...
- Atcoder ARC 082C/D
C - Together 传送门:http://arc082.contest.atcoder.jp/tasks/arc082_a 本题是一个数学问题. 有一个长度为n的自然数列a[1..n],对于每一 ...
- 【题解】 AtCoder ARC 076 F - Exhausted? (霍尔定理+线段树)
题面 题目大意: 给你\(m\)张椅子,排成一行,告诉你\(n\)个人,每个人可以坐的座位为\([1,l]\bigcup[r,m]\),为了让所有人坐下,问至少还要加多少张椅子. Solution: ...
- 【题解】Atcoder ARC#96 F-Sweet Alchemy
首先,我们发现每一个节点所选择的次数不好直接算,因为要求一个节点被选择的次数大于等于父亲被选择的次数,且又要小于等于父亲被选择的次数 \(+D\).既然如此,考虑一棵差分的树,规定每一个节点被选择的次 ...
- AtCoder ARC 090 E / AtCoder 3883: Avoiding Collision
题目传送门:ARC090E. 题意简述: 给定一张有 \(N\) 个点 \(M\) 条边的无向图.每条边有相应的边权,边权是正整数. 小 A 要从结点 \(S\) 走到结点 \(T\) ,而小 B 则 ...
- 【题解】Atcoder ARC#67 F-Yakiniku Restaurants
觉得我的解法好简单,好优美啊QAQ 首先想想暴力怎么办.暴力的话,我们就枚举左右端点,然后显然每张购物券都取最大的值.这样的复杂度是 \(O(n ^{2} m)\) 的.但是这样明显能够感觉到我们重复 ...
随机推荐
- CSS选择器笔记,element element和element > element 的区别
看官方解释 element element 例子: div p 官方解释:div内部所有的p元素 就是说 只要p在div内部.如果 p在span内部,span在div内部,p也算在div内部 < ...
- static 和 final 和 static final
众所周知,static 是静态修饰关键字:可以修饰变量,程序块,方法,类. 1.修饰变量. 得知:如果static修饰的是变量,则JVM会将将其分配在内存堆上,该变量就与对象无关,所有对该变量的引用都 ...
- [PHP]Mysql的运用
1.创建数据库和表,代码如下: //创建数据库函数 function createDB($DBname){ $query="CREATE DATABASE $DBname"; re ...
- pat1020. Tree Traversals (25)
1020. Tree Traversals (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Suppo ...
- MySQL如何查询当月数据
自己写了一个比较简单效率又高的方法,分享给大家: WHERE addTime BETWEEN DATE_FORMAT(NOW(),'%Y-%m-01') AND NOW() 方法就是过滤 本月1日到当 ...
- mysql-数据库模式定义语言(DDL)
库的管理 /* 一.库的管理 创建.修改.删除 二.表的管理 创建.修改.删除 创建: create 修改: alter 删除: drop */ #一.库的管理 #.库的创建 /* 语法: creat ...
- thinkphp 创建数据对象之data方法
创建数据对象:data()方法 1.功能:给模型对象$data赋值,将模型对象转化为数据对象 tip:模型对象与数据对象之间就差一个赋过值的$data; 2.方法:data()其源码如下: tip:源 ...
- 有意思的jsonp
<style> body{margin: 0;} ul{margin: 0;padding: 0;list-style: none;} a{color:inherit;text-decor ...
- Android Studio 创建虚拟机失败 Failed to load 解决办法
Name: Nexus_S_API_21 CPU/ABI: ARM (armeabi) Path: H:\Users\Pavkoo\.android\avd\Nexus_S_API_21.avd Er ...
- 转:解决“arcsde服务启动又停止的问题” - shmiloy001的专栏 - 博客频道 - CSDN.NET
)查看原因 该问题产生的原因可查看文件:F:\Program Files\ArcGIS\ArcSDE\ora11gexe\etc\sde_esri_sde.log 文件中提示密码失 ...