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。现有如下两种操作:

  1. 修改操作:把数列中第 i 个数改为 x
  2. 询问操作:给定一个位置 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 神大校赛模拟的更多相关文章

  1. 2019浙师大校赛(浙大命题)(upc复现赛)总结

    2019浙师大校赛(浙大命题)(upc复现赛)总结 早上九点开始.起得迟了,吃了早饭慌慌张张跑过去,刚到比赛就开始了. 开始分别从前往后和从后往前看题,一开始A题,第一发WA,第二次读题发现漏看了还有 ...

  2. PAT团体程序设计天梯赛 - 模拟赛

    由于本人愚笨,最后一题实在无力AC,于是只有前14题的题解Orz 总的来说,这次模拟赛的题目不算难,前14题基本上一眼就有思路,但是某些题写起来确实不太容易,编码复杂度有点高~ L1-1 N个数求和 ...

  3. 正确答案 全国信息学奥林匹克联赛( ( NOIP2014) 复 赛 模拟题 Day1 长乐一中

    [题目描述]小 H 与小 Y 刚刚参加完 UOIP 外卡组的初赛,就迫不及待的跑出考场对答案."吔,我的答案和你都不一样!",小 Y 说道,"我们去找神犇们问答案吧&qu ...

  4. 2017河工大校赛补题CGH and 赛后小结

    网页设计课上实在无聊,便开始补题,发现比赛时候僵着的东西突然相通了不少 首先,"追妹"这题,两个队友讨论半天,分好多种情况最后放弃(可是我连题目都没看啊),今天看了之后试试是不是直 ...

  5. squee_spoon and his Cube VI---郑大校赛(求最长子串)

    市面上最常见的魔方,是三阶魔方,英文名为Rubik's Cube,以魔方的发明者鲁比克教授的名字命名.另外,二阶魔方叫Pocket Cube,它只有2*2*2个角块,通常也就比较小:四阶魔方叫Reve ...

  6. 2017北大校赛 J题 pairs

    题目链接 http://poj.openjudge.cn/practice/C17J/ orz 原来是一道无脑枚举题目 只是很卡常数而已 复杂度算错也是很醉orz 当时怎么没想着优化常数呢 题解:枚举 ...

  7. 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 ...

  8. 2018.07.17【省赛模拟】模拟B组 比赛总结

    题目 [GDKOI2003]最大公共子串 [题目描述] 从一个给定的串中删去(不一定连续地删去)0个或0个以上的字符,剩下的字符按原来的顺序组成的串是该串的字串.例如:"", &q ...

  9. 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以内,所以 ...

随机推荐

  1. Oracle Spatial 中的弧段及弧相关拓扑错误

    1.报告说明 此报告用于验证下列问题: ORACLE SPATIAL 0.05m的最小拓扑容差值是否可以被修改 原始数据通过ARCGIS入库数据精度是否有损失 修改ORACLE SPATIAL图层的最 ...

  2. Vue问题汇总

    Vue——父子组件间异步动态获取数据传递数据时,子组件获取不到值或者延时获取: 通过watch解决:https://blog.csdn.net/where_slr/article/details/99 ...

  3. Beta版本的发布

    1.团队成员列表 成员姓名 成员学号 秦裕航 201731062432(组长) 刘东 201731062227 张旭 201731062129 王伟 201731062214 2.解决了那些在Alph ...

  4. LeetCode 704. 二分查找(Binary Search)

    704. 二分查找 704. Binary Search 题目描述 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target,写一个函数搜索 nums 中的 target,如果 ...

  5. LeetCode 537. 复数乘法(Complex Number Multiplication)

    537. 复数乘法 537. Complex Number Multiplication 题目描述 Given two strings representing two complex numbers ...

  6. 不借助其他任何软件防止QQ被盗的小技巧

    分享一个小技巧(防止QQ被盗号): 在登录的时候前面加个0,点击登录,如果显示账号不存在,是因为你没有在添加或注册账号这儿登录,也就是切换账号.PC端也可以,如下图:                 ...

  7. 经典例题(Python)

    经典例题 if嵌套 1.用户输入账号2.用户输入密码3.判断用户的账号是不是alex4.如果账号是alex在继续判断密码是不是alexdsb5.账号和密码都正确提示用户alex就是一个dsb6.如果账 ...

  8. Fedora30 - Xrdp 远程桌面

    Windows RDP 访问 Fedor 远程桌面需要使用 Xrdp 开源工具. [lipandeng@localhost ~]$ sudo dnf install xrdp [lipandeng@l ...

  9. Python进阶:程序界的垃圾分类回收

    垃圾回收是 Python 自带的机制,用于自动释放不会再用到的内存空间: 什么是内存泄漏呢? 内存泄漏,并不是说你的内存出现了信息安全问题,被恶意程序利用了,而是指程序本身没有设计好,导致程序未能释放 ...

  10. 17 IO流(十四)——Print流

    PrintStream流 PrintStream作为一个包装流,它可以包装字节流,甚至可以使用指定的文件创建一个打印流.它的构造函数很丰富,建议打开API看一下. 它常用的方法是print方法与pri ...