更好的阅读体验

我的博客观看

T1-Pie or die

Volodya和Vlad在玩下面的这个游戏。这里有k个派,分布在n×m的板子上。每一回合Volodya移动一个派到这个派边界的格子,如果这个派在板子的边界,Volodya就可以把它移出板,得到这个派并且获胜。在Volodya移动之后,Vlad在板的边界放一个长度为1的挡板,然后Volodya就不能把派从挡住的边移出。 请问,Volodya会赢得这次比赛吗?(我们假设两个玩家都无比聪明)

解法

明显的贪心,如果已经在边界上有派了,能赢

如果没有的话,显然只能走到边角获胜

看离边界最近的距离是否超过4,如果不超过4,对手无法封锁全部边角,能赢

如果超过4,对手能封锁所有边角,输了

ac代码

#include<bits/stdc++.h>
using namespace std;
int n,m,k,x,y,flg=1;
int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=k;i++)
{
scanf("%d%d",&x,&y);
if(x==1||x==n||y==1||y==m)flg=0;
if(x-1<=4||n-x<=4||y-1<=4||m-y<=4)flg=0;
}
if(flg)puts("NO");else puts("YES");
return 0;
}

T2-Beautiful numbers

Volodya是一个很皮的男♂孩。他认为一个能被它自己的每一位数上的数整除的数是很妙的。我们先忽略他的想法的正确性(如需证明请百度“神奇海螺”),只回答在l到r之间有多少个很妙的数字。

解法

数位dp,和记忆化搜索很相似

我们设dp[i][j][k]表示当前的数为i位,mod 2520为j,当前数的每一位数的lcm为k的答案种类

发现要存18×2520×2520,可能会爆,就预处理出所有可能的lcm,就可以简化为50左右了

至于数位dp,主要处理上限,如果前面几位不是上限的前几位,后面没有限制,可以记忆化搜索

如果前面几位和上限一样,这一位就不能都取,不能记忆化,相当于多扫一层

复杂度不太清楚,大概是O(能过),(大雾

ac代码

#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll T,l,r,cnt=0,w[20],mp[3000],dp[20][3000][50];
ll gcd(ll a,ll b){return b==0?a:gcd(b,a%b);}
ll dfs(int len,int pre,int mod,int lim)
{
if(!len)return pre%mod==0;
if(!lim&&dp[len][pre][mp[mod]]!=-1)return dp[len][pre][mp[mod]];
ll res=0,maxx=lim?w[len]:9;
for(int i=0;i<=maxx;i++)
res+=dfs(len-1,(pre*10+i)%2520,i==0?mod:mod*i/gcd(mod,i),lim&&i==maxx);
if(!lim)dp[len][pre][mp[mod]]=res;
return res;
}
ll calc(ll n,ll len)
{
while(n){w[++len]=n%10,n/=10;}
return dfs(len,0,1,1);
}
int main()
{
for(int i=1;i<=2520;i++)if(2520%i==0)mp[i]=++cnt;
memset(dp,-1,sizeof(dp)),scanf("%lld",&T);
while(T--){scanf("%lld%lld",&l,&r),printf("%lld\n",calc(r,0)-calc(l-1,0));}
return 0;
}

T3-Geometry Horse

给定n种物品,每种物品有Ki个,价值为Ci,摧毁一个物品的贡献为Ci×f

f为贡献因子,有一个长度为t的单调递增序列p,当前摧毁的物品若超过p[i],则贡献因子f=i+1

求最大贡献

解法

主要题意好难读懂啊emm

读懂之后,是一个比T1还显然的贪心,让价值小的先摧毁,价值大的后摧毁,模拟一遍=-=

ac代码

#include<bits/stdc++.h>
#define ll long long
#define inf 2333333333333333333
using namespace std;
struct node{int k,c;}a[110];
int n,m,nw=1;
ll ans=0,p[110];
int cmp(node x,node y){return x.c<y.c;}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d%d",&a[i].k,&a[i].c);
scanf("%d",&m);
for(int i=1;i<=m;i++)scanf("%lld",&p[i]);
for(int i=m;i>1;i--)p[i]-=p[i-1];
p[m+1]=inf;
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++)
{
while(a[i].k>p[nw])ans+=1ll*nw*a[i].c*p[nw],a[i].k-=p[nw],nw++;
ans+=1ll*nw*a[i].c*a[i].k,p[nw]-=a[i].k;
}
printf("%lld\n",ans);
return 0;
}

T4-Plane of Tanks: Duel

坦克的属性:血量,攻击间隔,攻击下限与上限,攻击不命中的概率

现有2个坦克,求第一个坦克获胜的概率(当2个坦克同时死亡时,算第一个坦克获胜)

解法

可以模拟,但是发现如果2个坦克一直没打中,会停不下来=-=

