2019.9.27 csp-s模拟测试53 反思总结
这个起名方式居然还有后续?!
为什么起名不是连续的?!
T1想了半天,搞出来了,结果数组开小【其实是没注意范围】。T2概率期望直接跳,后来翻回来写发现自己整个理解错了期望的含义【何】。T3错误想到赛道修建结果来了个错误贪心。
关于T2破罐子破摔输出k居然骗了二十分这件事……
T1u:
一开始各种想偏,维护哪种值是奇数或偶数个,考虑每次操作影响哪些值变化…这些全都跑出来了。
大概过了一个世纪那么长,突然想着能不能直接优化操作的过程啊,然后对暴力进行钻研,终于开始想到差分。
然后觉着nq的复杂度过不去,开始对差分进行瞎搞。终于又过了一个世纪那么久,发现差分数组也是可以传递转移的……
两个世纪过去了,没有然后了。
#include<iostream>
#include<cstdio>
using namespace std;
int n,q;
long long ans,f[][],H[][],L[][],sum;
int main()
{
scanf("%d%d",&n,&q);
if(!q){
printf("0\n");
return ;
}
else if(n<=){
for(int i=,r,c,l,s;i<=q;i++){
scanf("%d%d%d%d",&r,&c,&l,&s);
for(int j=r;j<r+l;j++){
for(int k=c;k<=j-r+c;k++){
f[j][k]+=s;
}
}
}
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
ans^=f[i][j];
}
}
printf("%lld\n",ans);
return ;
}
else if(q<=){
for(int i=,r,c,l,s;i<=q;i++){
scanf("%d%d%d%d",&r,&c,&l,&s);
for(int j=r;j<r+l;j++){
H[j][c]+=s;
H[j][j-r+c+]-=s;
}
}
for(int i=;i<=n;i++){
sum=;
for(int j=;j<=n;j++){
sum+=H[i][j];
ans^=sum;
}
}
printf("%lld\n",ans);
return ;
}
else{
for(int i=,r,c,l,s;i<=q;i++){
scanf("%d%d%d%d",&r,&c,&l,&s);
H[r][c]+=s;
L[r][c+]-=s;
H[r+l][c]-=s;
L[r+l][c+l+]+=s;
}
for(int i=;i<=n;i++){
sum=;
for(int j=;j<=n;j++){
H[i][j]+=H[i-][j];
L[i][j]+=L[i-][j-];
sum+=H[i][j]+L[i][j];
ans^=sum;
}
}
printf("%lld\n",ans);
return ;
}
}
T2v:
整个儿弄错了期望这东西,一言难尽。
题目中的最优策略,指的是在以某一概率选到某一个位置的时候,选择拿前面的球或者拿后面的球的其中一种决策产生的贡献,累计上这个球是不是白球的贡献,取最大值。
所以dfs,枚举选到的是哪个位置,累积贡献,除以可选到多少种位置,就是这一状态的期望。
因为搜索到的状态会有很多重复,考虑记忆化搜索。但是表示某一状态的数字可能很大,数组下标无法表述。那么对于数组表示得出来的,就用数组存。其它更大的用map映射解决。
不同长度的状态可能存在数值上相同的情况,例如010和0010。解决方法是在这一长度的再靠前一位打上一个1的标记,例如010->1010,0010->10010,这样表示不同的状态。
#include<iostream>
#include<cstdio>
#include<map>
using namespace std;
int n,k;
char s[];
long long fir;
double ans,num[(<<)];
map<long long,double>m;
double dfs(long long x,int k,int lon){
if(!k)return ;
if(lon<=&&num[x]!=-1.0)return num[x];
else if(m.find(x)!=m.end())return m[x];
double f=,f1=,val1,val2;
long long x1,x2;
for(int i=;i<=lon/;i++){
val1=(x>>(lon-i-))&,val2=(x>>(i-))&;
f1=;
x1=(x>>)&(~((<<(lon-i-))-))|(x&((<<(lon-i-))-));
x2=(x>>)&(~((<<(i-))-))|(x&((<<(i-))-));
f1=dfs(x1,k-,lon-)+val1;
f1=max(f1,dfs(x2,k-,lon-)+val2);
f+=f1*(i==lon-i?1.0:2.0);
}
f/=(double)(lon-);
if(lon<=)num[x]=f;
else m[x]=f;
return f;
}
int main(){
scanf("%d%d",&n,&k);
scanf("%s",s+);
for(int i=;i<=(<<);i++)num[i]=-1.0;
fir=;
for(int i=;i<=n;i++){
fir=(fir<<)+(s[i]=='W');
}
ans=dfs(fir,k,n+);
printf("%.10lf",ans);
return ;
}
T3w:
错误贪心:强行认为每个节点由子节点传上来的路径若有偶数条就自行解决是最优的,奇数条就看当前节点连出去的边目标是不是2,然后无脑传上去。
错误性显而易见……有可能强行传上去的这条会打乱父节点本来可以完整自行配对的组合,给父节点增加一条路径,然后不得不再次穿上去,又增加了长度……还不如在当前节点自行了断。
正解是树形DP。发现最后的总路径数是整棵树路径中的奇度数点数/2。对于每个点,记录它传一条边上去或者不传的时候dp[x][1],dp[x][0],包含子树的最少奇度数点数以及在此基础上的最小总路径长。
一棵一棵子树进行转移。设两个用来统计子树们的最优答案的二元组w1,w2。w1的含义是子树们传了一条边上来,w2是不传让它们两两解决。对于每棵子树y,w1=min(w2+dp[y][1],w1+dp[y][0]),w2=min(w1+dp[y][1],w2+dp[y][0])。比较大小的时候都优先比较奇度数点数c1,再比较路径长度c2。
然后根据当前节点上面这条边的状态和目标状态计算dpx。显然一条边如果已经是目标状态,那么始终不走一定是更优的。如果这条边已经是目标状态,让dp[x][1]=inf。使w1的c1++,w2不变,表示若有边传上来就多一个奇度数点作为收尾,或者没有边传上来就不变,然后dp[x][0]在w1和w2中选择更优的。如果这条边不是目标状态,就让dp[x][0]=inf。w1.c2++。w2.c1++,w2.c2++,表示这个节点作为一个新的开头使奇度数节点增加。依然让dp[x][1]在w1和w2中选择更优的。如果这条边的目标状态是2,就两种情况非inf的部分都做一遍。
#include<iostream>
#include<cstdio>
using namespace std;
const int inf=;
int f[][],opt[],goal[];
struct node{
int c1,c2;
}dp[][],tool;
int n,tot,ver[],head[],edge[],edge1[],Next[];
void add(int x,int y,int z,int w){
ver[++tot]=y;
Next[tot]=head[x];
head[x]=tot;
edge[tot]=z;
edge1[tot]=w;
}
node work(node a,node b,node c,node d){
node e;
if(a.c1+b.c1<c.c1+d.c1){
e.c1=a.c1+b.c1;
e.c2=a.c2+b.c2;
}
else if(a.c1+b.c1==c.c1+d.c1){
if(a.c2+b.c2<c.c2+d.c2){
e.c1=a.c1+b.c1;
e.c2=a.c2+b.c2;
}
else{
e.c1=c.c1+d.c1;
e.c2=c.c2+d.c2;
}
}
else{
e.c1=c.c1+d.c1;
e.c2=c.c2+d.c2;
}
return e;
}
void dfs(int x,int fa){
node w1,w2;
w1.c1=w1.c2=inf;
w2.c1=w2.c2=;
for(int i=head[x];i;i=Next[i]){
int y=ver[i];
if(y==fa)continue;
opt[y]=edge[i];
goal[y]=edge1[i];
dfs(y,x);
node w11=w1;
w1=work(dp[y][],w1,dp[y][],w2);
w2=work(dp[y][],w11,dp[y][],w2);
}
if(goal[x]==){
w2.c1++;
w1.c2++;
w2.c2++;
dp[x][]=work(w1,tool,w2,tool);
w2.c1--;
w1.c2--;
w2.c2--;
w1.c1++;
dp[x][]=work(w1,tool,w2,tool);
}
else{
if(opt[x]!=goal[x]){
dp[x][].c1=inf,dp[x][].c2=inf;
w2.c1++;
w1.c2++;
w2.c2++;
dp[x][]=work(w1,tool,w2,tool);
}
else{
dp[x][].c1=inf,dp[x][].c2=inf;
w1.c1++;
dp[x][]=work(w1,tool,w2,tool);
}
}
}
int main()
{
scanf("%d",&n);
for(int i=,x,y,z,w;i<n;i++){
scanf("%d%d%d%d",&x,&y,&z,&w);
add(x,y,z,w),add(y,x,z,w);
}
dfs(,);
printf("%d %d\n",dp[][].c1/,dp[][].c2);
return ;
}
结果拖到这会儿才写完。
祝祖国母亲生日快乐。
2019.9.27 csp-s模拟测试53 反思总结的更多相关文章
- 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组
2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...
- 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色
2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...
- 2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci)
2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci) 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 找规律 找两个节点的lca,需 ...
- 2019.8.14 NOIP模拟测试21 反思总结
模拟测试20的还没改完先咕着 各种细节问题=错失190pts T1大约三分钟搞出了式子,迅速码完,T2写了一半的时候怕最后被卡评测滚去交了,然后右端点没有初始化为n…但是这样还有80pts,而我后来还 ...
- 2019.8.9 NOIP模拟测试15 反思总结
日常爆炸,考得一次比一次差XD 可能还是被身体拖慢了学习的进度吧,虽然按理来说没有影响.大家听的我也听过,大家学的我也没有缺勤多少次. 那么果然还是能力问题吗……? 虽然不愿意承认,但显然就是这样.对 ...
- 2019.8.1 NOIP模拟测试11 反思总结
延迟了一天来补一个反思总结 急匆匆赶回来考试,我们这边大家的状态都稍微有一点差,不过最后的成绩总体来看好像还不错XD 其实这次拿分的大都是暴力[?],除了某些专注于某道题的人以及远程爆踩我们的某学车神 ...
- 9.27 csp-s模拟测试53 u+v+w
T1 u 拿到题感觉他很水,但到死没想到正解,只会骗部分分(我太弱了) 考虑用两个差分数组维护,不同的是最后更新答案是$a[i][j]+=a[i-1][j-1]$,首先考虑在斜着加的起点,就是竖着的直 ...
- 2019.7.27 NOIP模拟测试9 反思总结
先来整理题目 T1题目大意:给出n个数字和一个质数作为模数,一个变量x初始值为1.进行m次操作,每次让x随机乘上n个数中的一个,问m次操作以后x的期望值. 答案一定可以用分数表示,输出分子乘分母逆元的 ...
- [考试反思]0927csp-s模拟测试53:沦陷
很喜欢Yu-shi说过的一句话 在OI里,菜即是原罪 对啊. 都会.谁信呢? 没有分数,你说话算什么呢? 你就是菜,你就是不对,没有别的道理. 最没有用的,莫过于改题大神,这就是菜的借口. 但是其实这 ...
随机推荐
- F. Cowmpany Cowmpensation dp+拉格朗日插值
题意:一个数,每个节点取值是1-d,父亲比儿子节点值要大,求方案数 题解:\(dp[u][x]=\prod_{v}\sum_{i=1}^xdp[v][i]\),v是u的子节点,先预处理出前3000项, ...
- duilib教程之duilib入门简明教程5.自绘标题栏
如果大家有做过标题栏的自绘,肯定会感慨各种不容易,并且现有的一些资料虽然完美的实现了功能,但是代码比较乱,需要自行整理.如果用duilib,就是小case啦. duilib其实并没有区分标题栏和 ...
- VS2010-MFC(对话框:设置对话框控件的Tab顺序)
转自:http://www.jizhuomi.com/software/158.html 上一讲为“计算”按钮添加了消息处理函数后,加法计算器已经能够进行浮点数的加法运算.但是还有个遗留的小问题,就是 ...
- Android基础控件Button的使用
1.相关属性 Android的按钮有Button和ImageButton(图像按钮),Button extends TextView, ImageButton extends ImageView! a ...
- flock文件锁的学习和应用
flock文件锁 学习与应用 2016-9-20 作用: 可以使用flock文件锁,避免指定命令的同时执行.(实现任务锁定,解决冲突) 用法: # flock -xn /opt/lock_file ...
- Delphi XE10百集视频教程计划
1. 前言 本人现在的职业是Java程序员,一直想学习一个做桌面应用的编程语言,几年前无意中接触到Delphi,比VB功能强大,比C++语法更容易理解,加上Oracle的PL/SQL的底子,最终决定学 ...
- springMVC和springBoot区别
Spring MVC是什么?(1)Spring MVC是Spring提供的一个强大而灵活的模块式web框架.通过Dispatcher Servlet, ModelAndView 和 View Reso ...
- 如何做系列(4)-微博URL短网址生成算法原理(java版、php版实现实例)
短网址(Short URL),顾名思义就是在形式上比较短的网址.通常用的是asp或者php转向,在Web 2.0的今天,不得不说,这是一个潮流.目前已经有许多类似服务,借助短网址您可以用简短的网址替代 ...
- [JLOI2015]战争调度【暴力+树形Dp】
Online Judge:Bzoj4007,Luogu P3262 Label:暴力,树形Dp 题解 参考了这篇blog https://www.cnblogs.com/GXZlegend/p/830 ...
- webpack 打包生成的index 路径引用不对
webpack 在打包时在访问打包里面的index时,出现路径错误 修改方法为 解决方法:在config下面的index.js把 assetsPublicPath: '/', 修改为: assetsP ...