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. JQuery选择器$()的工作原理浅析

    每次申明一个jQuery对象的时候,返回的是jQuery.prototype.init对象,很多人就会不明白,init明明是jQuery.fn的方法啊,实际上这里不是方法,而是init的构造函数,因为 ...

  2. JSOI2004 平衡点 / 吊打XXX [模拟退火]

    题目描述 如图:有n个重物,每个重物系在一条足够长的绳子上.每条绳子自上而下穿过桌面上的洞,然后系在一起.图中X处就是公共的绳结.假设绳子是完全弹性的(不会造成能量损失),桌子足够高(因而重物不会垂到 ...

  3. POJ1637:Sightseeing tour(混合图的欧拉回路)

    Sightseeing tour Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 10581   Accepted: 4466 ...

  4. 解析json方式之net.sf.json

    前面转载了json解析的技术:fastjson,今天说下另外一种技术. 下载地址 本次使用版本:http://sourceforge.net/projects/json-lib/files/json- ...

  5. 理解JWT(JSON Web Token)认证及python实践

    原文:https://segmentfault.com/a/1190000010312468?utm_source=tag-newest 几种常用的认证机制 HTTP Basic Auth HTTP ...

  6. AtCoder Regular Contest 082 F

    Problem Statement We have a sandglass consisting of two bulbs, bulb A and bulb B. These bulbs contai ...

  7. [转载]C#用正则表达式 获取网页源代码标签的属性或值

    最近调试程序需要用到获取网页指定标签的属性和值,找到了一个比较好的正则匹配方法,特此备份. [原]C#用正则表达式 获取网页源代码标签的属性或值 整理两个 在C#中,用正则表达式 获取网页源代码标签的 ...

  8. bootstrap——集合

    1.<nav class="navbar navbar-inverse"> inverse,反色,原导航条为白色,加-inverse后改为黑色   2.data-tog ...

  9. python3,判断,循环练习1

    1.使用while循环输出1 2 3 4 5 6 8 9 10 i = 1 while i <= 10: if i == 7: i += 1 print(end=' ') continue pr ...

  10. python--celery

    有些时候我们的一些任务比较耗时,比如我们写了一个网站,用户注册的时候需要发送邮件.但是发送邮件的过程比较耗时,用户必须要等到我们将邮件发送成功之后才会得到响应.那么有没有一种办法,当用户点击发送邮件的 ...