看到题目的精度要求,可以这样做,一直模拟直到1个坦克的存活率低于eps,然后停止

稍微调一调精度就能过,主要是dp模拟坦克的行动,并且分开处理

ac代码

#include<bits/stdc++.h>
#define eps (1e-8)
using namespace std;
double dp[2][10010][210],p[2],ans;
int n,x,y,a[2],t[2],l[2],r[2];
int main()
{
for(int i=0;i<2;i++)scanf("%d%d%d%d%lf",&a[i],&t[i],&l[i],&r[i],&p[i]);
if(abs(p[0]-100.0)<eps){puts("0.000000");return 0;}
if(abs(p[1]-100.0)<eps){puts("1.000000");return 0;}
dp[0][0][a[0]]=dp[1][0][a[1]]=1,p[0]/=100.0,p[1]/=100.0;
for(x=1;x<=10000;x++)
{
for(int i=0;i<2;i++)for(int j=1;j<=a[i];j++)
{
if(dp[i][x-1][j]<=eps)continue;
for(int k=l[i^1];k<=r[i^1];k++)
dp[i][x][max(0,j-k)]+=dp[i][x-1][j]*(1-p[i^1])/(r[i^1]-l[i^1]+1);
dp[i][x][j]+=dp[i][x-1][j]*p[i^1];
}
dp[0][x][0]+=dp[0][x-1][0];
}
for(int i=1;i<=x;i++)
{
y=((i-1)*t[0]+t[1]-1)/t[1];
if(y>x)break;
ans+=(1-dp[0][y][0])*dp[1][i][0];
}
printf("%.6lf\n",ans);
return 0;
}

T5-Alphabet Permutations

给定一个长度为n(n<200000)的字符串s,有两种指令:

1.将区间[L,R]内的字符变为ch

2.给定长度为k(1<=k<=10)的字符串排列t,向s串中添加字符,使得s以t为模式循环,求最少的循环次数

最多20000条指令

解法

建一棵线段树,在每个节点里放一个k^2的数组,记录两个ch直接相连的情况,操作1就是区间修改

至于询问,记录一下每个字母在模式串中的出现位置,即rk,当rk[i]>rk[j]时ans+=[1][i][j]

即当一个字母在另一个字母的后面时,与它相连的另一个字母一定会跳转到下一个模式串,即1的贡献

ac代码

#include<bits/stdc++.h>
#define mem(a) memset(a,0,sizeof(a))
#define mid ((l+r)>>1)
using namespace std;
char ch;
int n,m,k,c,l,r,ans,rk[10],a[800010][10][10],tg[800010],lc[800010],rc[800010];
void f(int x,int c,int len){mem(a[x]),a[x][c][c]=len-1,lc[x]=rc[x]=tg[x]=c;}
void down(int x,int l,int r){if(tg[x]>-1)f(x<<1,tg[x],mid-l+1),f(x<<1|1,tg[x],r-mid);}
void upd(int x)
{
int l=x<<1,r=x<<1|1;
for(int i=0;i<k;i++)for(int j=0;j<k;j++)a[x][i][j]=a[l][i][j]+a[r][i][j];
a[x][rc[l]][lc[r]]++,lc[x]=lc[l],rc[x]=rc[r];
}
void build(int x,int l,int r)
{
if(l==r){scanf(" %c",&ch),lc[x]=rc[x]=ch-'a';return;}
build(x<<1,l,mid),build(x<<1|1,mid+1,r),upd(x);
}
void modify(int x,int l,int r,int p,int q,int d)
{
if(l>=p&&r<=q){f(x,d,r-l+1);return;}else if(l>q||r<p)return;
down(x,l,r),tg[x]=-1,modify(x<<1,l,mid,p,q,d),modify(x<<1|1,mid+1,r,p,q,d),upd(x);
}
int main()
{
memset(tg,-1,sizeof(tg)),scanf("%d%d%d",&n,&m,&k),build(1,1,n);
for(int i=1;i<=m;i++)
{
scanf("%d",&c),ans=0;
if(c==1)scanf("%d%d %c",&l,&r,&ch),modify(1,1,n,l,r,ch-'a');
else
{
for(int i=0;i<k;i++)scanf(" %c",&ch),rk[ch-'a']=i;
for(int i=0;i<k;i++)for(int j=0;j<k;j++)if(rk[i]>=rk[j])ans+=a[1][i][j];
printf("%d\n",ans+1);
}
}
return 0;
}

