Link:

ARC061 传送门

C:

暴力$dfs$就好了

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
ll n,res=;
int dgt[],cnt; void dfs(int dep,ll sum)
{
if(dep==cnt){res+=sum;return;}
for(int i=dep+;i<=cnt;i++)
{
ll t=;
for(int j=dep+;j<=i;j++)
t=t*+dgt[j];
dfs(i,sum+t);
}
} int main()
{
scanf("%lld",&n);
for(;n;n/=) dgt[++cnt]=n%;
reverse(dgt+,dgt+cnt+);dfs(,);
printf("%lld",res);
return ;
}

Problem C

D:

没有办法直接上暴力,但可以采取计算贡献的方式:

每个有色点都对周围的9个正方形恰好有1点贡献

将$9*k$个正方形用其左上角的坐标表示,排序后将相同的合并就是该正方形的个数了

最后用总的减去个数为$[1,9]$的就是个数为0的个数了

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=1e5+;
P sqr[MAXN*];
ll sum=,cnt[];
int n,m,k,x,y,tot;
int dx[]={-,-,-,-,-,-,,,};
int dy[]={-,-,,-,-,,-,-,}; int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=;i<=k;i++)
{
scanf("%d%d",&x,&y);
for(int j=;j<;j++)
{
int fx=x+dx[j],fy=y+dy[j];
if(fx>&&fy>&&fx<=n-&&fy<=m-)
sqr[++tot]=P(fx,fy);
}
} sort(sqr+,sqr+tot+);
int cur=;
for(int i=;i<=tot;i++)
if(sqr[i]==sqr[i-]) cur++;
else cnt[cur]++,cur=;
if(k) cnt[cur]++;//不要忘记对末尾的处理 for(int i=;i<=;i++) sum+=cnt[i];
cnt[]=1ll*(m-)*(n-)-sum;
for(int i=;i<;i++) printf("%lld\n",cnt[i]);
return ;
}

Problem D

E:

先来说说正解:拆点最短路

在每个站点中,对于每一个其能转换到的公司都新设立一个站点,并建立一个总站

也就是说,对于边$(u,v,c)$,建边$(u,u[c],1),(v,v[c],1),(u[c],v[c],0)$

这样体现了是否转换公司的抉择,直接在新图上求最短路就好了

但注意最后答案要除以2,毕竟这样建图每转换一次其实计算了2次1

我的做法又是极为感性的

在每个点都用一个$set$维护当前能达到最短距离时的末尾公司名,转移时贪心

感觉没什么问题,但不知道为什么在距离相同时一定要先处理编号较大的节点?请各位神犇们指点啊……

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
typedef pair<int,int> P;
const int MAXN=1e5+,INF=<<;
int n,m,x,y,z,dist[MAXN];
set<int> s[MAXN];
vector<P> G[MAXN];
//必须要用set,因为可能dist最小时有多种公司供选择
struct cmp
{//一定要编号大的先处理(原因未知)
bool operator() (const P& a,const P& b)
{return a.X!=b.X?a.X>b.X:a.Y<b.Y;}
}; int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
G[x].push_back(P(y,z));G[y].push_back(P(x,z));
} priority_queue<P,vector<P>,cmp > q;
for(int i=;i<MAXN;i++) dist[i]=INF;
dist[]=;q.push(P(,));
while(!q.empty())
{
P t=q.top();q.pop();
int u=t.Y,cost=t.X,tmp;
if(cost>dist[u]) continue;
for(int i=;i<G[u].size();i++)
{
int v=G[u][i].X,col=G[u][i].Y;
tmp=dist[u]+(!s[u].count(col));
if(tmp==dist[v]) s[v].insert(col);
else if(tmp<dist[v])
{
s[v].clear();s[v].insert(col);
dist[v]=tmp,q.push(P(dist[v],v));
}
}
}
printf("%d",(dist[n]==INF)?-:dist[n]);
return ;
}

Problem E

F:

设游戏结束前使用了$x$张$b$,$y$张$c$

可以发现最终一共使用了$n+x+y$张卡片,且由于最后一张一定是$a$可以不用考虑

因此可以比较容易的写出一下的式子:

$res=\sum_{p=0}^{m+k} C_{n−1+x+y}^{n-1}*3^{m+k−x−y}*\sum_{0\le x\le m,0\le y\le k}[x+y=p]C_{p}^{x}$

为了将计算的时间降到$O(n)$,我们可以用递推的方式优化$\sum C_{p}^{x}$

设$f(i)$表示$p=i$时该式的值,发现递推有三个阶段(假设$m<k$):

1、$i<m$时$f(i)=\sum_{j=0}^{i} C_i^j$

2、$m\le i<k$时$f(i)=\sum_{j=0}^{m} C_i^j$

3、$k\le i$时$f(i)=\sum_{j=i-k}^m C_i^j$

将这些式子放到杨辉三角形上可以发现:

1阶段时$f(i)=f(i-1)*2$(二项式系数和的基本结论)

2阶段时$f(i)=f(i-1)*2-C_{i-1}^m$(减掉右边界的值)

