Link:

ARC064 传送门

C:

贪心+对边界的特殊处理

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int MAXN=1e5+;
ll res=;
int n,x,dat[MAXN];
int main()
{
scanf("%d%d",&n,&x);
for(int i=;i<=n;i++) scanf("%d",&dat[i]);
if(dat[]>x) res+=dat[]-x,dat[]=x;
for(int i=;i<=n-;i++)
if(dat[i-]+dat[i]>x)
res+=dat[i-]+dat[i]-x,dat[i]=x-dat[i-];
if(dat[n-]+dat[n]>x) res+=dat[n-]+dat[n]-x;
printf("%lld",res);
return ;
}

Problem C

D:

一道结论题

博弈题一般都要先找到最终的必败/必胜态

对于此题,只要知道最终态的位数就能得到结果,但我一开始觉得位数不定就卡题了……

虽然无法确定最终必败态的位数,但能确定必败态位数的奇偶性

重要条件:序列的两端不能动

因此当两端相等时,最终态一定为$ababa$这样,位数为偶数个;当两端不等时位数一定为奇数个

这样判断初始序列和最终序列差值的奇偶性就能得到结果

#include <bits/stdc++.h>

using namespace std;
char s[];
int main()//最终个数难以确定时观察奇偶性
{
scanf("%s",s+);int len=strlen(s+);
if(s[]==s[len])
if(len&) puts("Second"); else puts("First");
else
if(len&) puts("First"); else puts("Second");
return ;
}

Problem D

由于答案由奇偶性判断,考虑最终态位数的奇偶性即可

E:

为了简化模型,想成走到圆心再从圆心出发,仍能保证最优解

于是两两连边跑最短路就行了(其实可以不用连边,每次找最近的走就行了)

#include <bits/stdc++.h>

using namespace std;
#define x first
#define y second
const int MAXN=;
const double INF=1e13,eps=1e-;
typedef pair<double,double> P;
P S,T,pos[MAXN];
vector<P> G[MAXN];
int n;double r[MAXN],d[MAXN]; double dist(P a,P b)
{return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));} int main()//其实可以不用连边,每次找最近的走就行了……
{
scanf("%lf%lf%lf%lf%d",&S.x,&S.y,&T.x,&T.y,&n);
for(int i=;i<=n;i++)
scanf("%lf%lf%lf",&pos[i].x,&pos[i].y,&r[i]);
pos[]=S;pos[n+]=T;
for(int i=;i<=n+;i++)
for(int j=;j<=n+;j++)
if(i!=j)
{
if(r[i]+r[j]>dist(pos[i],pos[j]))
G[i].push_back(P(j,));
else G[i].push_back(P(j,dist(pos[i],pos[j])-r[i]-r[j]));
} priority_queue<P,vector<P>,greater<P> > q;
for(int i=;i<MAXN;i++) d[i]=INF;
d[]=;q.push(P(,));
while(!q.empty())
{
P t=q.top();q.pop(); int u=t.y;
if(d[u]<t.x) continue;
for(int i=;i<G[u].size();i++)
{
int v=G[u][i].x;
if(d[v]>d[u]+G[u][i].y)
d[v]=d[u]+G[u][i].y,q.push(P(d[v],v));
}
}
printf("%.10lf",d[n+]);
return ;
}

Problem E

F:

一开始全在考虑如何去掉不合法的状态,但其实正向求解更方便

回文串共有$k^{n/2}$个,旋转后就有$k^{n/2}*n$个,但明显要去除重复的

观察到重复的原因是从一个回文串转移到了另一个回文串(或自己)

转移的步数与循环节有关:

(1)循环节为奇数时能转移$x$步,回到自己

(2)循环节为偶数时只能转移$x/2$步

因此只要计算构成每种循环节的组合数再乘上此时能转移的步数即可

令$dp[i]$表示最小循环节为$i$时的组合数,明显$dp[i]=k^{(i+1)/2}- \sum_{j|i} dp[j]$

(为了最终为回文数,每个循环节也要为回文数)

那么$res=\sum_{i|n} dp[i]*x(x/2)$

(Tip:$1e9$内因数最多的数的因数个数为1344,因此$O(d^2)$可行)

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int MAXN=1e5+,MOD=1e9+;
int n,k,dvs[MAXN],dp[MAXN],tot,res=; ll quick_pow(ll a,ll b)
{
ll ret=;
for(;b;b>>=,a=a*a%MOD)
if(b&) ret=ret*a%MOD;
return ret;
} int main()
{
scanf("%d%d",&n,&k);
for(int i=;i*i<=n;i++)
if(n%i==)
{
dvs[++tot]=i;
if(i*i!=n) dvs[++tot]=n/i;
}
sort(dvs+,dvs+tot+);
for(int i=;i<=tot;i++)
{
dp[i]=quick_pow(k,(dvs[i]+)/);
for(int j=;j<=i-;j++)//对循环节长度的分类
if(dvs[i]%dvs[j]==) dp[i]=(dp[i]-dp[j]+MOD)%MOD;
if(dvs[i]%==) (res+=1ll*dp[i]*dvs[i]/%MOD)%=MOD;
else (res+=1ll*dp[i]*dvs[i]%MOD)%=MOD;
}
printf("%d",res);
return ;
}

