得分: \(100+5+100=205\)(真的是出乎意料)

\(T1\):抵制克苏恩(点此看题面

原题: 【BZOJ4832】[Lydsy1704月赛] 抵制克苏恩

应该还是一个比较简单的\(DP\)吧(我是用记忆化搜索实现的)。

可以用\(f_{n,A,B,C}\)来表示还有\(n\)个回合三种血量奴隶主个数分别为\(A,B,C\)时所造成的期望伤害

比较显然,应该有四种情况:

  • 第一种情况:对一血奴隶主造成伤害。这样就杀死了一个一血奴隶主,且不会增加新的奴隶主,因此可以将\(f_{n,A,B,C}\)加上\(\frac A{A+B+C+1}f_{n-1,A-1,B,C}\)。
  • 第二种情况:对二血奴隶主造成伤害。此时要分情况讨论:
    • \(A+B+C<7\):这样相当于将一血奴隶主个数加\(1\),二血奴隶主个数减\(1\),并增加一个新的三血奴隶主,因此将\(f_{n,A,B,C}\)加上\(\frac B{A+B+C+1}f_{n-1,A+1,B-1,C+1}\)。
    • \(A+B+C=7\):这样相当于将一血奴隶主个数加\(1\),二血奴隶主个数减\(1\),由于奴隶主个数已满,故不增加新的奴隶主,因此将\(f_{n,A,B,C}\)加上\(\frac B{A+B+C+1}f_{n-1,A+1,B-1,C}\)。
  • 第三种情况:对三血奴隶主造成伤害。此时也要分类讨论:
    • \(A+B+C<7\):这样相当于将二血奴隶主个数加\(1\),三血奴隶主个数不变,因此将\(f_{n,A,B,C}\)加上\(\frac C{A+B+C+1}f_{n-1,A,B+1,C}\)。
    • \(A+B+C=7\):这样相当于将二血奴隶主个数加\(1\),三血奴隶主个数减\(1\),因此将\(f_{n,A,B,C}\)加上\(\frac C{A+B+C+1}f_{n-1,A,B+1,C-1}\)。
  • 第四种情况:对英雄造成伤害。则场上各血量奴隶主个数不变,且对英雄造成伤害加\(1\),因此将\(f_{n,A,B,C}\)加上\(\frac1{A+B+C+1}(f_{n-1,A,B,C}+1)\)。

代码实现还是比较简单的:

#include<bits/stdc++.h>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
#define uint unsigned int
#define LL long long
#define ull unsigned long long
#define swap(x,y) (x^=y,y^=x,x^=y)
#define abs(x) ((x)<0?-(x):(x))
#define INF 1e9
#define Inc(x,y) ((x+=(y))>=MOD&&(x-=MOD))
#define ten(x) ((x<<3)+(x<<1))
#define N 50
using namespace std;
int n,A,B,C;
class FIO
{
private:
#define Fsize 100000
#define tc() (FinNow==FinEnd&&(FinEnd=(FinNow=Fin)+fread(Fin,1,Fsize,stdin),FinNow==FinEnd)?EOF:*FinNow++)
#define pc(ch) (FoutSize<Fsize?Fout[FoutSize++]=ch:(fwrite(Fout,1,FoutSize,stdout),Fout[(FoutSize=0)++]=ch))
int f,FoutSize,OutputTop;char ch,Fin[Fsize],*FinNow,*FinEnd,Fout[Fsize],OutputStack[Fsize];
public:
FIO() {FinNow=FinEnd=Fin;}
inline void read(int &x) {x=0,f=1;while(!isdigit(ch=tc())) f=ch^'-'?1:-1;while(x=ten(x)+(ch&15),isdigit(ch=tc()));x*=f;}
inline void read_char(char &x) {while(isspace(x=tc()));}
inline void read_string(string &x) {x="";while(isspace(ch=tc()));while(x+=ch,!isspace(ch=tc())) if(!~ch) return;}
inline void write(int x) {if(!x) return (void)pc('0');if(x<0) pc('-'),x=-x;while(x) OutputStack[++OutputTop]=x%10+48,x/=10;while(OutputTop) pc(OutputStack[OutputTop]),--OutputTop;}
inline void write_char(char x) {pc(x);}
inline void write_string(string x) {register int i,len=x.length();for(i=0;i<len;++i) pc(x[i]);}
inline void end() {fwrite(Fout,1,FoutSize,stdout);}
}F;
class Class_DFS//记忆化搜索
{
private:
#define eps 1e-10
double f[N+5][10][10][10];//用f[n][A][B][C]来表示还有n个回合,三种血量奴隶主个数分别为A,B,C时所造成的期望伤害
public:
inline double GetAns(int n,int A,int B,int C)//记忆化搜索
{
if(!n||A<0||B<0||C<0) return 0;//如果剩余回合数为0或当前状态不合法,返回0
if(f[n][A][B][C]>eps) return f[n][A][B][C];//如果已访问过当前状态,返回上次求解的答案
if(A+B+C<7) f[n][A][B][C]=(A*GetAns(n-1,A-1,B,C)+B*GetAns(n-1,A+1,B-1,C+1)+C*GetAns(n-1,A,B+1,C)+GetAns(n-1,A,B,C)+1)/(A+B+C+1);//对于A+B+C<7的情况
else f[n][A][B][C]=(A*GetAns(n-1,A-1,B,C)+B*GetAns(n-1,A+1,B-1,C)+C*GetAns(n-1,A,B+1,C-1)+GetAns(n-1,A,B,C)+1)/(A+B+C+1);//对于A+B+C=7的情况
return f[n][A][B][C];//返回
}
}DFS;
int main()
{
freopen("cthun.in","r",stdin),freopen("cthun.out","w",stdout);
register int i,T;F.read(T);
while(T--) F.read(n),F.read(A),F.read(B),F.read(C),printf("%.2lf\n",DFS.GetAns(n,A,B,C));//对于每组数据输出答案
return 0;
}

\(T2\):大数(点此看题面

原题: 【BZOJ4542】[HNOI2016] 大数

比赛时看到数据范围以及输入每次给出一个区间,而且可以离线做,于是瞬间想到了莫队算法

但是,想出了莫队,却不知道怎么去做(毕竟还需要一个玄学的转化),于是只好交了暴力。

考虑用\(S_{i,j}\)表示\(S\)的子串\(S[i...j]\)所表示的数字模\(P\)的余数,并用\(Front_i\)表示\(S\)的子串\(S[1...i]\)所表示的数字模\(P\)的余数。

则不难发现,如果\(P≠2\)且\(P≠5\)(这两种情况\(P\)较小,可以特判处理掉),\(S_{i,j}\equiv Front_j-Front_i(mod\) \(P)\)。

这样一来,要求出多少个\(S_{i,j}=0\),似乎就等价于求出有多少个\(Front_i=Front_j\)。

再说得明白一点,就相当于要求出一个区间内有多少对相等的数

于是就变成莫队裸题了。

代码如下:

#include<bits/stdc++.h>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
#define uint unsigned int
#define LL long long
#define ull unsigned long long
#define swap(x,y) (x^=y,y^=x,x^=y)
#define abs(x) ((x)<0?-(x):(x))
#define INF 1e9
#define Inc(x,y) ((x+=(y))>=MOD&&(x-=MOD))
#define ten(x) (((x)<<3)+((x)<<1))
#define N 100000
using namespace std;
int n,Q,p_num,MOD,block_size,a[N+5],p[N+5],bl[N+5],cnt[N+5];
LL res[N+5];
string st;
struct Query
{
int l,r,pos;
inline bool operator < (const Query x) const
{
return bl[l]^bl[x.l]?bl[l]<bl[x.l]:(bl[l]&1?r<x.r:r>x.r);
}
}q[N+5];
class FIO
{
private:
#define Fsize 100000
#define tc() (FinNow==FinEnd&&(FinEnd=(FinNow=Fin)+fread(Fin,1,Fsize,stdin),FinNow==FinEnd)?EOF:*FinNow++)
#define pc(ch) (FoutSize<Fsize?Fout[FoutSize++]=ch:(fwrite(Fout,1,FoutSize,stdout),Fout[(FoutSize=0)++]=ch))
int f,FoutSize,OutputTop;char ch,Fin[Fsize],*FinNow,*FinEnd,Fout[Fsize],OutputStack[Fsize];
public:
FIO() {FinNow=FinEnd=Fin;}
inline void read(int &x) {x=0,f=1;while(!isdigit(ch=tc())) f=ch^'-'?1:-1;while(x=ten(x)+(ch&15),isdigit(ch=tc()));x*=f;}
inline void read_char(char &x) {while(isspace(x=tc()));}
inline void read_string(string &x) {x="";while(isspace(ch=tc()));while(x+=ch,!isspace(ch=tc())) if(!~ch) return;}
inline void write(LL x) {if(!x) return (void)pc('0');if(x<0) pc('-'),x=-x;while(x) OutputStack[++OutputTop]=x%10+48,x/=10;while(OutputTop) pc(OutputStack[OutputTop]),--OutputTop;}
inline void write_char(char x) {pc(x);}
inline void write_string(string x) {register int i,len=x.length();for(i=0;i<len;++i) pc(x[i]);}
inline void end() {fwrite(Fout,1,FoutSize,stdout);}
}F;
class Key//对于P=2或P=5的情况特判处理
{
private:
int tot[N+5],sum[N+5];
public:
inline void Solve()
{
register int i,l,r;
for(i=1,n=st.length();i<=n;++i)//利用前缀和思想
{
sum[i]=sum[i-1],tot[i]=tot[i-1];
if((st[i-1]&15)%MOD==0) sum[i]+=i,++tot[i];
}
for(i=1;i<=Q;++i) F.read(l),F.read(r),F.write(sum[r]-sum[l-1]-(tot[r]-tot[l-1])*(l-1)),F.write_char('\n');
}
}S;
inline int find(int x)//求出一个元素离散化后的值
{
register int l=1,r=p_num,mid;
for(mid=l+r>>1;l<=r;mid=l+r>>1) p[mid]<x?l=mid+1:r=mid-1;//二分查找
return l;
}
int main()
{
register int i;register LL tn=1;
F.read(MOD),F.read_string(st),F.read(Q),n=st.length();
if(MOD==2||MOD==5) return S.Solve(),F.end(),0;//特判P=2或P=5的情况
for(block_size=sqrt(n),i=n;i;--i) p[i]=a[i]=(tn*(st[i-1]&15)%MOD+a[i+1])%MOD,tn=ten(tn)%MOD;//计算出从S[1...i]%P的值
for(sort(p+1,p+n+2),p_num=unique(p+1,p+n+2)-p-1,i=1;i<=n+1;++i) a[i]=find(a[i]);//离散化
for(i=1;i<=Q;++i) F.read(q[q[i].pos=i].l),F.read(q[i].r),bl[i]=(i-1)/block_size+1;//读入询问,并分块
int L=1,R=1;register LL ans=0;
for(sort(q+1,q+Q+1),cnt[a[1]]=i=1;i<=Q;++i)//将询问排序
{
++q[i].r;//将右边界加1
while(R<q[i].r) ++cnt[a[++R]],ans+=cnt[a[R]]-1;//莫队的基本操作
while(L>q[i].l) ++cnt[a[--L]],ans+=cnt[a[L]]-1;
while(R>q[i].r) ans-=cnt[a[R]]-1,--cnt[a[R--]];
while(L<q[i].l) ans-=cnt[a[L]]-1,--cnt[a[L++]];
res[q[i].pos]=ans;//存储答案
}
for(i=1;i<=Q;++i) F.write(res[i]),F.write_char('\n');//输出答案
return F.end(),0;
}

\(T3\):神奇项链(点此看题面

原题: 【BZOJ3790】神奇项链(权限题)

据说是 \(Manacher\)算法+贪心,但是,做这题时我还不会\(Manacher\)... ...

怎么办呢?只好写\(O(n^2)\)大暴力。

然而,数据太水,居然跑过了!?

既然是暴力,就不上代码了吧。更何况我懒得去打正解了。

2018.10.05 TOPOI提高组模拟赛 解题报告的更多相关文章

  1. ZROI提高组模拟赛05总结

    ZROI提高组模拟赛05总结 感觉是目前为止最简单的模拟赛了吧 但是依旧不尽人意... T1 有一半的人在30min前就A掉了 而我花了1h11min 就是一个简单的背包,我硬是转化了模型想了好久,生 ...

  2. NOIP2017提高组模拟赛 10 (总结)

    NOIP2017提高组模拟赛 10 (总结) 第一题 机密信息 FJ有个很奇怪的习惯,他把他所有的机密信息都存放在一个叫机密盘的磁盘分区里,然而这个机密盘中却没有一个文件,那他是怎么存放信息呢?聪明的 ...

  3. NOIP2017提高组 模拟赛15(总结)

    NOIP2017提高组 模拟赛15(总结) 第一题 讨厌整除的小明 [题目描述] 小明作为一个数学迷,总会出于数字的一些性质喜欢上某个数字,然而当他喜欢数字k的时候,却十分讨厌那些能够整除k而比k小的 ...

  4. NOIP2017提高组 模拟赛13(总结)

    NOIP2017提高组 模拟赛13(总结) 第一题 函数 [题目描述] [输入格式] 三个整数. 1≤t<10^9+7,2≤l≤r≤5*10^6 [输出格式] 一个整数. [输出样例] 2 2 ...

  5. NOIP2017提高组模拟赛 9 (总结)

    NOIP2017提高组模拟赛 9 (总结) 第一题 星星 天空中有N(1≤N≤400)颗星,每颗星有一个唯一的坐标(x,y),(1≤x,y ≤N).请计算可以覆盖至少K(1≤K≤N)颗星的矩形的最小面 ...

  6. NOIP2017提高组模拟赛5 (总结)

    NOIP2017提高组模拟赛5 (总结) 第一题 最远 奶牛们想建立一个新的城市.它们想建立一条长度为N (1 <= N <= 1,000,000)的 主线大街,然后建立K条 (2 < ...

  7. NOIP2017提高组模拟赛4 (总结)

    NOIP2017提高组模拟赛4 (总结) 第一题 约数 设K是一个正整数,设X是K的约数,且X不等于1也不等于K. 加了X后,K的值就变大了,你可以重复上面的步骤.例如K= 4,我们可以用上面的规则产 ...

  8. NOIP2017提高组模拟赛 8(总结)

    NOIP2017提高组模拟赛 8(总结) 第一题 路径 在二维坐标平面里有N个整数点,Bessie要访问这N个点.刚开始Bessie在点(0,0)处. 每一步,Bessie可以走到上.下.左.右四个点 ...

  9. NOIP2017提高组模拟赛 7(总结)

    NOIP2017提高组模拟赛 7(总结) 第一题 斯诺克 考虑这样一个斯诺克球台,它只有四个袋口,分别在四个角上(如下图所示).我们把所有桌子边界上的整数点作为击球点(除了4个袋口),在每个击球点我们 ...

随机推荐

  1. UPCOJ9526(SG函数打表,nim游戏异或规则)

    #include<bits/stdc++.h>using namespace std;int f[1007],SG[1007],S[1007];//f为可以选取的石头个数,SG为sg函数, ...

  2. go语言web开发框架_Iris框架讲解(五):MVC包使用

    在Iris框架中,封装了mvc包作为对mvc架构的支持,方便开发者遵循mvc的开发原则进行开发. iris框架支持请求数据.模型.持久数据分层处理,并支持各层级模块代码绑定执行. MVC即:model ...

  3. cogs 2123. [HZOI 2015] Glass Beads

    2123. [HZOI 2015] Glass Beads ★★★   输入文件:MinRepresentations.in   输出文件:MinRepresentations.out   简单对比时 ...

  4. jmeter-提取器之正则表达式提取器

    在接口测试中,有很多的接口参数值是需要从上一个接口的返回值中获取的,这个时候就可以用正则表达式提取器啦 例如: 接口1  /user/login 返回{ "user_ticket" ...

  5. MySQL常用配置和性能压力测试:MySQL系列之十五

    一.MySQL常用配置 以下所有配置参数以32G内存的服务器为基 1.打开独立的表空间 innodb_file_per_table = 1 2.MySQL服务所允许的同时会话数的上限,默认为151,经 ...

  6. tp5模型事件回调函数中不能使用$this

    tp5模型事件回调函数中不能使用$this,使用会报错,涉及到数据库操作使用Db类,不能使用$this->save()之类的方式 如果回调函数中需要使用类内函数,需要将函数定义为static,通 ...

  7. CODEVS 3027 线段覆盖2

    首先,先看题.....(虽然比较简单 3027 线段覆盖 2    时间限制: 1 s  空间限制: 128000 KB 题目描述 Description 数轴上有n条线段,线段的两端都是整数坐标,坐 ...

  8. Navicat连接MySQL数据库的一些问题与解决方案

    前言 安装MySQL数据库与Navicat并不算难事,关键是怎么让他们工作花费了我整整一天的时间,最终才把弄好.遇到各种各样的问题,上网看了大量博客,发现很多博客都是直接copy或者并不能非常好的解答 ...

  9. spring boot中ConditionalOnClass为什么没有classNotFound类加载异常

    查看原码时有很多飘红的地方, 这些import都失败的地方, 为什么在运行时没有报错? 首先这些@Configuration类没有被程序中的类引用到 其次即使引用到这个类,不一定引用到类中的具体某个方 ...

  10. (转)Web服务器磁盘满故障深入解析

    Web服务器磁盘满故障深入解析 原文:http://blog.51cto.com/oldboy/612351 ############################################# ...