[Atcoder SHPC2018] Tutorial
Link:
C:
一道看上去有些吓人的题目,不过$1e9$规模下的$n^m$代表肯定是可以约分的
可以发现能提供贡献的数对只有$2*(n-d)$种,那么总贡献为$2*(n-d)*(m-1)*n^{m-2}$
除去$n^m$后就是$\frac{2*(n-d)*(m-1)}{n^2}$($d=0$时要特殊处理)
#include <bits/stdc++.h> using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int,int> P;
ld n,m,d;
int main()
{
scanf("%Lf%Lf%Lf",&n,&m,&d);
printf("%.10Lf",(n-d)*(m-)/(n*n)*(d?2.0:1.0));
return ;
}
Problem C
一般此类难以枚举所有状态的题目都是利用计算每种可能答案的贡献来解决
D:
发现了自己英语渣渣的本质……
把$some day$理解为$some days$就觉得不可做了,以后还是要学好英语注意单复数啊……
如果只能转换一次就非常容易了:
分别从起点和终点根据不同边权跑最短路,算出在每个点转换时的最小代价
从后往前取$min$就能找到在前$i$个点不能转换时的最小代价了
#include <bits/stdc++.h> using namespace std;
#define X first
#define Y second
typedef long long ll;
typedef pair<ll,ll> P;
const int MAXN=1e5+;
int n,m,S,T,x,y,a,b;
ll res[MAXN],INF=1e15,d1[MAXN],d2[MAXN];
vector<P> G1[MAXN],G2[MAXN]; void dijkastra(vector<P> *G,ll *d,int start)
{
priority_queue<P,vector<P>,greater<P> > q;
for(int i=;i<MAXN;i++) d[i]=INF;
q.push(P(,start));d[start]=;
while(!q.empty())
{
P t=q.top();q.pop();
int u=t.Y;ll cost=t.X;
if(cost>d[u]) 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));
}
}
} int main()
{
scanf("%d%d%d%d",&n,&m,&S,&T);
for(int i=;i<=m;i++)
scanf("%d%d%d%d",&x,&y,&a,&b),
G1[x].push_back(P(y,a)),G1[y].push_back(P(x,a)),
G2[x].push_back(P(y,b)),G2[y].push_back(P(x,b)); dijkastra(G1,d1,S);dijkastra(G2,d2,T);
for(int i=;i<=n;i++) res[i]=d1[i]+d2[i];
for(int i=n-;i>=;i--) res[i]=min(res[i],res[i+]);
for(int i=;i<=n;i++) printf("%lld\n",INF-res[i]);
return ;
}
Problem D
E:
首先要意识到:如果一个点确定,其它所有点都能确定(除非有矛盾)
因此我们只要判断第一个点有多少种取值可行就能算出总的方案数
如果点$i$与起点相距偶数条边时$a_i=t+a_1$,相距奇数条边时$a_i=t-a_1$($t$为常数)
又由于要求$a_i$为正整数,我们根据$a_i\ge 0$的约束条件不断缩减$a_1$的范围即可
(需要注意,如果出现环时要么不可行要么确定唯一的$a_1$)
实现时只要写一个$dfs$即可,不断推导当前的$t$和$a_1$前的正/负号
#include <bits/stdc++.h> using namespace std;
typedef long long ll;
const int MAXN=1e5+;
struct edge{int nxt,to,w;}e[MAXN<<];
ll l=,r=1ll<<,dif[MAXN],fst=;//有可能爆2e9
int n,m,x,y,z,head[MAXN],mk[MAXN],vis[MAXN],tot=; void add(int from,int to,int w)
{e[++tot].nxt=head[from];e[tot].to=to;e[tot].w=w;head[from]=tot;} void dfs(int x,ll cur,int mark,int anc)
{
if(!vis[x])
{
mk[x]=mark;dif[x]=cur;vis[x]=;
if(fst&&dif[x]+mk[x]*fst<=)
puts(""),exit(); if(mk[x]>) l=max(l,-dif[x]+);
else r=min(r,dif[x]-);
}
else
{
if(cur==dif[x]&&mark==mk[x]) return;
if(cur!=dif[x]&&mark==mk[x])
puts(""),exit(); ll t=(dif[x]-cur)/(mark-mk[x]);
if(t*(mark-mk[x])==dif[x]-cur && ((!fst)||fst==t)) fst=t;
else puts(""),exit();
return;
}
for(int i=head[x];i;i=e[i].nxt)
if(e[i].to!=anc) dfs(e[i].to,e[i].w-cur,-mark,x);
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
scanf("%d%d%d",&x,&y,&z),add(x,y,z),add(y,x,z);
dfs(,,,); if(fst) printf("");
else printf("%lld",max(0ll,r-l+));
return ;
}
Problem E
一般此类对于每个点都有限制条件的题目(如BZOJ 3573),基本上都能保证确定一点就能推出全图
此时只要判断起点能有多少种取值就行了。(推导时还要再耐心些,不要一上来就觉得题目不可做)
[Atcoder SHPC2018] Tutorial的更多相关文章
- [Atcoder Grand Contest 004] Tutorial
Link: AGC004 传送门 A: …… #include <bits/stdc++.h> using namespace std; long long a,b,c; int main ...
- [Atcoder Regular Contest 060] Tutorial
Link: ARC060 传送门 C: 由于难以维护和更新平均数的值: $Average->Sum/Num$ 这样我们只要用$dp[i][j][sum]$维护前$i$个数中取$j$个,且和为$s ...
- [Atcoder Regular Contest 061] Tutorial
Link: ARC061 传送门 C: 暴力$dfs$就好了 #include <bits/stdc++.h> using namespace std; typedef long long ...
- [Atcoder Regular Contest 065] Tutorial
Link: ARC065 传送门 C: 最好采取逆序贪心,否则要多考虑好几种情况 (从前往后贪心的话不能无脑选“dreamer”,"er"可能为"erase"/ ...
- [Atcoder 080] A~D Tutorial
很好奇这周为什么只有Beginner Contest而没有Regular Contest,本来想着去30minAK的,结果1个小时了还有一道题调不出来o(╯□╰)o A:Parking 让我体验了下开 ...
- [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 Grand Contest 003] Tutorial
Link: AGC003 传送门 A: 判断如果一个方向有,其相反方向有没有即可 #include <bits/stdc++.h> using namespace std; ]; map& ...
- [Atcoder Regular Contest 062] Tutorial
Link: ARC 062 传送门 C: 每次判断增加a/b哪个合法即可 并不用判断两个都合法时哪个更优,因为此时两者答案必定相同 #include <bits/stdc++.h> usi ...
随机推荐
- Android 对Layout_weight属性完全解析以及使用ListView来实现表格
用在linearlayout 如果我们想要按照权重比例来分配LinearLayout,我们需要将其宽度设置为0dip http://blog.csdn.net/xiaanming/article/de ...
- libusb 示例
#include <usb.h> #include <stdio.h> #define VERSION "0.1.0" #define VENDOR_ID ...
- CSS选择器及CSS3新增选择器
转自:http://www.cnblogs.com/libingql/p/4375354.html 1. CSS1定义的选择器 选择器 类型 说明 E 类型选择器 选择指定类型的元素 E#id ID选 ...
- 51Nod-1586-约数和
#include <cstdio> using namespace std; typedef long long ll; ; int n, q; int cnt[MAXN]; ll a[M ...
- 【洛谷 P2464】[SDOI2008]郁闷的小J(线段树)
题目链接 这题我很久之前用分块写过,没写出来.. 今天又看到了,于是下决心把这题做出来. 这次我用线段树写的,直接对每本书的编号Hash一下然后离散化然后各建一棵线段树,维护当前编号在某个位置有没有书 ...
- [bzoj3277==bzoj3473]出现k次子串计数——广义后缀自动机+STL
Brief Description 给定n个字符串,对于每个字符串,您需要求出在所有字符串中出现次数大于等于k次的子串个数. Algorithm Design 先建立一个广义后缀自动机,什么是广义后缀 ...
- 人脸识别 - 环境搭建(Ubuntu 16.04)
安装人脸识别开源库(face_recognition) pip3 install face_recognition 注意:pip3 尝试编译 dlib 依赖时很可能会报错,参考:https://www ...
- web前端 html/css总结点
1.html块级.内联<img src="" alt="图片未加载提示" title="鼠标悬浮提示"><a href=& ...
- 【bzoj4810】由乃的玉米田
lxl丧心病狂-- 首先允许离线的区间询问一看就是莫队.那么我们看下怎么莫队? 不会. "由乃题多半是不可做的."于是我看了下题解--好吧果然是bitset 用bitset维护当前 ...
- php扩展
swoole 命令行/php-fpm下实现的 多线程.异步.多种网络协议等 https://wiki.swoole.com/wiki/page/6.html 编译安装, 注意:需命令行运行,作为内部服 ...