Problem F

其实不算难的一道题目

当一种思路淦不出来时要赶紧换方向啊

[Atcoder Regular Contest 064] Tutorial的更多相关文章

  1. [Atcoder Regular Contest 060] Tutorial

    Link: ARC060 传送门 C: 由于难以维护和更新平均数的值: $Average->Sum/Num$ 这样我们只要用$dp[i][j][sum]$维护前$i$个数中取$j$个,且和为$s ...

  2. [Atcoder Regular Contest 061] Tutorial

    Link: ARC061 传送门 C: 暴力$dfs$就好了 #include <bits/stdc++.h> using namespace std; typedef long long ...

  3. [Atcoder Regular Contest 065] Tutorial

    Link: ARC065 传送门 C: 最好采取逆序贪心,否则要多考虑好几种情况 (从前往后贪心的话不能无脑选“dreamer”,"er"可能为"erase"/ ...

  4. [Atcoder Regular Contest 063] Tutorial

    Link: ARC063 传送门 C: 将每种颜色的连续出现称为一段,寻找总段数即可 #include <bits/stdc++.h> using namespace std; ,len; ...

  5. [Atcoder Regular Contest 062] Tutorial

    Link: ARC 062 传送门 C: 每次判断增加a/b哪个合法即可 并不用判断两个都合法时哪个更优,因为此时两者答案必定相同 #include <bits/stdc++.h> usi ...

  6. AtCoder Regular Contest 064 F - Rotated Palindromes

    Problem Statement Takahashi and Aoki are going to together construct a sequence of integers. First, ...

  7. AtCoder Regular Contest 061

    AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...

  8. AtCoder Regular Contest 094 (ARC094) CDE题解

    原文链接http://www.cnblogs.com/zhouzhendong/p/8735114.html $AtCoder\ Regular\ Contest\ 094(ARC094)\ CDE$ ...

  9. AtCoder Regular Contest 092

    AtCoder Regular Contest 092 C - 2D Plane 2N Points 题意: 二维平面上给了\(2N\)个点,其中\(N\)个是\(A\)类点,\(N\)个是\(B\) ...

随机推荐

  1. BZOJ 2707: [SDOI2012]走迷宫 拓扑+高斯消元+期望概率dp+Tarjan

    先Tarjan缩点 强连通分量里用高斯消元外面直接转移 注意删掉终点出边和拓扑 #include<cstdio> #include<cstring> #include<a ...

  2. Codeforces Round #350 (Div. 2) B

    B. Game of Robots time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  3. event对象和事件冒泡

    <!DOCTYPE HTML><html><head> <meta charset="utf-8"> <title>无标 ...

  4. java 构造函数问题

    1.构造函数什么时候被调用,被谁调用? 转摘:http://bbs.csdn.net/topics/350231037 当然,只有在NEW的时候,才会真正的创建这个对象,只有在创建时才会调用该类的构造 ...

  5. (转)Django常用命令

    转自GoodSpeed,http://www.cnblogs.com/cacique/archive/2012/09/30/2709145.html . . . . .

  6. 编写一个 Chrome 浏览器扩展程序

    浏览器扩展允许我们编写程序来实现对浏览器元素(书签.导航等)以及对网页元素的交互, 甚至从 web 服务器获取数据,以 Chrome 浏览器扩展为例,扩展文件包括: 一个manifest文件(主文件, ...

  7. 我们用CloudStack做什么

    原文地址:http://www.sdfengxi.com/?p=376 我想很多同学会有类似的疑问,就是我配置好了CloudStack或者OpenStack之类的环境之后能够提供什么服务或者应用呢?下 ...

  8. classList详解,让你的js方便地操作DOM类

    在此之前,jQuery的hasClass.addClass.removeClass我们已经再熟悉不过了,然而我们并不会在每一个项目中都会去使用 jQuery或者Zepto,譬如在移动端的网页中,考虑到 ...

  9. Lucene4.6查询时完全跳过打分,提高查询效率的实现方式

    由于索引的文件量比较大,而且应用中不需要对文档进行打分,只需要查询出所有满足条件的文档.所以需要跳过打分来提高查询效率.一开始想用ConstantScoreQuery,但是测试发现这个类虽然让所有返回 ...

  10. 【数据结构】bzoj1651专用牛棚

    Description Oh those picky N (1 <= N <= 50,000) cows! They are so picky that each one will onl ...