18.9.22 noip模拟赛
此题为找规律。期望100 实际100
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
long long len1,len2;
long long n,s1,t1,s2,t2;
long long abss(long long x){
if(x<) return -x;
else return x;
}
long long maxx(long long x,long long y){
if(x>y) return x;
else return y;
}
int main(){
freopen("grid.in","r",stdin);
freopen("grid.out","w",stdout);
cin>>n>>s1>>t1>>s2>>t2;
len1=abss(s1-s2);len2=abss(t1-t2);
cout<<maxx(len1,len2)<<endl;
}
期望20~40 实际20 感觉第二部分的部分分可以枚举所有可行的字符串,然后判断是否可行,但是炸掉了。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int T,type,n,tot,num;
char s[];
string ans[];
void dfs(int be,string sbef){
string smid;
for(int i=be;i>=;i--){
smid+=s[i];
int lenn=smid.length();
if(type==){
if(smid!=sbef)
if(smid.length()==||smid.length()==){
ans[++num]=smid;
dfs(i-,smid);
}
}
else{
if(smid.length()==||smid.length()==){
ans[++num]=smid;
dfs(i-,smid);
}
}
if(smid.length()>) break;
}
}
int main(){
freopen("ling.in","r",stdin);
freopen("ling.out","w",stdout);
scanf("%d%d",&T,&type);
while(T--){
cin>>s;
int len=strlen(s);
if(len<=){
dfs(len-,"abcd");
for(int i=;i<=num;i++){
int lenn=ans[i].length();
string simm=ans[i];
for(int j=;j<lenn;j++)
ans[i][j]=simm[lenn-j-];
}
sort(ans+,ans++num);
for(int i=;i<=num;i++)
if(ans[i]!=ans[i-]) tot++;
cout<<tot<<endl;
for(int i=;i<=num;i++)
if(ans[i]!=ans[i-]) cout<<ans[i]<<endl;
num=;tot=;
}
else if(type==){
for(int i=len-;i>=;i-=){
string smid;
for(int j=i;j>=;j--){
smid+=s[j];
if(i-j==||i-j==)
ans[++num]=smid;
if(i-j>) break;
}
}
for(int i=len-;i>=;i-=){
string smid;
for(int j=i;j>=;j--){
smid+=s[j];
if(i-j==||i-j==)
ans[++num]=smid;
if(i-j>) break;
}
}
for(int i=;i<=num;i++){
int lenn=ans[i].length();
string simm=ans[i];
for(int j=;j<lenn;j++)
ans[i][j]=simm[lenn-j-];
}
sort(ans+,ans++num);
for(int i=;i<=num;i++)
if(ans[i]!=ans[i-]) tot++;
cout<<tot<<endl;
for(int i=;i<=num;i++)
if(ans[i]!=ans[i-]) cout<<ans[i]<<endl;
num=;tot=;
}
}
}
我们只要知道上次填的串多长,就可以知道上次使用的字符串。而且
对每个位置只需要知道它上次填2或3时是否可行。
f[i][2或3]表示当前到i,填以i开头、长度为2或3的后缀串是否可行。可以转移就记录答案。
如果typt!=0则不需要判后缀是否相同。
复杂度O(n) 。
为了方便可以把串反过来。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pc putchar
using namespace std;
const int N=;
bool f[N][],ok2[][],ok3[][][];
char s[N];
void Work(const int type){
memset(f,,sizeof f);
memset(ok2,,sizeof ok2), memset(ok3,,sizeof ok3);
scanf("%s",s+);
int n=strlen(s+);
std::reverse(s+,s++n);
int tot=; n-=;
if(n>=) f[][]=, ++tot, ok2[s[]-'a'][s[]-'a']=;
if(n>=) f[][]=, ++tot, ok3[s[]-'a'][s[]-'a'][s[]-'a']=;
for(int i=; i<=n; ++i){
int a=s[i]-'a', b=s[i-]-'a', c=s[i-]-'a';
if(f[i-][]||(f[i-][]&&(type||s[i]!=s[i-]||s[i-]!=s[i-]))){
f[i][]=;
if(!ok2[a][b]) ++tot, ok2[a][b]=;
}
if(f[i-][]||(f[i-][]&&(type||s[i]!=s[i-]||s[i-]!=s[i-]||s[i-]!=s[i-]))){
f[i][]=;
if(!ok3[a][b][c]) ++tot, ok3[a][b][c]=;
}
}
printf("%d\n",tot);
for(int i=; i<&&tot; ++i){
for(int j=; j<; ++j){
if(ok2[i][j]) --tot,pc(i+'a'),pc(j+'a'),pc('\n');
for(int k=; k<; ++k)
if(ok3[i][j][k]) --tot,pc(i+'a'),pc(j+'a'),pc(k+'a'),pc('\n');
}
}
}
int main(){
int T,type;
for(scanf("%d%d",&T,&type); T--; Work(type));
return ;
}
期望10 实际10
也就只会写他是条链的暴力了。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int T,q,num=,tot,deepmax;
long double ans;
int son[],deep[];
int to[],net[],head[];
void add(int u,int v){
to[++tot]=v;net[tot]=head[u];head[u]=tot;
}
long double pow(long double x,int num){
long double bns=x;
for(int i=;i<num;i++)
bns*=x;
return bns;
}
void work(int now,int de){
for(int i=head[now];i;i=net[i]){
deep[de]+=son[to[i]];
deepmax=(deepmax,de);
work(to[i],de+);
}
}
int main(){
freopen("threebody.in","r",stdin);
freopen("threebody.out","w",stdout);
scanf("%d%d",&T,&q);
if(q>&&q<=){
for(int i=;i<=q;i++){
int x,y;
scanf("%d%d",&x,&y);
if(x==) num++;
else if(x==){
for(int j=;j<num-y;j++)
ans+=pow(0.5,j+)*j;
ans+=pow(0.5,num-y)*(num-y);
printf("%.10lf\n",double(ans));
}
ans=;
}
}
else{
for(int i=;i<=q;i++){
int x,y;
scanf("%d%d",&x,&y);
if(x==){
num++;son[y]++;
add(y,num);
}
else if(x==){
deep[]=son[y];
work(y,);
/*for(int j=1;j<=deepmax;j++) cout<<deep[i]<<" ";cout<<endl;*/
for(int j=;j<=deepmax;j++){
long double bns=1.0;
for(int k=;k<=j;k++)
bns=bns*(-pow(0.5,deep[k]));
bns=bns*pow(0.5,deep[j+]);
ans+=bns*j;
}
printf("%.10lf\n",double(ans));
ans=;
}
}
}
}
/*
0 6
2 1
1 1
1 2
1 3
1 4
2 1
*/
std
首先我们不需要考虑很大的深度。假如换h=100 ,需要一条长100 的链,即至少同时存在100 条
边,概率为,非常小。设需考虑的最大高度。
对于询问,只要x 有一个子树的深度为h 且其它子树深度不超过 h,就可以用p(h)*h 更新答案。
所以记f[x ][h]表示以 x为根,deep[x]<=h 的概率。则答案为
考虑如何从 转移。每个子节点有两种情况,一是存在边,对f[x][h] 贡献 1/2*f[v][h-1]的概率;二是不存在该边,概率为1/2 。
类似多项式,把 项乘在一起,即
(比如,深度为0,对应 深度为1,对应 个 1/2与一个……)
复杂度 。
如果新建节点 ,则影响的点有
因为深度不超过70 ,所以暴力向上更新即可,也就是除掉之前的项,乘上新的项。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAX_H 60
#define MAXN 500010
using namespace std;
int T,Q,n,fa[MAXN];
double f[MAXN][MAX_H];
int main(){
n=;scanf("%d%d",&T,&Q);
for(int i=;i<MAX_H;i++) f[][i]=;
while(Q--){
int opt,x;
scanf("%d%d",&opt,&x);
if(opt==){
fa[++n]=x;
for(int i=;i<MAX_H;i++) f[n][i]=;
double tmp1=f[x][],tmp2;
f[x][]*=0.5;
for(int Fa=fa[x],i=;Fa&&i<MAX_H;Fa=fa[x=Fa],i++){
tmp2=f[Fa][i];
f[Fa][i]/=0.5+0.5*tmp1;
f[Fa][i]*=0.5+0.5*f[x][i-];
tmp1=tmp2;
}
}
else {
double ans=;
for(int i=;i<MAX_H;i++) ans+=(f[x][i]-f[x][i-])*i;
printf("%.10lf\n",ans);
}
}
}
18.9.22 noip模拟赛的更多相关文章
- 2018.9.22 NOIP模拟赛
*注意:这套题目应版权方要求,不得公示题面. 从这里开始 Problem A 妹子 Problem B 旅程 Problem C 老大 因为业务水平下滑太严重,去和高一考NOIP模拟,sad... P ...
- 【2019.7.22 NOIP模拟赛 T1】麦克斯韦妖(demon)(质因数分解+DP)
暴力\(DP\) 先考虑暴力\(DP\)该怎么写. 因为每个序列之后是否能加上新的节点只与其结尾有关,因此我们设\(f_i\)为以\(i\)为结尾的最长序列长度. 每次枚举一个前置状态,判断是否合法之 ...
- 5.22 noip模拟赛
本来我是不想写的,无奈不会写.蒟蒻 考场就是想不出来 今天得到了100分额外水过了100分我是真的失败.还有一个根本不会check 感觉自己非常之菜. 这道题是这样的 还行吧比较有意思 首先确立一个真 ...
- CH Round #48 - Streaming #3 (NOIP模拟赛Day1)
A.数三角形 题目:http://www.contesthunter.org/contest/CH%20Round%20%2348%20-%20Streaming%20%233%20(NOIP模拟赛D ...
- 10.16 NOIP模拟赛
目录 2018.10.16 NOIP模拟赛 A 购物shop B 期望exp(DP 期望 按位计算) C 魔法迷宫maze(状压 暴力) 考试代码 C 2018.10.16 NOIP模拟赛 时间:2h ...
- 【HHHOJ】NOIP模拟赛 捌 解题报告
点此进入比赛 得分: \(30+30+70=130\)(弱爆了) 排名: \(Rank\ 22\) \(Rating\):\(-31\) \(T1\):[HHHOJ260]「NOIP模拟赛 捌」Dig ...
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
随机推荐
- 使用Xamarin.Forms跨平台开发入门 Hello,Xamarin.Forms 第一部分 快速入门
本文介绍了如何使用VisualStudio开发Xamarin.Forms 应用程序和使用Xamarin.Forms开发应用的基础知识,包括了构建和发布Xamarin.Forms应用的工具,概念和步骤. ...
- ListView相关知识点
最近开发接触到了ListView控件,其实简单的需求基本上源生的都可以满足,下面总结一下开发过程中所遇到的关键点: 1.多级ListView联动,保存位置:即切换第一层ListView的item过程中 ...
- 笔试算法题(10):深度优先,广度优先以及层序遍历 & 第一个仅出现一次的字符
出题:要求实现层序遍历二元搜索树,并对比BFS与DFS的区别 分析:层序遍历也就是由上至下,从左到右的遍历每一层的节点,类似于BFS的策略,使用Queue可以实现,BFS不能用递归实现(由于每一层都需 ...
- 零基础入门学习Python(27)--集合:在我的世界里,你就是唯一
知识点 集合:set set和dict类似,也是一组key的集合,但不存储value.由于key不能重复,所以,在set中,没有重复的key. 集合中的元素的三个特征: 1)确定性(元素必须可hash ...
- node assert.equal()
浅测试,使用等于比较运算符(==)来比较 actual 和 expected 参数. const assert = require('assert'); assert.equal(1, 1); // ...
- 【面试题】LRU算法及编码实现LRU策略缓存
概念 LRU(least recently used)就是将最近不被访问的数据给淘汰掉,LRU基于一种假设:认为最近使用过的数据将来被使用的概率也大,最近没有被访问的数据将来被使用的概率比较低. 原理 ...
- 77-CCI,Commodity Channel Index,商品通道指标.(2015.7.1)
CCI,Commodity Channel Index 商品通道指标 Channel Index,商品通道指标.(2015.7.1)" title="77-CCI,Commodit ...
- LeetCode(56)Merge Intervals
题目 Given a collection of intervals, merge all overlapping intervals. For example, Given [1,3],[2,6], ...
- HDU 6446 Tree and Permutation(赛后补题)
>>传送门<< 分析:这个题是结束之后和老师他们讨论出来的,很神奇:刚写的时候一直没有注意到这个是一个树这个条件:和老师讨论出来的思路是,任意两个结点出现的次数是(n-1)!, ...
- PAT 1077. 互评成绩计算
PAT 1077. 互评成绩计算 在浙大的计算机专业课中,经常有互评分组报告这个环节.一个组上台介绍自己的工作,其他组在台下为其表现评分.最后这个组的互评成绩是这样计算的:所有其他组的评分中,去掉一个 ...