2018.08.15【2018提高组】模拟A组 比赛总结
总结
T1
这题我一看,哇!好简单啊!
直接建立每一个字母的映射就可以了。
我很快就打完了程序,跳到下一题。
等到比赛快结束时,我才发现了一个可怕的数据:
1
abcdefghijklmnopqrstuvwxyz
zyxwvutsrqponmlkjihgfedcba
这样每次无论把哪一种字母进行操作,代码中都会出现两个相同的字母——这意味着在以后的操作中,它们都会一起被修改。
我不知怎么办,只好估分0分,重交一次。
然而,出题人忽略了这种情况。
某DL特地判了这种情况,只拿了10分。
最后,我只拿了10分(What the hell?),搞了半天,发现原来是我打错了一个地方——我的映射数组只开到了[0..25],每次映射字母时,ASCLL码都要减去97,但是我某个地方却没有减97。
以后打题时,哪怕一道题目有多简单,都要打一下对拍,多测几个数据。不能再犯这样的错误了!
T2
比赛时打了个二分+SPFA,每一次把温度大于二分结果的路径删去,再跑一次SPFA计算最小温度和。结果TLE 50分了(数据真心毒)。
其实可以新建一个空图,将所有的边按温度排序。
每一次在图中加入一条新的边,并把所有与它温度相同的边加入到图中,直到起点和终点连通。
然后我们就得到了一个最小生成图,在图上跑一遍SPFA即可。
T3
比赛时打了\(w_i=0\)的情况的表,水了10分。
可以设\(f_{i,j}\)表示从i出发,走到i的子树中,再返回到i,用了j的时间的最大和;\(g_{i,j}\)表示从i出发,走到i的子树中不返回,用了j的时间的最大和;\(h_{i,j}\)表示从i的某个子树中出发,经过i(可多次经过),到达i的其它子树,用了j的时间的最大和。如下图,考虑加入红色子树(下面所说的原树都不包含红色子树)。
我们先考虑h的转移:
- \(h_{i,j}\)可以通过在原来的树中用k的时间走,再用j-k-t的时间在红色子树中走的和更新(为了方便,i与红色子树之间的连边长度设为t)。状态转移方程显然为
h[i][j]=max(h[i][j],h[now][k]+f[son][j-k-2*t]); - 相似地,可以得出方程
h[i][j]=max(h[i][j],f[i][k]+h[son][j-k-2*t]) - 其实可以从原树的某子树出发,经过点i,再到达红色子树(不返回),状态转移方程就为
h[i][j]=max(h[i][j],g[i][k]+g[son][j-k-t])为什么都用g?因为无论顺着走一条路或是倒着走一条路,其权值和都不会变。
可以发现,其他方法都不会更优(包括h+h的做法)
相似地,我们可以写出g和f的转移方程:
g[i][j]=max(g[i][j],g[i][k]+f[son][j-k-2*t]);
g[i][j]=max(g[i][j],f[i][k]+g[son][j-k-t]);
f[i][j]=max(f[i][j],f[i][k]+f[son][j-k-2*t])
注意一下DP的顺序(先h再g最后f),不然会WA(因为我们所用的\(f_{i,j}\)、\(g_{i,j}\)都是原树中的,若是先求出则会把红色子树也计算在内,搞不好会加两次红色子树,从而使答案出错)
标程
T1
#include<cstdio>
#include<cstring>
using namespace std;
#define minus 'a'
char a[1010],b[1010],turn[26];
int main()
{
freopen("copycat.in","r",stdin);
freopen("copycat.out","w",stdout);
int t,i,j,n,m;
char ch;bool bk;
scanf("%d\n",&t);
while(t--)
{
gets(a+1),gets(b+1);
n=strlen(a+1),m=strlen(b+1);
if(n!=m)
{
puts("0");
continue;
}
for(i=0;i<26;i++) turn[i]='\0';
for(i=1,bk=0;i<=n;i++) if(a[i]!=b[i])
{
if(b[i]<'a'||b[i]>'z'||a[i]<'a'||a[i]>'z')
{
bk=1;
break;
}
if(turn[a[i]-minus])
{
if(turn[a[i]-minus]!=b[i])
{
bk=1;
break;
}
}
else turn[a[i]-minus]=b[i];
}
if(bk) puts("0");
else puts("1");
}
return 0;
}
T2
#include<algorithm>
#include<cstdio>
#include<queue>
using namespace std;
#define ll long long
#define N 500010
#define M 1000010
#define inf 100000000000010ll
struct edge
{
ll end,lenth,temp,next;
}a[M<<1];
struct readIn
{
ll start,end,temp,lenth;
}input[M];
queue<ll>data;
ll first[N],dis[N],f[N],n,m,s,S,T,num;
char ch;bool exist[N];
ll getfather(ll k)
{
if(f[k]==k) return k;
return f[k]=getfather(f[k]);
}
bool cmp(readIn x,readIn y){return x.temp<y.temp;}
inline void read(ll &x)
{
while(ch=getchar(),ch<'0'||ch>'9');
x=ch-48;
while(ch=getchar(),ch>='0'&&ch<='9') x=x*10+ch-48;
}
inline void inc(ll x,ll y,ll z,ll t)
{
a[++s]=(edge){y,z,t,first[x]};
first[x]=s;
a[++s]=(edge){x,z,t,first[y]};
first[y]=s;
}
inline void spfa()
{
ll i,u,v;
dis[S]=0;data.push(S);
while(!data.empty())
{
u=data.front();
exist[u]=1;
data.pop();
for(i=first[u];i;i=a[i].next)
{
v=a[i].end;
if(a[i].temp<=num&&dis[v]>dis[u]+a[i].lenth)
{
dis[v]=dis[u]+a[i].lenth;
if(exist[v])
{
exist[v]=0;
data.push(v);
}
}
}
}
}
inline void Kruskal()
{
ll i,j;
for(i=0,j=1;getfather(S)!=getfather(T);i++)
{
for(;j<=m&&input[j].temp==i;j++)
{
inc(input[j].start,input[j].end,input[j].lenth,input[j].temp);
f[getfather(input[j].start)]=getfather(input[j].end);
}
if(j>m) break;
}
num=i;
if(num) num--;
}
int main()
{
freopen("running.in","r",stdin);
freopen("running.out","w",stdout);
ll i,j;
read(n),read(m);
for(i=1;i<=n;i++) f[i]=i,dis[i]=inf,exist[i]=1;
for(i=1;i<=m;i++)
{
read(input[i].start),read(input[i].end),
read(input[i].temp),read(input[i].lenth);
input[i].lenth*=input[i].temp;
}
read(S),read(T);
sort(input+1,input+m+1,cmp);
Kruskal();spfa();
printf("%lld %lld\n",num,dis[T]);
return 0;
}
T3
#include<cstdio>
#include<cstring>
using namespace std;
#define N 305
struct edge
{
int end,lenth,next;
}a[N<<1];
int first[N],t[N],w[N],f[N][N],g[N][N],h[N][N],n,m,s,ans;
inline void inc(int x,int y,int z)
{
a[++s]=(edge){y,z,first[x]};
first[x]=s;
a[++s]=(edge){x,z,first[y]};
first[y]=s;
}
inline int max(int x,int y){return x>y?x:y;}
void dfs(int now,int from)
{
f[now][t[now]]=g[now][t[now]]=h[now][t[now]]=w[now];
int i,j,k,t;
for(i=first[now];i;i=a[i].next)
if(a[i].end!=from)
{
dfs(a[i].end,now);
for(j=m;j>=a[i].lenth;j--)
for(k=j-a[i].lenth;k>=0;k--)
{
if(j-k-2*a[i].lenth>=0)
h[now][j]=max(h[now][j],h[now][k]+f[a[i].end][j-k-2*a[i].lenth]);
h[now][j]=max(h[now][j],g[now][k]+g[a[i].end][j-k-a[i].lenth]);
if(j-k-2*a[i].lenth>=0)
h[now][j]=max(h[now][j],f[now][k]+h[a[i].end][j-k-2*a[i].lenth]),
g[now][j]=max(g[now][j],g[now][k]+f[a[i].end][j-k-2*a[i].lenth]);
g[now][j]=max(g[now][j],f[now][k]+g[a[i].end][j-k-a[i].lenth]);
if(j-k-2*a[i].lenth>=0)
f[now][j]=max(f[now][j],f[now][k]+f[a[i].end][j-k-2*a[i].lenth]);
}
}
}
int main()
{
freopen("toyuq.in","r",stdin);
freopen("toyuq.out","w",stdout);
int i,j,x,y,z;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++) scanf("%d",&w[i]);
for(i=1;i<=n;i++)
{
scanf("%d",&t[i]);
if(t[i]>300) t[i]=301;
}
for(i=1;i<n;i++)
{
scanf("%d%d%d",&x,&y,&z);
inc(x,y,z);
}
memset(f,192,sizeof(f));
memset(g,192,sizeof(g));
memset(h,192,sizeof(h));
dfs(1,0);
for(i=1;i<=n;i++)
for(j=0;j<=m;j++)
ans=max(ans,max(f[i][j],max(g[i][j],h[i][j])));
printf("%d\n",ans);
return 0;
}
2018.08.15【2018提高组】模拟A组 比赛总结的更多相关文章
- [jzoj 5770]【2018提高组模拟A组8.6】可爱精灵宝贝 (区间dp)
传送门 Description Branimirko是一个对可爱精灵宝贝十分痴迷的玩家.最近,他闲得没事组织了一场捉精灵的游戏.游戏在一条街道上举行,街道上一侧有一排房子,从左到右房子标号由1到n. ...
- JZOJ5857 【NOIP提高组模拟A组2018.9.8】没有上司的舞会
题目 Description "那么真的有果尔德施坦因这样一个人?"他问道. "是啊,有这样一个人,他还活着.至于在哪里,我就不知道了." "那么那个 ...
- 2018.08.15 bzoj3747: [POI2015]Kinoman(线段树)
传送门 简单题. 先不管时间复杂度看看怎么做. 对于一段区间[l,r],如果从右端加入一个数a[r+1],对这个区间有什么影响?显然如果区间中已经有了a[r+1]这个数就会产生-a[i+1]的影响,否 ...
- Cheatsheet: 2018 08.01 ~ 2018 10.31
Other Building the Ultimate Developer PC 3.0 - The Parts List for my new computer, IronHeart Face re ...
- JZOJ 5818. 【NOIP提高A组模拟2018.8.15】 做运动
5818. [NOIP提高A组模拟2018.8.15] 做运动 (File IO): input:running.in output:running.out Time Limits: 2000 ms ...
- 2018.12.08【NOIP提高组】模拟B组总结(未完成)
2018.12.08[NOIP提高组]模拟B组总结 diyiti 保留道路 进化序列 B diyiti Description 给定n 根直的木棍,要从中选出6 根木棍,满足:能用这6 根木棍拼出一个 ...
- 5820. 【NOIP提高A组模拟2018.8.16】 非法输入(模拟,字符串)
5820. [NOIP提高A组模拟2018.8.16] 非法输入 (File IO): input:aplusb.in output:aplusb.out Time Limits: 1000 ms ...
- JZOJ 5812. 【NOIP提高A组模拟2018.8.14】 区间
5812. [NOIP提高A组模拟2018.8.14] 区间 (File IO): input:range.in output:range.out Time Limits: 1000 ms Memo ...
- NOIP2017提高组 模拟赛15(总结)
NOIP2017提高组 模拟赛15(总结) 第一题 讨厌整除的小明 [题目描述] 小明作为一个数学迷,总会出于数字的一些性质喜欢上某个数字,然而当他喜欢数字k的时候,却十分讨厌那些能够整除k而比k小的 ...
随机推荐
- docker Tomcat镜像
docker中的管理命令 首先需要去下载镜像. [root@CFCA ~]# docker pull tomcat 下载镜像[root@CFCA ~]# docker images ...
- log4j 多进程配置要注意的
多进程写日志文件 方法一: 解决log4j公用配置文件,多进程同时写同一个log文件,因存在操作系统pv操作问题, 导致部分日志丢失.解决方案是不同的进程写不同的log文件 测试于:Log4j 1.2 ...
- [CSP-S模拟测试]:Weed(线段树)
题目描述 $duyege$的电脑上面已经长草了,经过辨认上面有金坷垃的痕迹.为了查出真相,$duyege$准备修好电脑之后再进行一次金坷垃的模拟实验.电脑上面有若干层金坷垃,每次只能在上面撒上一层高度 ...
- BAT 鼎立格局被打破,2019 年这些互联网公司是程序员跳槽首选!
点击上方“程序员江湖”,选择“置顶或者星标” 你关注的就是我关心的! 作者:BOSS直聘 来源:BOSS直聘 作者:BOSS直聘(ID:bosszhipin),领先的移动互联网招聘APP,为求职者 ...
- 踩坑之SpringBoot WebSocker 部署Tomcat冲突
启动tomcat容器,部署SpringBoot项目,启动项目报错,如下图: 看1.2的顺序就知道是WebSocket冲突了. 上网找了一下资料发现,使用@ServerEndpoint创立websock ...
- Java如何对一个对象进行深拷贝?
在Java语言里,当我们需要拷贝一个对象时,有两种类型的拷贝:浅拷贝与深拷贝.浅拷贝只是拷贝了源对象的地址,所以源对象的值发生变化时,拷贝对象的值也会发生变化.而深拷贝则是拷贝了源对象的所有值,所以即 ...
- Ubuntu下qt5使用vlc
一:Ubuntu下在线安装qt5,同时安装了qt creator 二:打开终端执行sudo apt-get install libvlc5 libvlc-dev libvlccore-dev 安装 ...
- Maven私服搭建及使用-Windows版
了解有限,目前只针对基础功能介绍,持续更新 一.下载对应的版本(本例版本:nexus-3.7.1-02) https://www.sonatype.com/download-oss-sonatype ...
- 百度地图java 判断当前位置是否在多边形区域内
package com.haiyisoft.cAssistant.adapter.hessian; import java.awt.geom.Point2D;import java.util.Arra ...
- DP&图论 DAY 1 下午
DP&图论 DAY 1 下午 区间和序列上的DP 序列上的DP >序列上的dp状态设计最基本的形式 F[i]表示以 i 结尾的最优值或方案数.◦ F[i][k]表示以 i 结尾附加 ...