[Atcoder Regular Contest 061] Tutorial
Link:
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的更多相关文章
- AtCoder Regular Contest 061
		AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ... 
- 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个 ... 
- [Atcoder Regular Contest 060] Tutorial
		Link: ARC060 传送门 C: 由于难以维护和更新平均数的值: $Average->Sum/Num$ 这样我们只要用$dp[i][j][sum]$维护前$i$个数中取$j$个,且和为$s ... 
- Atcoder Regular Contest 061 D - Card Game for Three(组合数学)
		洛谷题面传送门 & Atcoder 题面传送门 首先考虑合法的排列长什么样,我们考虑将每次操作者的编号记录下来形成一个序列(第一次 A 操作不计入序列),那么显然这个序列中必须恰好含有 \(n ... 
- [Atcoder Regular Contest 065] Tutorial
		Link: ARC065 传送门 C: 最好采取逆序贪心,否则要多考虑好几种情况 (从前往后贪心的话不能无脑选“dreamer”,"er"可能为"erase"/ ... 
- [Atcoder Regular Contest 064] Tutorial
		Link: ARC064 传送门 C: 贪心+对边界的特殊处理 #include <bits/stdc++.h> using namespace std; typedef long lon ... 
- [Atcoder Regular Contest 063] Tutorial
		Link: ARC063 传送门 C: 将每种颜色的连续出现称为一段,寻找总段数即可 #include <bits/stdc++.h> using namespace std; ,len; ... 
- [Atcoder Regular Contest 062] Tutorial
		Link: ARC 062 传送门 C: 每次判断增加a/b哪个合法即可 并不用判断两个都合法时哪个更优,因为此时两者答案必定相同 #include <bits/stdc++.h> usi ... 
- AtCoder Regular Contest 061 E - すぬけ君の地下鉄旅行【最短路】
		具体题解又要搬大哥的了,嘿嘿~ 请点击:G点我 这道题目的难点就是同一家公司的路直接走不需要再花费,然后多了一个公司这个东西,这个不像是边的副权值(瞎说的)之类的东西,这是对于路来说的,路的属性... ... 
随机推荐
- PHP  is_null,empty以及isset,unset的区别
			1.empty 判断一个变量是否为“空”.null.false.00.0.’0′.』.为以上值的变量在检测時都将返回true. 2.isset 判断一个变量是否已经设置.0.00.’0′.』.’ ‘. ... 
- SQL SERVER 创建远程数据库链接  mysql oracle sqlserver
			遇到的坑 在连接Oracle时,因为服务器为10g 32位版本,然后在本地安装了32为10g客户端,然后一直报错[7302.7303],后来下载了12c 64位版本,安装成功后,问题解决 原因:mss ... 
- C# 关于调用微信接口的代码
			调用微信接口前需要准备的内容. 1.微信公众平台的appid 2.微信公众平台的secret 3..获取tokenid 4.获取ticket 5.生成签名的随机串 6.生成签名的时间戳 7.生成签名 ... 
- 动归专题QAQ(两天创造的刷题记录哟!✿✿ヽ(°▽°)ノ✿✿)(未填坑)
			1092 采药:由于没有限制开始时间和结束时间,01背包就好了 1095 开心的金明:01背包,无fuck说 1104 摆花:f[i][j]表示摆了i种花,第i种花摆了j种的方案数,乱转移0.0(感觉 ... 
- python基础===字符串的制表,换行基础操作
			\n\t 制表符和换行符 >>> print("Languages:\n\tPython\n\tC\n\tJavaScript") Languages: Pyth ... 
- Leetcode 之Longest Palindromic Substring(30)
			很经典的一道题,最长回文子串,有多种方法. 首先介绍的一种方法是从中间向两边展开.注意区分aba和abba型的回文串:如果当前最长的子串已经当于两边中最长的子串了,则无需再去判断. //从中间向两边展 ... 
- [python] windows文件迁移
			目的: 处理windows系统文件迁移,文件格式包含特殊字符(空格,括号,全角等) 语言: python 模块: shutil 代码: #coding:utf-8 import os,sys im ... 
- Linux和Windows双系统安装要点
			这里主要说下CentOS和Windows7的双系统安装遇到的一些问题 一.磁盘分区 这个不得不说下在Windows下坑爹的设定了,如果是用默认的磁盘划分,系统会自己先划出一个100M左右的区,关键还是 ... 
- IO扩展控件(System.IO.Abstractions)
			刚看到这个Namespace的时候还以为是.Net Framework里自带的包,结果查了一圈无任何结果.果断上Github搜索,一击即中 https://github.com/tathamoddie ... 
- electron调用C#应用程序实现串口通信
			最近转入零售行业开发了一系列产品,包含便利店收银软件.会员系统.供应链系统.为了追赶潮流,收银软件使用了electron平台开发,界面效果.开发效率确实不错:但是涉及到串口通讯时遇到了麻烦,elect ... 
