test20190829 神大校赛模拟
100+100+0=200,聪明搬题人题面又出锅了。
最短路径(path)
给定有向图,包含 n 个节点和 m 条有向边。
一条A 到 B 的路径是最短路径当且仅当不存在另一条从A 到 B 的路径比它更短。换言之,可能存在多条从 A 到 B 的最短路径。
现在,对于每条边,希望求出有多少条最短路径经过它。
对于 100%的数据,1 <= n <= 1500,1 <= m <= 5000,边权不大于 10000。
HAOI2012 道路
首先可以通过枚举确定起点 \(s\)。因为是有向边,所以不会有算重的情况。
基础的想法是求出从起点开始的最短路计数 \(f\),由各个点反向跑的最短路计数 \(g\),那么一条在最短路上的边的答案应该为 \(f_u\times g_v\)。(你可能需要画图理解这个 \(g\))\(f\) 很好算,求最短路时就可顺便算出。考虑 \(g\) 怎么求。
最短路中有用的边构成的一定是一个 DAG。初始把所有点的 \(g\) 设成 \(1\),表示从自己往回走的计数。然后按照 DAG 的反向拓扑序用反向边更新,这样求出来的就是 \(g\) 了。
#include<bits/stdc++.h>
using namespace std;
template<class T> T read(){
T x=0;char c=getchar();
while(!isdigit(c)) c=getchar();
for(;isdigit(c);c=getchar()) x=x*10+c-'0';
return x;
}
template<class T> T read(T&x){
return x=read<T>();
}
#define co const
#define il inline
typedef long long LL;
typedef pair<int,int> pii;
co int mod=1000000000+7;
il int add(int a,int b){
return (a+=b)>=mod?a-mod:a;
}
il int mul(int a,int b){
return (LL)a*b%mod;
}
co int N=1501,INF=0x3f3f3f3f;
vector<int> to[N],we[N],id[N];
int dis[N],f[N];
priority_queue<pii,vector<pii>,greater<pii> > pq;
vector<int> e[N],nd[N];
int deg[N],g[N],ans[5001];
deque<int> q;
int main(){
freopen("path.in","r",stdin),freopen("path.out","w",stdout);
int n=read<int>(),m=read<int>();
for(int i=1;i<=m;++i){
int x=read<int>(),y=read<int>(),w=read<int>();
to[x].push_back(y),we[x].push_back(w),id[x].push_back(i);
}
for(int s=1;s<=n;++s){
// spfa
fill(dis+1,dis+n+1,INF),fill(f+1,f+n+1,0);
dis[s]=0,f[s]=1,pq.push(pii(dis[s],s));
while(pq.size()){
int dx=pq.top().first,x=pq.top().second;
pq.pop();
if(dx>dis[x]) continue;
for(int i=0;i<(int)to[x].size();++i){
int y=to[x][i],w=we[x][i];
if(dis[y]>dx+w){
dis[y]=dx+w,f[y]=f[x];
pq.push(pii(dis[y],y));
}
else if(dis[y]==dx+w)
f[y]=add(f[y],f[x]);
}
}
// count
for(int x=1;x<=n;++x) e[x].clear(),nd[x].clear(),deg[x]=0,g[x]=1;
for(int x=1;x<=n;++x)if(to[x].size())
for(int i=0;i<(int)to[x].size();++i){
int y=to[x][i];
if(dis[y]==dis[x]+we[x][i])
e[y].push_back(x),nd[y].push_back(id[x][i]),++deg[x];
}
for(int x=1;x<=n;++x)
if(!deg[x]) q.push_back(x);
while(q.size()){
int x=q.front();q.pop_front();
for(int i=0;i<(int)e[x].size();++i){
int y=e[x][i];
ans[nd[x][i]]=add(ans[nd[x][i]],mul(f[y],g[x]));
g[y]=add(g[y],g[x]);
if(--deg[y]==0) q.push_back(y);
}
}
}
for(int i=1;i<=m;++i) printf("%d\n",ans[i]);
return 0;
}
数列(seq)
给出一个长度为 n 的数列 A。现有如下两种操作:
- 修改操作:把数列中第 i 个数改为 x
- 询问操作:给定一个位置 i,问数列中有多少个位置 j(j>i),满足位置 i 与位置 j间所有的数都不超过 Ai 与 Aj 的较大值。即∀i<k ≤j , Ak ≤ max (Ai,Aj)
现共有 m 个操作,请对每个询问操作做出回答。
对于 100%的数据,n、m<=50000,Ai、x<=100000。
神大OJ 数列(seq)
分块。
对每个块维护单调栈,这样询问的时候自己块内暴力做,其他的二分即可。
修改就对自己所在块暴力重构。
注意细节,比如 i 向右能够覆盖的部分。
#include<bits/stdc++.h>
using namespace std;
template<class T> T read(){
T x=0,w=1;char c=getchar();
for(;!isdigit(c);c=getchar())if(c=='-') w=-w;
for(;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*w;
}
template<class T> T read(T&x){
return x=read<T>();
}
#define co const
#define il inline
typedef long long LL;
co int N=50000+10,B=883+10,M=56+10;
int A[N],bel[N];
int L[M],R[M],st[M][B],top[M];
void change(int l,int r,int st[],int&top){
top=0;
for(int i=r;i>=l;--i){
while(top&&A[st[top]]<A[i]) --top;
st[++top]=i;
}
}
int query(int p,int num){
int ans=0;
int bl=bel[p],mx=A[p];
for(int i=p+1;i<=R[bl];++i){
mx=max(mx,A[i]);
if(mx<=max(A[p],A[i])) ++ans;
}
for(int i=bl+1;i<=num;++i){
int l=0,r=top[i];
if(mx==A[p]){
while(l<r){
int mid=(l+r+1)>>1;
if(A[st[i][mid]]>mx) l=mid;
else r=mid-1;
}
if(l==0) ans+=R[i]-L[i]+1;
else{
ans+=st[i][l]-1-L[i]+1;
ans+=l-1+1;
}
}
else{
while(l<r){
int mid=(l+r+1)>>1;
if(A[st[i][mid]]>=mx) l=mid;
else r=mid-1;
}
ans+=l-1+1;
}
mx=max(mx,A[st[i][1]]);
}
return ans;
}
int main(){
freopen("seq.in","r",stdin),freopen("seq.out","w",stdout);
int n=read<int>(),m=read<int>();
int siz=sqrt(n*log2(n)),num=(n+siz-1)/siz;
for(int i=1;i<=n;++i) read(A[i]),bel[i]=(i+siz-1)/siz;
for(int i=1;i<=num;++i){
L[i]=R[i-1]+1,R[i]=min(i*siz,n);
change(L[i],R[i],st[i],top[i]);
}
for(char opt[2];m--;){
scanf("%s",opt);
if(opt[0]=='C'){
int p=read<int>();
A[p]=read<int>();
int bl=bel[p];
change(L[bl],R[bl],st[bl],top[bl]);
}
else printf("%d\n",query(read<int>(),num));
}
return 0;
}
圆环面积
平面上有 N 个圆环,第 i 个圆环的中心坐标为 (Xi, Yi),内径为 di,外径为 Di。求这 N 个圆环的并的面积(即在平面上覆盖的面积大小)。
对于 100%的数据满足 N ≤ 1000, |Xi|, |Yi| ≤ 1000, 0 ≤ di < Di ≤ 250。
NOIP模拟赛?这拿给 World Final 还差不多。
test20190829 神大校赛模拟的更多相关文章
- 2019浙师大校赛(浙大命题)(upc复现赛)总结
2019浙师大校赛(浙大命题)(upc复现赛)总结 早上九点开始.起得迟了,吃了早饭慌慌张张跑过去,刚到比赛就开始了. 开始分别从前往后和从后往前看题,一开始A题,第一发WA,第二次读题发现漏看了还有 ...
- PAT团体程序设计天梯赛 - 模拟赛
由于本人愚笨,最后一题实在无力AC,于是只有前14题的题解Orz 总的来说,这次模拟赛的题目不算难,前14题基本上一眼就有思路,但是某些题写起来确实不太容易,编码复杂度有点高~ L1-1 N个数求和 ...
- 正确答案 全国信息学奥林匹克联赛( ( NOIP2014) 复 赛 模拟题 Day1 长乐一中
[题目描述]小 H 与小 Y 刚刚参加完 UOIP 外卡组的初赛,就迫不及待的跑出考场对答案."吔,我的答案和你都不一样!",小 Y 说道,"我们去找神犇们问答案吧&qu ...
- 2017河工大校赛补题CGH and 赛后小结
网页设计课上实在无聊,便开始补题,发现比赛时候僵着的东西突然相通了不少 首先,"追妹"这题,两个队友讨论半天,分好多种情况最后放弃(可是我连题目都没看啊),今天看了之后试试是不是直 ...
- squee_spoon and his Cube VI---郑大校赛(求最长子串)
市面上最常见的魔方,是三阶魔方,英文名为Rubik's Cube,以魔方的发明者鲁比克教授的名字命名.另外,二阶魔方叫Pocket Cube,它只有2*2*2个角块,通常也就比较小:四阶魔方叫Reve ...
- 2017北大校赛 J题 pairs
题目链接 http://poj.openjudge.cn/practice/C17J/ orz 原来是一道无脑枚举题目 只是很卡常数而已 复杂度算错也是很醉orz 当时怎么没想着优化常数呢 题解:枚举 ...
- 2018SCin tsyzDay1 模拟赛-模拟
预计得分:70+0+0+100+100+100+100=470 实际得分:70+0+0+30+100+0+40=240 第一天就被模拟虐爆qwq T1 https://www.luogu.org/pr ...
- 2018.07.17【省赛模拟】模拟B组 比赛总结
题目 [GDKOI2003]最大公共子串 [题目描述] 从一个给定的串中删去(不一定连续地删去)0个或0个以上的字符,剩下的字符按原来的顺序组成的串是该串的字串.例如:"", &q ...
- 2016湖大校赛 L题 The Sequence likes Ladder
题意:S1=a,Sn=a*(Sn-1)^k%m,且有(a,m)=1,给出i,求Si. 思路:首先我们可以写出Sn的通项a^(1+k+k^2+...k^n-1);其次注意到m的范围是10000以内,所以 ...
随机推荐
- SpringBoot常用注解(三)
最全的Java常用开发注解 转 https://blog.csdn.net/weixin_40753536/article/details/81285046 Spring ...
- 开源之路2--SSH
SSH 为 Secure Shell (安全外壳协议)的缩写,由 IETF 的网络小组(Network Working Group)所制定:SSH是每一台Linux电脑的标准配置. SSH 是建立在应 ...
- Java 8 集合之流式(Streams)操作, Streams API 详解
因为当时公司的业务需要对集合进行各种各样的业务逻辑操作,为了提高性能,就用到了这个东西,因为以往我们以前用集合都是需要去遍历(串行),所以效率和性能都不是特别的好,而Streams就可以使用并行的方式 ...
- vm采用NAT方式连接时,设置静态ip
一,共享无线连接或本地连接,给VMnet8. 在网络配置中,选着无线连接,右键属性,共享. 这里默认给虚拟网卡VMnet8,分配了IP:192.168.137.1. 二,在VMware中配置VMnet ...
- SQL server 常见错误--登录连接失败和附加数据库失败
问题1:数据库软件登录连接不了,因为SQL server有部分服务没有开启,需要手动开启. 解决:计算机管理-->服务-->开启SQL server服务(具体那个自己慢慢试,就 ...
- kubernetes 实践四:Pod详解
本篇是关于k8s的Pod,主要包括Pod和容器的使用.Pod的控制和调度管理.应用配置管理等内容. Pod的定义 Pod是k8s的核心概念一直,就名字一样,是k8s中一个逻辑概念.Pod是docekr ...
- webapi session
webapi中使用session 修改global.cs里面的内容 using System; using System.Web; using System.Web.Routing; using Sy ...
- java List分组和排序处理
在一些应用中,需要将List中的对象按某种情况分组或者排序处理.做个小结如下: 1. 如一个List中存放了ProductDoing对象,productDoing对象有rawTypeId 现在要求将r ...
- Java经典逻辑编程50题 (转)
注: 转自https://blog.csdn.net/Alias_fa/article/details/52985112 (摘了题目部分和部分分析,想看原作代码的见原作链接) [程序1] 題目:古典 ...
- IObit Driver Booster 无法更新驱动的解决办法
IObit Driver Booster 无法更新驱动的解决办法:依次打开软件中的 菜单-设置-网络-自定义代理设置-主机:填入210.101.131.231 端口:8080 最后点确定完成. 注意! ...