CSP-S 模拟53 题解
题解:
T1 u:
一看到修改这么多,但询问其实只有一个不难想到差分,但是他这个形状可以说很不规则,于是我们想到分别维护竖着的和斜着的差分,然后最后合并即可。
考场上瞎调了一波系数莫名AC,其实是维护差分的差分。
考试时发现对拍暴力输不出来东西时,慌的不行,对拍的数据范围一定要搞对。
//weihu xiezhede chafen?
//对于每个满足 x ∈ [r, r +l), y ∈ [c, x−r +c]
//的元素 (x, y),将权值增加 s。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define sc(x) printf("%lld\n",x)
const int N=1e3+;
int cf[N][N],cf1[N][N],n,q,a[N][N];
signed main(){
//freopen("data.in","r",stdin);
//freopen("my.out","w",stdout);
scanf("%lld%lld",&n,&q);
if(!q){puts("");return ;}
for(int i=;i<=q;++i){
int r,c,l,s;
scanf("%lld%lld%lld%lld",&r,&c,&l,&s);
cf[r][c]+=s;
cf1[r][c+]+=s;
if(r+l<=n) cf[r+l][c]-=s;
if(r+l<=n&&c+l+<=n) cf1[r+l][c+l+]-=s;
}
for(int i=;i<=n;++i) for(int j=;j<=n;++j) cf[i][j]+=cf[i-][j];
for(int i=;i<=n;++i) for(int j=;j<=n;++j) cf1[i][j]+=cf1[i-][j-];
int ans=;
for(int i=;i<=n;++i){
for(int j=;j<=n;++j){
cf[i][j]-=cf1[i][j];
}
}
// ans=cf[1][1];
for(int i=;i<=n;++i){
for(int j=;j<=n;++j){
cf[i][j]+=cf[i][j-];
//cout<<cf[i][j]<<" ";
ans^=cf[i][j];
}
//cout<<endl;
}
sc(ans);
}
u
T2 v:
考场上想状压,但是发现数据范围稍大,可能过不了,然后也没什么思路。
正解 记忆化搜索+hash_map,其实是和裸状压一样的,但是加了记忆化加速,比较难搞的一点就是如何把删了一个球后的状态用二进制表示出来,有点绕。
还有就是,hash_map不能仅仅记录状态,还要记录当前所剩的球数,因为000110和000110对于状态来说是一样的,但是前面的黑球数是不一定的,这样保证状态唯一。所以hash_map有点难搞,%%%DeepinC重载中括号取地址hash_map,因为自己是实在是不会hash_map,所以就没脸得照着DeepinC神的hash_map打了。
#include<bits/stdc++.h>
using namespace std;
const int N=;
#define signed long long
const int M=3e7+;
char s[N];
int n,k,a[N];
struct hash_map{//hash_map shizhaozhe DeepinC dedade zhendebuhui hash_map
int first[],nex[M],to[M],tot;short l[M],len;
double val[M];
double &operator[] (const register int st){
signed f=st*1ll*len%;
for(register int i=first[f];i;i=nex[i]) if(to[i]==st&&l[i]==len) return val[i];
to[++tot]=st,nex[tot]=first[f],first[f]=tot,l[tot]=len; val[tot]=-;return val[tot];
}
}mp;
inline double max(const register double a,const register double b){
return a>b?a:b;
} double dfs(const register int l,const register int st){//cout<<l<<" "<<st<<endl;
if(l==n-k) return 0.0;
mp.len=l;//meicichongxinfuzhi,yinwei zhuangtaihechangdushiduiyingde
if(mp[st]>-0.1) return mp[st];
mp[st]=;
short sta[N],jk=l+,kh=(l>>)+;
for(register int i=;i^jk;++i) sta[i]=(st>>i-)&;
// reverse(sta+1,sta+l+1);
// for(int i=1;i<=l;++i) cout<<sta[i]<<" ";cout<<endl; for(register int i=;i^kh;++i){
short h=l-i+;
int state1=st>>l-i+<<l-i|st&(<<l-i)-,state2=st>>l-h+<<l-h|st&(<<l-h)-;
// cout<<st<<" "<<l<<" "<<i<<endl;
// cout<<state1<<" "<<state2<<endl;
double ans1=dfs(l-,state1)+sta[h],ans2=dfs(l-,state2)+sta[i];
mp.len=l;mp[st]+=(2.0*max(ans1,ans2))/(1.0*l);
}
if(l&){
int i=kh;
int state=st>>l-i+<<l-i|st&(<<l-i)-;
double ans=dfs(l-,state)+sta[i];
mp.len=l;mp[st]+=ans/(1.0*l);
}
return mp[st];
} int main(){
scanf("%d%d",&n,&k);
scanf("%s",s+);
int st=;
for(register signed i=;i<=n;++i) a[i]=(s[i]=='W');
for(register signed i=;i<=n;++i) st=st<<|a[i];
printf("%.7lf",dfs(n,st));
}
v
T3:
考场上以为是个贪心,就和虎那题差不多,实际上是个思路非常好的dp
首先贪心地考虑,每个边顶多被覆盖一次,因为被覆盖两次以上完全可以从这条便断开,那么会使答案更优。
我们设$dp[i][0/1]$表示以点i为根的子树否/是向上伸,因为他的两个答案是同时更新的,所以。
然后考虑对于i的儿子y,我们设两个二元组w1,w2,w1表示向上伸,w2表示不向上伸。
那么我们考虑转移$w1=min(w1+dp[y][0],w2+dp[y][1])$,$w2=min(w1+dp[y][1],w2+dp[y][0])$
那么我们在来考虑怎么用w1,w2进行转移。
如果他这条边不翻转,那么能不反转就不反转,所以$dp[x][1]=(INF,INF)$,$dp[x][0]=min(w2,(w1.first+1,w1.second))$
如果必须反转的话,那么同理$dp[x][0]=(INF,INF)$,$dp[x][1]=min((w1.first,w1.second+1),(w2.first+1,w2.second+1))$
最后答案就是$dp[1][0].first/2$和$dp[1][0].second$
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+,INF=1e9+;
int first[N],nex[N<<],to[N<<],edge[N<<],tot;
void add(int a,int b,int c){
to[++tot]=b,nex[tot]=first[a],first[a]=tot,edge[tot]=c;
}
pair<int ,int> min(pair<int ,int> a,pair<int ,int > b){
return a<b?a:b;
}
pair<int ,int> add(pair<int,int> a,pair<int ,int> b){
return make_pair(a.first+b.first,a.second+b.second);
}
pair<int ,int> dp[N][];//0 not up 1 up
void dfs(int x,int fa,int ed){
pair<int ,int > p,q;
p=make_pair(INF,INF);//up
q=make_pair(,);//not up
pair<int ,int> tmp1,tmp2;//p q;
for(int i=first[x];i;i=nex[i]){
int y=to[i];
if(y==fa) continue;
dfs(y,x,edge[i]);
tmp1=min(add(p,dp[y][]),add(q,dp[y][]));
tmp2=min(add(q,dp[y][]),add(p,dp[y][]));
p=make_pair(tmp1.first,tmp1.second);
q=make_pair(tmp2.first,tmp2.second);
}
if(ed==||ed==){//bi fan
dp[x][]=min(make_pair(p.first,p.second+),make_pair(q.first+,q.second+));
}else dp[x][]=make_pair(INF,INF);
if(ed==||ed==){//bu fan
dp[x][]=min(q,make_pair(p.first+,p.second));
}else dp[x][]=make_pair(INF,INF);
} int main(){
int n;
scanf("%d",&n);
for(int i=;i<n;++i){
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
int opt;
if(d==) opt=;
else if(c^d) opt=;
else opt=;
add(a,b,opt);
add(b,a,opt);
}
dfs(,,);
printf("%d %d",dp[][].first>>,dp[][].second);
}
CSP-S 模拟53 题解的更多相关文章
- [CQOI2012]模拟工厂 题解(搜索+贪心)
[CQOI2012]模拟工厂 题解(搜索+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327574 链接题目地址:洛谷P3161 BZOJ P26 ...
- [CSP-S模拟测试53]题解
A.u 只涉及到区间修改可以考虑差分,然而如果每一行都差分复杂度还是过高.我们发现差分标记也是连续的(一行横着的一行斜着的),所以可以维护两个 差分的差分,扫两遍统计即可. #include<c ...
- NOIP第7场模拟赛题解
NOIP模拟赛第7场题解: 题解见:http://www.cqoi.net:2012/JudgeOnline/problemset.php?page=13 题号为2221-2224. 1.car 边界 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- HGOI NOIP模拟4 题解
NOIP国庆模拟赛Day5 题解 T1 马里奥 题目描述 马里奥将要参加 NOIP 了,他现在在一片大陆上,这个大陆上有着许多浮空岛,并且其中一座浮空岛上有一个传送门,马里奥想要到达传送门从而前往 N ...
- 10.8 wtx模拟题题解
填坑 orz w_x_c_q w_x_c_q的模拟赛(150pts,炸了) money 题目背景: 王小呆又陷入自己的梦里.(活在梦里...) 题目描述: 王小呆是一个有梦想的小菜鸡,那就是赚好多好多 ...
- [NOIP模拟13]题解
A.矩阵游戏 其实挺水的? 考场上根本没有管出题人的疯狂暗示(诶这出题人有毛病吧这么简单的东西写一大堆柿子),而且推公式能力近乎没有,所以死掉了. 很显然乘法有交换率结合率所以操作顺序对最终结果没什么 ...
- 「题解」NOIP模拟测试题解乱写II(36)
毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...
- Noip模拟53 2021.9.14
T1 ZYB和售货机 首先这道题有两种做法. 一种是发现每个点都可以先被取到只剩一个,只要收益大于$0$ 然后发现建一个$i->f[i]$的图时出现环,要把它去掉, 那么跑一个$tarjan$枚 ...
随机推荐
- F12的用法
F12在Web测试中十分重要,可以定位元素(UI自动化常用),查看网页响应时间/数据(定位BUG,测单页面响应时间→性能) Elements 点击这个按钮,将光标移至“Google”图片位置并点击,右 ...
- Delphi cxpagecontrol融合窗体
功能说明: 一.在需要融合的每个窗体加一句 initialization RegisterClasses([TFrmDataDict]); //类名 二.cxpagecontrol融合窗体,在调用时 ...
- docker使用的一些需要注意事项
1.程序需要前台运行 程序必须前台执行,如果是java进程的话 不要有nohup 或者使用service的方式进行后台运行 否则可能会出现频繁启动应用的问题 原因就是docker只能管理运行中的 ...
- hdu 1068 最大子序列和变形,,,
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #d ...
- C语言存30位数字长的十进制方法
题目:将一个长度最多为30位数字的十进制非负整数转换为二进制数输出. 首先: 1,30位数字的十进制,并没有一个数据类型可以存下30位的整数类型数字,所以考虑用字符串存储这个数据,遍历这个字符串,每个 ...
- StoneTab标签页CAD插件 3.2.5
//////////////////////////////////////////////////////////////////////////////////////////////////// ...
- 设计模式风格<二>;消息总线
以前开发的动车模拟驾驶系统,有好几个软件(不在一台机器上),他们互相之间通信,因此每个软件要配置每个模块的IP和端口,就是每个模块都要知道别的模块的端口和IP. 这样有个重复的地方,B模块和C模块都要 ...
- vue项目之购物车
简单的完成一个购物车项目,满足基本功能 安装创建好项目以后需要引入安装elementui和vuex 项目目录如下:(home.vue为主页面) ### ~home.vue <template&g ...
- 服务框架 Pigeon 的设计与实现
1.服务框架Pigeon架构 监控系统 - CAT,负责调用链路分析.异常监控告警 配置中心 - Lion,负责一些开关配置读取 服务治理 - Governor 一个interface定义为一个服务, ...
- RabbitMQ的特点与应用场景(二)
1.RabbitMQ的主要特点 (1)可靠性:RabbitMQ可通过队列持久化,交换机持久化,消息持久化及ACK回应等机制保证可靠性 (2)支持多种语言与协议:RabbitMQ几乎支持所有的编程语 ...