hgoi#20190515的更多相关文章

  1. HGOI 20181028 题解

    HGOI 20181028(复赛备考) /* 真是暴力的一天,最后一题MLE?由于数组开得太大了!!! 270滚粗 考场上好像智商高了很多?!(假的) */ sol:暴力求解,然后没有数据范围吐槽一下 ...

  2. HGOI NOIP模拟4 题解

    NOIP国庆模拟赛Day5 题解 T1 马里奥 题目描述 马里奥将要参加 NOIP 了,他现在在一片大陆上,这个大陆上有着许多浮空岛,并且其中一座浮空岛上有一个传送门,马里奥想要到达传送门从而前往 N ...

  3. [20190515]热备份模式与rman冲突.txt

    [20190515]热备份模式与rman冲突.txt --//别人的系统做dg时打开热备份模式,忘记关闭,做rman备份时报错.做一个记录.--//实际上也怪自己,实施时没有讲清楚.通过例子说明: 1 ...

  4. HGOI 20191106

    HGOI 20191106 t1 旅行家(traveller) 2s,256MB [题目背景] 小X热爱旅行,他梦想有一天可以环游全世界-- [题目描述] 现在小X拥有n种一次性空间转移装置,每种装置 ...

  5. 「HGOI#2019.4.19省选模拟赛」赛后总结

    t1-Painting 这道题目比较简单,但是我比较弱就只是写了一个链表合并和区间DP. 别人的贪心吊打我的DP,嘤嘤嘤. #include <bits/stdc++.h> #define ...

  6. HGOI 20190407 Typing Competition Round #1 出题记

    /* ljc20020730出的HGOI20190407的模拟赛. 考试结果比预期难的不少,可能是由于本来计划5h的比赛打了4h吧. 就当普及组模拟赛好了... 难度大概4紫吧(弱省省选难度) 出境 ...

  7. HGOI 20190310 题解

    /* 又是又双叒叕WA的一天... 我太弱鸡了... 今天上午打了4道CF */ Problem 1 meaning 给出q组询问,求下列函数的值$ f(a) = \max\limits_{0 < ...

  8. [hgoi#2019/3/21]NOIP&NOI赛后总结

    前言 今天做的是是2010年提高组和NOI的题目,做过几道原题,但是还是爆炸了,我真的太弱了. t1-乌龟棋 https://www.luogu.org/problemnew/show/P1541 这 ...

  9. HGOI 20190303 题解

    /* 记一串数字真难. 5435 今天比赛又是hjcAK的一天. 今天开题顺序是312,在搞T1之前搞了T3 昨天某谷月赛真是毒瘤. 但是讲评的同学不错,起码T4看懂了... 构造最优状态然后DP的思 ...

随机推荐

  1. 我是怎么做App token认证的

    使用Token来做身份认证在目前的移动客户端上非常流行,Token这个概念来源于OAuth认证,主要是在服务端实现.关于相关的原理,同学们自行百度.在这里,我简单介绍一下我是怎么具体实现的,重点描述t ...

  2. WPF 超长文本的来回滚动

    原文:WPF 超长文本的来回滚动 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Vblegend_2013/article/details/8362 ...

  3. IT 达人

    1. 手机与电脑多屏互动 [教程]华为多屏互动功能与PC win7的连接 要求手机和电脑必须在同一局域网内,且手机必须支持多屏互动功能. 操作步骤如下: PC 端: services.msc,启动下面 ...

  4. Lua学习 2) —— Android与Lua互调

    2014-07-09 一.Android类调用lua并回调 Android调用Lua函数,同一时候把类作为參数传递过去.然后再Lua中回调类的函数 调用lua mLuaState = LuaState ...

  5. Matlab随笔之矩阵入门知识

    原文:Matlab随笔之矩阵入门知识 直接输入法创建矩阵 – 矩阵的所有元素必须放在方括号“[ ]”内: – 矩阵列元素之间必须用逗号“,”或空格隔开,每行必须用“;”隔开 – 矩阵元素可以是任何不含 ...

  6. .net reactor 学习系列(二)---.net reactor界面各功能说明

    原文:.net reactor 学习系列(二)---.net reactor界面各功能说明         安装了.net reactor之后,可以在安装目录下找到帮助文档REACTOR_HELP.c ...

  7. .net reactor 学习系列(一)---.net reactor介绍

    原文:.net reactor 学习系列(一)---.net reactor介绍       学习.net已经一年多了,从语言的编写到框架类库的运用再到.net三大解决方案的了解(WF,WCF,WPF ...

  8. docker端口映射或启动容器时报错Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen

    现象: [root@localhost ~]# docker run -d -p 9000:80 centos:httpd /bin/sh -c /usr/local/bin/start.shd5b2 ...

  9. WPF ContextMenu 在MVVM模式中绑定 Command及使用CommandParameter传参

    原文:WPF ContextMenu 在MVVM模式中绑定 Command及使用CommandParameter传参 ContextMenu无论定义在.cs或.xaml文件中,都不继承父级的DataC ...

  10. EF CodeFirst的步骤

    1 创建各个实体类 2 创建一个空数据模型,然后删除掉,为了引入Entity Framework和System.Data.Entity 3 为实体类增加标注 4 为实体增加导航属性 5 在App.co ...