3阶段时$f(i)=f(i-1)*2-C_{i-1}^m-C_{i-1}^{i-1-k}$(减掉左右边界的值)

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int MAXN=(3e5+)*,MOD=1e9+;
ll res=,cur=;
int n,m,k,fac[MAXN],inv[MAXN]; 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 C(int a,int b)
{if(a<b||b<) return ;return 1ll*fac[a]*inv[b]%MOD*inv[a-b]%MOD;} int main()
{
scanf("%d%d%d",&n,&m,&k);
fac[]=;
for(int i=;i<MAXN;i++)
fac[i]=1ll*fac[i-]*i%MOD;
inv[MAXN-]=quick_pow(fac[MAXN-],MOD-);
for(int i=MAXN-;i>=;i--)
inv[i]=1ll*inv[i+]*(i+)%MOD; for(int i=n;i<=n+m+k;i++)
(res+=C(i-,n-)*cur%MOD*quick_pow(,n+m+k-i)%MOD)%=MOD,
cur=(*cur-C(i-n,m)+MOD-C(i-n,i-n-k)+MOD)%MOD;
printf("%lld",res);
return ;
}

Problem F

优化方式涨姿势了

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

  1. AtCoder Regular Contest 061

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

  2. AtCoder Regular Contest 061 DSnuke's Coloring

    http://arc061.contest.atcoder.jp/tasks/arc061_b 题意: H行W列的矩阵中,然后挖了n个洞,输出j(0-9)行,对于第i行输出,有多少个3*3区域中有i个 ...

  3. [Atcoder Regular Contest 060] Tutorial

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

  4. Atcoder Regular Contest 061 D - Card Game for Three(组合数学)

    洛谷题面传送门 & Atcoder 题面传送门 首先考虑合法的排列长什么样,我们考虑将每次操作者的编号记录下来形成一个序列(第一次 A 操作不计入序列),那么显然这个序列中必须恰好含有 \(n ...

  5. [Atcoder Regular Contest 065] Tutorial

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

  6. [Atcoder Regular Contest 064] Tutorial

    Link: ARC064 传送门 C: 贪心+对边界的特殊处理 #include <bits/stdc++.h> using namespace std; typedef long lon ...

  7. [Atcoder Regular Contest 063] Tutorial

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

  8. [Atcoder Regular Contest 062] Tutorial

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

  9. AtCoder Regular Contest 061 E - すぬけ君の地下鉄旅行【最短路】

    具体题解又要搬大哥的了,嘿嘿~ 请点击:G点我 这道题目的难点就是同一家公司的路直接走不需要再花费,然后多了一个公司这个东西,这个不像是边的副权值(瞎说的)之类的东西,这是对于路来说的,路的属性... ...

随机推荐

  1. 【洛谷 P4051】 [JSOI2007]字符加密(后缀数组)

    题目链接 两眼题.. 第一眼裸SA 第二眼要复制一倍再跑SA. 一遍过.. #include <cstdio> #include <cstring> #include < ...

  2. js_如何优化你的代码让它更好看

    1.对于美的东西我们很难拒绝,比如美女.哈哈哈,程序员的梗. 2.所以我希望我写出来的代码也是很美观的,让人看起来会很舒服. 3.要想让你的代码简约美观,就要涉及封装,模块化了,可复用代码.vue可以 ...

  3. Python 用ctypes观察Python对象的内存结构 -- (转)

    !!!强烈推荐的好文章!!! 对象的两个基本属性 Python所有对象结构体中的头两个字段都是相同的: refcnt:对象的引用次数,若引用次数为0则表示此对象可以被垃圾回收了. typeid:指向描 ...

  4. windows下安装python过程

    方法一:如果你的电脑没有安装python,推荐使用anaconda(自带python环境,同时自带各种第三方库,可以省去很多麻烦) 这里提供两个下载地址:1,.官网https://www.anacon ...

  5. 【Windows使用笔记】使Onedrive同步任意文件夹

    因为度盘实在是有点垃圾,经常看的剧之类的或者其他软件资源啥的动不动就被封. 所以跑去某宝买了一个5T的企业子账号,安全性不清楚,重要的隐私数据反正都用移动硬盘备份了.主要就是存一些资源性的文件吧.而且 ...

  6. mysql 5.6在gtid复制模式下复制错误,如何跳过??

    mysql 5.6在gtid复制模式下复制错误,如何跳过?? http://www.xuchanggang.cn/archives/918.html

  7. leetcode 之Partition List(16)

    思路就是定义两个链表,一个放大的,一个放小的,最后将两个连起来,注意细节问题. ListNode *partionList(ListNode *head, int value) { ListNode ...

  8. XML、java解释XML、XML约束

    1.XML有什么用? (1)可以用来保存数据 (2)可以用来做配置文件 (3)数据传输载体 2.XML格式 XML 元素必须遵循以下命名规则: 名称可以含字母.数字以及其他的字符 名称不能以数字或者标 ...

  9. java之基本数据类型与引用数据类型

    基本数据类型 需要注意的是字符是基本数据类型,但是字符串不是基本数据类型. 引用数据类型 类.接口类型.数组类型.枚举类型.注解类型. (上面说的字符串String属于引用数据类型中“类”的范畴) 两 ...

  10. mac date命令

    usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [-f fmt date | [[[mm]dd ...