11.7noip模拟赛
题解:广义斐波那契数列 矩阵乘法
#include<iostream>
#include<cstdio>
#include<cstring>
#define LL long long
using namespace std; LL n,A,B; inline LL read(){
char ch=getchar();LL x=,f=;
for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';
return x*f;
} struct maxtix{
int t[][];
}ans; maxtix maxtix_mul(maxtix a,maxtix b){
maxtix tmp;
for(int i=;i<=;i++){
for(int j=;j<=;j++){
tmp.t[i][j]=;
for(int k=;k<=;k++){
tmp.t[i][j]=(tmp.t[i][j]%+a.t[i][k]*b.t[k][j]%)%;
}
}
}
return tmp;
} maxtix maxtix_mul(maxtix a,LL b){
maxtix ret=a;b--;
while(b){
if(b&)ret=maxtix_mul(ret,a);
a=maxtix_mul(a,a);
b>>=;
}
return ret;
} int main(){
freopen("attack.in","r",stdin);
freopen("attack.out","w",stdout);
A=read();B=read();n=read();
A%=;B%=;
if(n<=){
LL f1=,f2=,f3;
for(int i=;i<=n;i++){
f3=(A*f2+B*f1)%;
f1=f2;f2=f3;
}
printf("%lld\n",f2);
fclose(stdin);fclose(stdout);
return ;
}
ans.t[][]=;ans.t[][]=B;ans.t[][]=;ans.t[][]=A;
ans=maxtix_mul(ans,n-);
printf("%d\n",(ans.t[][]+ans.t[][])%);
fclose(stdin);fclose(stdout);
return ;
}
AC
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <set> #define rg register
inline void read (int &n)
{
rg char c = getchar ();
for (n = ; !isdigit (c); c = getchar ());
for (; isdigit (c); n = n * + c - '', c = getchar ());
} #define Max 20006
int a[Max], s[Max];
std :: string data;
std :: set <std :: string> lis; int main (int argc, char *argv[])
{
// freopen ("tb.txt", "w", stdout);
int T, x, y, N, C, r ; rg int i;
for (x = ; x <= ; ++ x)
{
for (y = ; y <= x; ++ y)
{
N = x + y;
data.resize (N); C = , r = ;
printf ("%d %d ", x, y);
if (y == ) { puts ("1.000000"); continue; }
if (x == ) { puts ("0.000000"); continue; } if (y > x) { puts ("0.000000"); continue; }
for (i = ; i <= x; ++ i) a[i] = ;
for (i = x + ; i <= N; ++ i) a[i] = ;
do
{
// for (i = 0; i < N; ++ i) data[i] = a[i + 1] - '0';
// if (lis.count (data)) continue;
// else lis.insert (data); s[N + 1] = 0;
for (i = N; i >= ; -- i)
{
s[i] = s[i + ] + a[i];
if (s[i] > (N - i + ) - s[i]) { ++ r; break; }
}
++ C;
} while (std :: next_permutation (a + , a + + N));
printf ("%.6lf\n", (C - r) * 1.0 / C);
// puts ("");
}
}
return ;
}
ZlycerQan打表code
打表找规律 n相同m不同时是等差数列。
注意特判
#include<iostream>
#include<cstdio>
using namespace std; int t,n,m; int main(){
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
if(n<m){puts("0.000000");continue;}
printf("%.6lf\n",1.0-m/(n+1.0));
}
}
AC
题解:
暴力40
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#define N 20009
using namespace std;
queue<int>q;
int n,m,sumedge; int head[N]; int sum_col,tim,top; int instack[N],Stack[N],bel[N],low[N],dfn[N],ans[N]; int sumEDge,hed[N],d[N],vis[N],dis[N],cnt[N],po[N]; struct Edge{
int x,y,z,nxt;
Edge(int x=,int y=,int z=,int nxt=):
x(x),y(y),z(z),nxt(nxt){}
}edge[(N*)<<]; void add(int x,int y,int z){
edge[++sumedge]=Edge(x,y,z,head[x]);
head[x]=sumedge;
} struct EDge{
int x,y,z,nxt;
EDge(int x=,int y=,int z=,int nxt=):
x(x),y(y),z(z),nxt(nxt){}
}e[N<<]; void add_(int x,int y,int z){
e[++sumEDge]=EDge(x,y,z,hed[x]);
hed[x]=sumEDge;
} inline int read(){
char ch=getchar();int x=,f=;
for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';
return x*f;
} void tarjian(int x,int fa){
low[x]=dfn[x]=++tim;
instack[x]=true;Stack[++top]=x;
for(int i=head[x];i;i=edge[i].nxt){
int v=edge[i].y;
// if(v==fa)continue;
if(instack[v]&&v!=fa){
low[x]=min(low[x],dfn[v]);
}else if(dfn[v]==){
tarjian(v,x);
low[x]=min(low[x],low[v]);
}
}
if(low[x]==dfn[x]){
sum_col++;
while(Stack[top+]!=x){
bel[Stack[top]]=sum_col;
instack[Stack[top]]=false;
top--;
}
}
} void spfa(int s){
memset(vis,,sizeof(vis));
memset(dis,0x3f,sizeof(dis));
while(!q.empty())q.pop();
dis[s]=;vis[s]=true;q.push(s);
while(!q.empty()){
int now=q.front();q.pop();vis[now]=false;
for(int i=hed[now];i;i=e[i].nxt){
int v=e[i].y;
if(dis[v]>dis[now]+e[i].z){
dis[v]=dis[now]+e[i].z;
ans[s]=max(ans[s],dis[v]);
if(vis[v]==){
vis[v]=true;q.push(v);
}
}
}
}
} int main(){
// freopen("prize.in","r",stdin);
// freopen("prize.out","w",stdout);
n=read();m=read();
for(int i=;i<=m;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);add(y,x,z);
}
tarjian(,);
// cout<<sum_col<<endl;
for(int x=;x<=n;x++){
for(int i=head[x];i;i=edge[i].nxt){
int v=edge[i].y;
if(bel[v]!=bel[x]&&(po[bel[v]]==||po[bel[x]]==)){
cnt[bel[x]]++;cnt[bel[v]]++;po[bel[v]]=true;po[bel[x]]=true;
add_(bel[v],bel[x],edge[i].z);add_(bel[x],bel[v],edge[i].z);
d[bel[x]]++;d[bel[v]]++;
}
}
}
for(int i=;i<=sum_col;i++)spfa(i);
for(int i=;i<=n;i++)printf("%d\n",ans[bel[i]]);
// fclose(stdin);fclose(stdout);
return ;
}
40
缩点后就是一棵树 ,某个点到树直径的两端距离最大值就是答案
边没判重一直死循环,我觉得重边没关系呀,保险还是判重吧。
#include<cstdio>
#include<cstring>
#include<map>
#include<iostream>
#include<algorithm>
#define N 20010
using namespace std;
map<int,int>ma[N];
int n,m; int sumedge,head[N]; int top,tim,sumcol; int bel[N],Stack[N],instack[N],dfn[N],low[N]; int sume,hed[N]; int maxn,t,d1,d2,dis1[N],dis2[N]; struct Edge{
int x,y,z,nxt;
Edge(int x=,int y=,int z=,int nxt=):
x(x),y(y),z(z),nxt(nxt){}
}edge[(N*)<<]; struct EDGE{
int x,y,z,nxt;
EDGE(int x=,int y=,int z=,int nxt=):
x(x),y(y),z(z),nxt(nxt){}
}e[(N*)<<]; void add(int x,int y,int z){
edge[++sumedge]=Edge(x,y,z,head[x]);
head[x]=sumedge;
} void add_(int x,int y,int z){
e[++sume]=EDGE(x,y,z,hed[x]);
hed[x]=sume;
} void tarjian(int x,int fa){
low[x]=dfn[x]=++tim;
Stack[++top]=x;instack[x]=true;
for(int i=head[x];i;i=edge[i].nxt){
int v=edge[i].y;
if(instack[v]&&v!=fa)low[x]=min(low[x],dfn[v]);
else if(!dfn[v]){
tarjian(v,x);
low[x]=min(low[x],low[v]);
}
}
if(low[x]==dfn[x]){
sumcol++;
while(Stack[top+]!=x){
bel[Stack[top]]=sumcol;
instack[Stack[top]]=false;
top--;
}
}
} void dfs(int x,int fa){
for(int i=hed[x];i;i=e[i].nxt){
int v=e[i].y;
if(v==fa)continue;
dis1[v]=dis1[x]+e[i].z;
if(dis1[v]>maxn)maxn=dis1[v],t=v;
dfs(v,x);
}
} void dfs_(int x,int fa){
for(int i=hed[x];i;i=e[i].nxt){
int v=e[i].y;
if(v==fa)continue;
dis2[v]=dis2[x]+e[i].z;
dfs_(v,x);
}
} int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);add(y,x,z);
}
for(int i=;i<=n;i++)if(!dfn[i])tarjian(i,-);
for(int x=;x<=n;x++){
for(int i=head[x];i;i=edge[i].nxt){
int v=edge[i].y;
if(bel[x]!=bel[v])
if(ma[bel[x]].find(bel[v])==ma[bel[x]].end()){
ma[bel[x]][bel[v]]=;
ma[bel[v]][bel[x]]=;
add_(bel[x],bel[v],edge[i].z);
add_(bel[v],bel[x],edge[i].z);
}
}
}
dfs(,-);
d1=t;memset(dis1,,sizeof(dis1));maxn=;
dfs(d1,-);
d2=t;
dfs_(d2,-);
for(int i=;i<=n;i++)printf("%d\n",max(dis1[bel[i]],dis2[bel[i]]));
return ;
}
11.7noip模拟赛的更多相关文章
- 11.7NOIP模拟赛解题报告
心路历程 预计得分:\(50 + 100 + 100\) 实际得分:\(50 + 100 +100\) T2 T3两道数据结构题美滋滋,然而写完就过去\(3h\)美滋滋 T1数学题学弟们都会做Orzz ...
- 9.11 myl模拟赛
9.11 myl 模拟赛 100 + 100 + 0 第一题耗费了太多的时间,导致最后一题没有时间想,直接去写了暴力,而且出题人没有给暴力分.... Problem 1. superman [题目描述 ...
- 2017.6.11 NOIP模拟赛
题目链接: http://files.cnblogs.com/files/TheRoadToTheGold/2017-6.11NOIP%E6%A8%A1%E6%8B%9F%E8%B5%9B.zip 期 ...
- 11.17 模拟赛&&day-2
/* 后天就要复赛了啊啊啊啊啊. 可能是因为我是一个比较念旧的人吧. 讲真 还真是有点不舍. 转眼间一年的时间就过去了. 2015.12-2016.11. OI的一年. NOIP gryz RP++. ...
- 2014.11.12模拟赛【美妙的数字】| vijos1904学姐的幸运数字
美妙的数字(number.c/.cpp/.pas) 题目描述 黄巨大认为非负整数是美妙的,并且它的数值越小就越美妙.当然0是最美妙的啦. 现在他得到一串非负整数,对于每个数都可以选择先对它做二进制非运 ...
- 2014.11.12模拟赛【最小公倍数】| vijos1047最小公倍数
最小公倍数(lcm.c/.cpp/.pas) 题目描述 给定两个正整数,求他们的最小公倍数. 样例输入 28 12 样例输出 84 数据范围 对于40%数据:1<=a,b<=10^9 对于 ...
- 11.6NOIP模拟赛解题报告
心路历程 预计得分:\(100 + 100 + 100 = 300\) 实际得分:\(100 +100 +100 = 300\) 学OI两年终于AK了一次qwq(虽然题目炒鸡水..) 纪念一下这令人激 ...
- 11.5NOIP模拟赛解题报告
心路历程 预计得分:\(100 + 40 + 30 = 170\) 实际得分:\(100 +100 + 50 = 250\) 辣鸡数据毁我青春 T1一眼不会做感觉要凉 T2好像一波折半搜索就做完了 T ...
- 11.1NOIP模拟赛解题报告
心路历程 预计得分:\(100 + 100 + 50\) 实际得分:\(100 + 100 + 50\) 感觉老师找的题有点水呀. 上来看T1,woc?裸的等比数列求和?然而我不会公式呀..感觉要凉 ...
随机推荐
- 多线程、多进程、协程、IO多路复用请求百度
最近学习了多线程.多进程.协程以及IO多路复用,那么对于爬取数据来说,这几个方式哪个最快呢,今天就来稍微测试一下 普通方式请求百度5次 import socket import time import ...
- 用“倍增法”求最近公共祖先(LCA)
1.最近公共祖先:对于有根树T的两个结点u.v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u.的祖先且x的深度尽可能大. 2.朴素算法:记录下每个节点的父亲,使节点u,v一步一步地向上找 ...
- CocoaPods学习系列2——使自己的项目支持CocoaPods管理
该篇记录使自己的项目支持CocoaPods管理. 要达到这一目的,需要如下步骤: 1.将自己的项目提交到github,添加开源协议license 2.添加podspec文件 3.验证podspec,成 ...
- iOS CoreData (二) 版本升级和数据库迁移
前言:最近ChinaDaily项目需要迭代一个新版本,在这个版本中CoreData数据库模型上有新增表.实体字段的增加,那么在用户覆盖安装程序时就必须要进行CoreData数据库的版本升级和旧数据迁移 ...
- github上十二款最著名的Android播放器开源项目
1.ijkplayer 项目地址: https://github.com/Bilibili/ijkplayer 介绍:Ijkplayer 是Bilibili发布的基于 FFplay 的轻量级 Andr ...
- ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2018) Syria, Lattakia, Tishreen University, April, 30, 2018
ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2018) Syr ...
- C语言小知识点汇集
1. 三元表达式“?:”冒号两边的两个操作数类型必须一致. 2. 枚举变量的sizeof值同int型一样为4. 3. 为了消除不必要的计算 &&两侧的表达式,当左侧即第1个表达式不成立 ...
- MS Project 如何删除前置任务
- 014——VUE中v-if语法在网站注册中的实际应用
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 019对象——对象 method_exists property_exists instanceof
<?php /** * 19 对象 method_exists property_exists instanceof */ //method_exists() 判断方法是否存在,第一个参数对象或 ...