2017-11-07-noip模拟题
T1 数学老师的报复
矩阵快速幂模板,类似于菲波那切数列的矩阵
[1,1]*[A,1
B,0]
#include <cstdio> #define LL long long
inline void read(LL &x)
{
x=; register char ch=getchar(); register bool _=;
for(; ch>''||ch<''; ch=getchar()) if(ch=='-') _=;
for(; ch>=''&&ch<=''; ch=getchar()) x=x*+ch-'';
x=_?((~x)+):x;
}
const int mod();
LL a,b,n; struct Matrix_fb {
LL e[][];
Matrix_fb operator * (Matrix_fb x) const
{
Matrix_fb ret;
for(int i=; i<; ++i)
for(int j=; j<; ++j)
{
ret.e[i][j]=;
for(int k=; k<; ++k)
ret.e[i][j]+=e[i][k]*x.e[k][j],ret.e[i][j]%=mod;
}
return ret;
}
} ans,base; int Presist()
{
// freopen("attack.in","r",stdin);
// freopen("attack.out","w",stdout); read(a),read(b),read(n);
if(n<=) { puts(""); return ; }
ans.e[][]=ans.e[][]=;
ans.e[][]=ans.e[][]=;
base.e[][]=a%,base.e[][]=,
base.e[][]=b%,base.e[][]=;
for(n-=; n; n>>=,base=base*base)
if(n&) ans=ans*base;
printf("%lld\n",ans.e[][]);
return ;
} int Aptal=Presist();
int main(int argc,char**argv){;}
AC
T2 和生物老师的战争
#include <cstdio> inline void read(int &x)
{
x=; register char ch=getchar();
for(; ch>''||ch<''; ) ch=getchar();
for(; ch>=''&&ch<=''; ch=getchar()) x=x*+ch-'';
} int Presist()
{
freopen("fseq.in","r",stdin);
freopen("fseq.out","w",stdout);
int t; read(t);
for(int n,m; t--; )
{
read(n),read(m);
if(n<m) puts("0.000000");
else
{
double fz=n-m+;
double fm=n+;
printf("%.6lf\n",fz/fm);
}
}
return ;
} int Aptal=Presist();
int main(int argc,char**argv){;}
AC
T3 化学竞赛的大奖
#include <cstring>
#include <cstdio>
#include <queue> #define LL long long
#define min(a,b) (a<b?a:b)
#define max(a,b) (a>b?a:b) inline void read(int &x)
{
x=; register char ch=getchar();
for(; ch>''||ch<''; ) ch=getchar();
for(; ch>=''&&ch<=''; ch=getchar()) x=x*+ch-'';
}
const int N(+);
const int M(+);
int n,m;
int head[][N],sumedge[];
struct Edge {
int v,next,w;
Edge(int v=,int next=,int w=):v(v),next(next),w(w){}
}edge[][M<<];
inline void ins(int u,int v,int w,int op)
{
edge[op][++sumedge[op]]=Edge(v,head[op][u],w),head[op][u]=sumedge[op];
edge[op][++sumedge[op]]=Edge(u,head[op][v],w),head[op][v]=sumedge[op];
} int tim,dfn[N],low[N];
int top,sta[N],insta[N];
int sumcol,col[N];
void DFS(int u,int pre)
{
low[u]=dfn[u]=++tim;
sta[++top]=u, insta[u]=;
for(int v,i=head[][u]; i; i=edge[][i].next)
{
/*if(vis[i]||vis[i^1]) continue;
vis[i]=vis[i^1]=true;*/
v=edge[][i].v; if(v==pre) continue;
if(!dfn[v]) DFS(v,u),low[u]=min(low[u],low[v]);
else if(insta[v]) low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u])
{
col[u]=++sumcol;
for(; u!=sta[top]; top--)
{
col[sta[top]]=sumcol;
insta[sta[top]]=false;
}
insta[u]=false, top--;
}
} struct Node {
int pos; LL dis;
bool operator < (const Node&x)const
{
return dis<x.dis;
}
}u,v;
std::priority_queue<Node>que;
LL dis[N],ans[N];
bool vis[N];
inline void Dijkstra(int s)
{
for(; !que.empty(); ) que.pop();
for(int i=; i<=sumcol; ++i)
dis[i]=-,vis[i]=false; dis[s]=u.dis=,u.pos=s; que.push(u);
for(; !que.empty(); )
{
u=que.top(); que.pop();
if(vis[u.pos]) continue; vis[u.pos]=;
for(int i=head[][u.pos]; i; i=edge[][i].next)
{
v.pos=edge[][i].v; if(!vis[v.pos])
if(dis[v.pos]<dis[u.pos]+edge[][i].w)
{
v.dis=u.dis+(LL)edge[][i].w;
ans[s]=max(ans[s],v.dis);
dis[v.pos]=v.dis;
que.push(v);
}
}
}
} int Presist()
{
// freopen("prize.in","r",stdin);
// freopen("prize.out","w",stdout); read(n),read(m);
for(int u,v,w,i=; i<=m; ++i)
read(u),read(v),read(w),ins(u,v,w,);
for(int i=; i<=n; ++i)
if(!dfn[i]) DFS(i,-); for(int v,u=; u<=n; ++u)
for(int i=head[][u]; i; i=edge[][i].next)
{
v=edge[][i].v; if(col[u]==col[v]) continue;
ins(col[u],col[v],edge[][i].w,);
} for(int i=; i<=sumcol; ++i) ans[i]=-, Dijkstra(i);
for(int i=; i<=n; ++i) printf("%lld\n",ans[col[i]]);
return ;
} int Aptal=Presist();
int main(int argc,char**argv){;}
缩点后,n边Dijkstra 40分,,考试暴力
可以先求出强连通分量,两次dfs得到数的直径,ans[i]=max(dis(s,i),dis(t,i))
#include <cstring>
#include <cstdio> #define min(a,b) (a<b?a:b)
#define max(a,b) (a>b?a:b) inline void read(int &x)
{
x=; register char ch=getchar();
for(; ch>''||ch<''; ) ch=getchar();
for(; ch>=''&&ch<=''; ch=getchar()) x=x*+ch-'';
} const int N(+);
const int M(+); int n,m;
int head[][N],sumedge[];
struct Edge {
int v,next,w;
Edge(int v=,int next=,int w=):v(v),next(next),w(w){}
}edge[][M<<];
inline void ins(int u,int v,int w,int op)
{
edge[op][++sumedge[op]]=Edge(v,head[op][u],w),head[op][u]=sumedge[op];
if(!op) edge[op][++sumedge[op]]=Edge(u,head[op][v],w),head[op][v]=sumedge[op];
} int tim,dfn[N],low[N];
int top,sta[N],insta[N];
int sumcol,col[N]; namespace Tarjan { void DFS(int u,int pre)
{
low[u]=dfn[u]=++tim;
sta[++top]=u, insta[u]=;
for(int v,i=head[][u]; i; i=edge[][i].next)
{
v=edge[][i].v;
if(!dfn[v]) DFS(v,u),low[u]=min(low[u],low[v]);
else if(insta[v]&&v!=pre) low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u])
{
col[u]=++sumcol;
for(; u!=sta[top]; top--)
{
col[sta[top]]=sumcol;
insta[sta[top]]=false;
}
insta[u]=false, top--;
}
}
inline void work()
{
for(int i=; i<=n; ++i)
if(!dfn[i]) DFS(i,-);
}
} int dis[][N],s,t,maxx;
namespace Solve {
void DFS(int u,int pre)
{
for(int v,i=head[][u]; i; i=edge[][i].next)
{
v=edge[][i].v; if(pre==v) continue;
dis[][v]=dis[][u]+edge[][i].w;
if(dis[][v]>maxx) maxx=dis[][v],s=v;
DFS(v,u);
}
}
void DFS_(int u,int pre)
{
for(int v,i=head[][u]; i; i=edge[][i].next)
{
v=edge[][i].v; if(v==pre) continue;
dis[][v]=dis[][u]+edge[][i].w; DFS_(v,u);
}
}
inline void work()
{
for(int v,u=; u<=n; ++u)
for(int i=head[][u]; i; i=edge[][i].next)
{
v=edge[][i].v; if(col[u]==col[v]) continue;
ins(col[u],col[v],edge[][i].w,);
}
DFS (,-);
for(int i=; i<=sumcol; ++i) dis[][i]=; maxx=; DFS (s,-);
DFS_(s,-);
for(int i=; i<=n; ++i)
printf("%d\n",max(dis[][col[i]],dis[][col[i]]));
} } int Presist()
{
freopen("prize.in","r",stdin);
freopen("prize.out","w",stdout); read(n),read(m);
for(int u,v,w,i=; i<=m; ++i)
read(u),read(v),read(w),ins(u,v,w,);
Tarjan::work();
Solve ::work();
return ;
} int Aptal=Presist();
int main(int argc,char**argv){;}
AC
2017-11-07-noip模拟题的更多相关文章
- 2018.11.07 NOIP模拟 数独(模拟)
传送门 sbsbsb签到题. 读题时间比写题时间长系列. 写一个checkcheckcheck函数来检验当前时间段第(i,j)(i,j)(i,j)号格子能否放入kkk就行了. 代码
- 2018.11.07 NOIP模拟 异或(数位dp)
传送门 对于每个二进制位单独考虑贡献. 然后对于两种情况分别统计. 对于第二种要用类似数位dpdpdp的方法来计算贡献. 代码
- 2018.11.07 NOIP模拟 分糖果(贪心)
传送门 考虑 n = 2 时的情况:假定两个人分别为(a, b),(c, d),则当且仅当min(a,d) ≤ min(b,c)时,把(a, b)放在前面更优,否则把(c, d)放在前面更优 然后把n ...
- NOIP模拟题汇总(加厚版)
\(NOIP\)模拟题汇总(加厚版) T1 string 描述 有一个仅由 '0' 和 '1' 组成的字符串 \(A\),可以对其执行下列两个操作: 删除 \(A\)中的第一个字符: 若 \(A\)中 ...
- 11.7 NOIP模拟赛
目录 2018.11.7 NOIP模拟 A 序列sequence(two pointers) B 锁lock(思路) C 正方形square(埃氏筛) 考试代码 B C 2018.11.7 NOIP模 ...
- 【入门OJ】2003: [Noip模拟题]寻找羔羊
这里可以复制样例: 样例输入: agnusbgnus 样例输出: 6 这里是链接:[入门OJ]2003: [Noip模拟题]寻找羔羊 这里是题解: 题目是求子串个数,且要求简单去重. 对于一个例子(a ...
- 9.9 NOIP模拟题
9.9 NOIP模拟题 T1 两个圆的面积求并 /* 计算圆的面积并 多个圆要用辛普森积分解决 这里只有两个,模拟计算就好 两圆相交时,面积并等于中间两个扇形面积减去两个三角形面积 余弦定理求角度,算 ...
- 8.22 NOIP 模拟题
8.22 NOIP 模拟题 编译命令 g++ -o * *.cpp gcc -o * *.c fpc *.pas 编译器版本 g++/gcc fpc 评测环境 位 Linux, .3GHZ CPU ...
- 11/1 NOIP 模拟赛
11.1 NOIP 模拟赛 期望得分:50:实际得分:50: 思路:暴力枚举 + 快速幂 #include <algorithm> #include <cstring> #in ...
- 11.07图论水题Test
11.07图论水题Test 题目 描述 做法 \(BSOJ6378\) 在\(i\)位置可以到\(i+a_i\)或\(i+b_i\)求\(1\rightarrow n\)字典序最小路径 判可达性后贪心 ...
随机推荐
- verilog 1995 VS 2001 part1模块声明的扩展
1.模块声明的扩展 (1)端口声明(input/output/inout)同数据类型声明(reg /wire)放在同一语句中. (2)ANSI C风格的端口声明可以用于module/task/func ...
- GoF23种设计模式之行为型模式之状态模式
一.概述 定义对象之间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 二.适用性 1.一个对象的行为取决于它的状态,并且它必须在运行时刻 ...
- GoF23种设计模式之行为型模式之模板方法
概述 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 适用性 1.一次性实现一个算法的不变的部分, ...
- matplotlib学习记录 三
# 绘制自己和朋友在各个年龄的女友数量的折线图 from matplotlib import pyplot as plt # 让matplotlib能够显示中文 plt.rcParams['font. ...
- 这五本Python急速入门必读的书,送给正在学习Python的你!
书籍是人类进步的阶梯,这句话从古至今都是适用的.为什么会这么说呢?书籍,它记录了人们实践的经验,这些经验有助于我们快速的学习,对于编程学习来说也不例外,今天就给大家带来了以下的书籍干货,希望能够帮助到 ...
- PAT Basic 1074
1074 宇宙无敌加法器 地球人习惯使用十进制数,并且默认一个数字的每一位都是十进制的.而在 PAT 星人开挂的世界里,每个数字的每一位都是不同进制的,这种神奇的数字称为“PAT数”.每个 PAT 星 ...
- LA 7048 Coprime 莫比乌斯反演
题意: 给出\(n(n \leq 10^5)\)个数字\(a_i(a_i \leq 10^5)\),从中选出\(3\)个数,使得这\(3\)个数两两互质或者两两不互质 分析: 可以说这是<训练指 ...
- 关于MySQL建表对DML的影响【转】
本文来自这里 今天一位同学问到线上曾经碰到过连续建表,导致阻塞普通的insert.update等.不过也没有保留现场.因此有疑问为什么建表会影响DML? 分析 首先这个现象不是在所有 ...
- selenium - 常用等待操作
# 4. 等待操作 # 强制等待from time import sleepsleep(10) # 隐性等待# 设置最长等待时间,在这个时间在只要有个时间点加载完成,则执行下一步代码,比sleep智能 ...
- foreach 、 for 换成 ForEach
List<tBaseRolerMapPower> list =new List<tBaseRolerMapPower>() string strName = string.E ...