CSP-S 模拟53 题解

2023-05-16

题解:

T1 u:

一看到修改这么多,但询问其实只有一个不难想到差分,但是他这个形状可以说很不规则,于是我们想到分别维护竖着的和斜着的差分,然后最后合并即可。

考场上瞎调了一波系数莫名AC,其实是维护差分的差分。

考试时发现对拍暴力输不出来东西时,慌的不行,对拍的数据范围一定要搞对。


 1 //weihu xiezhede chafen?
 2 //对于每个满足 x ∈ [r, r +l), y ∈ [c, x−r +c]
 3 //的元素 (x, y),将权值增加 s。
 4 #include<bits/stdc++.h>
 5 using namespace std;
 6 #define int long long
 7 #define sc(x) printf("%lld\n",x)
 8 const int N=1e3+10;
 9 int cf[N][N],cf1[N][N],n,q,a[N][N];
10 signed main(){
11     //freopen("data.in","r",stdin);
12     //freopen("my.out","w",stdout);
13     scanf("%lld%lld",&n,&q);
14     if(!q){puts("0");return 0;}
15     for(int i=1;i<=q;++i){
16         int r,c,l,s;
17         scanf("%lld%lld%lld%lld",&r,&c,&l,&s);
18         cf[r][c]+=s;
19         cf1[r][c+1]+=s;
20         if(r+l<=n) cf[r+l][c]-=s;
21         if(r+l<=n&&c+l+1<=n) cf1[r+l][c+l+1]-=s;
22     }
23     for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) cf[i][j]+=cf[i-1][j];
24     for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) cf1[i][j]+=cf1[i-1][j-1];
25     int ans=0;
26     for(int i=1;i<=n;++i){
27         for(int j=1;j<=n;++j){
28             cf[i][j]-=cf1[i][j];
29         }
30     }
31 //    ans=cf[1][1];
32     for(int i=1;i<=n;++i){
33         for(int j=1;j<=n;++j){
34             cf[i][j]+=cf[i][j-1];
35             //cout<<cf[i][j]<<" ";
36             ans^=cf[i][j];
37         }
38         //cout<<endl;
39     }
40     sc(ans);
41 }  
u

 

T2 v:

考场上想状压,但是发现数据范围稍大,可能过不了,然后也没什么思路。

正解 记忆化搜索+hash_map,其实是和裸状压一样的,但是加了记忆化加速,比较难搞的一点就是如何把删了一个球后的状态用二进制表示出来,有点绕。

还有就是,hash_map不能仅仅记录状态,还要记录当前所剩的球数,因为000110和000110对于状态来说是一样的,但是前面的黑球数是不一定的,这样保证状态唯一。所以hash_map有点难搞,%%%DeepinC重载中括号取地址hash_map,因为自己是实在是不会hash_map,所以就没脸得照着DeepinC神的hash_map打了。


 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=35;
 4 #define signed long long
 5 const int M=3e7+10;
 6 char s[N];
 7 int n,k,a[N];
 8 struct hash_map{//hash_map shizhaozhe DeepinC dedade zhendebuhui hash_map
 9     int first[30000017],nex[M],to[M],tot;short l[M],len;
10     double val[M];
11     double &operator[] (const register int st){
12         signed f=st*1ll*len%30000017;
13         for(register int i=first[f];i;i=nex[i]) if(to[i]==st&&l[i]==len) return val[i];
14         to[++tot]=st,nex[tot]=first[f],first[f]=tot,l[tot]=len; val[tot]=-1;return val[tot];
15     }
16 }mp;
17 inline double max(const register double  a,const register double b){
18     return a>b?a:b;
19 }
20 
21 double dfs(const register int l,const register int st){//cout<<l<<" "<<st<<endl;
22     if(l==n-k) return 0.0;
23     mp.len=l;//meicichongxinfuzhi,yinwei zhuangtaihechangdushiduiyingde
24     if(mp[st]>-0.1) return mp[st];
25     mp[st]=0;
26     short sta[N],jk=l+1,kh=(l>>1)+1;
27     for(register int i=1;i^jk;++i) sta[i]=(st>>i-1)&1;
28 //    reverse(sta+1,sta+l+1);
29 //    for(int i=1;i<=l;++i) cout<<sta[i]<<" ";cout<<endl;
30 
31     for(register int  i=1;i^kh;++i){
32         short h=l-i+1;
33         int state1=st>>l-i+1<<l-i|st&(1<<l-i)-1,state2=st>>l-h+1<<l-h|st&(1<<l-h)-1;
34 //        cout<<st<<" "<<l<<" "<<i<<endl;
35 //        cout<<state1<<" "<<state2<<endl;
36         double ans1=dfs(l-1,state1)+sta[h],ans2=dfs(l-1,state2)+sta[i];
37         mp.len=l;mp[st]+=(2.0*max(ans1,ans2))/(1.0*l);
38     }
39     if(l&1){
40         int i=kh;
41         int state=st>>l-i+1<<l-i|st&(1<<l-i)-1;
42         double ans=dfs(l-1,state)+sta[i];
43         mp.len=l;mp[st]+=ans/(1.0*l);
44     }
45     return mp[st];
46 }
47 
48 int main(){
49     scanf("%d%d",&n,&k);
50     scanf("%s",s+1);
51     int st=0;
52     for(register signed i=1;i<=n;++i) a[i]=(s[i]=='W');
53     for(register signed i=1;i<=n;++i) st=st<<1|a[i];
54     printf("%.7lf",dfs(n,st));
55 }  
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$

 


 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=3e5+10,INF=1e9+10;
 4 int first[N],nex[N<<1],to[N<<1],edge[N<<1],tot;
 5 void add(int a,int b,int c){
 6     to[++tot]=b,nex[tot]=first[a],first[a]=tot,edge[tot]=c;
 7 }
 8 pair<int ,int> min(pair<int ,int> a,pair<int ,int > b){
 9     return a<b?a:b;
10 }
11 pair<int ,int> add(pair<int,int> a,pair<int ,int> b){
12     return make_pair(a.first+b.first,a.second+b.second);
13 }
14 pair<int ,int> dp[N][2];//0 not up 1 up
15 void dfs(int x,int fa,int ed){
16     pair<int ,int > p,q;
17     p=make_pair(INF,INF);//up
18     q=make_pair(0,0);//not up
19     pair<int ,int> tmp1,tmp2;//p q;
20     for(int i=first[x];i;i=nex[i]){
21         int y=to[i];
22         if(y==fa) continue;
23         dfs(y,x,edge[i]);
24         tmp1=min(add(p,dp[y][0]),add(q,dp[y][1]));
25         tmp2=min(add(q,dp[y][0]),add(p,dp[y][1]));
26         p=make_pair(tmp1.first,tmp1.second);
27         q=make_pair(tmp2.first,tmp2.second);
28     }
29     if(ed==1||ed==2){//bi fan
30         dp[x][1]=min(make_pair(p.first,p.second+1),make_pair(q.first+1,q.second+1));
31     }else dp[x][1]=make_pair(INF,INF);
32     if(ed==0||ed==2){//bu fan
33         dp[x][0]=min(q,make_pair(p.first+1,p.second));
34     }else dp[x][0]=make_pair(INF,INF);
35 }
36 
37 int main(){
38     int n;
39     scanf("%d",&n);
40     for(int i=1;i<n;++i){
41         int a,b,c,d;
42         scanf("%d%d%d%d",&a,&b,&c,&d);
43         int opt;
44         if(d==2) opt=2;
45         else if(c^d) opt=1;
46         else opt=0;
47         add(a,b,opt);
48         add(b,a,opt);
49     }
50     dfs(1,0,2);
51     printf("%d %d",dp[1][0].first>>1,dp[1][0].second);
52 }  
View Code

 

转载于:https://www.cnblogs.com/leom10/p/11604116.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CSP-S 模拟53 题解 的相关文章

  • 靶机大全

    本指南主要通过介绍一些常用渗透环境 给pentester们以自己修炼的机会 并配合一些常规的pentest tools达到学习目的 名称 WebGoat 项目地址 http www owasp org index php OWASP Web

随机推荐

  • Cannot create property 'default' on boolean 'true'"

    解决办法 xff1a 删除node modules包 xff0c 重新npm i 转载于 https www cnblogs com 92xcd p 10443538 html
  • 怎么增加照片的KB大小

    之前都是要想办法压缩图片的大小 今天有人发来一张1 8MB的图片让我帮忙调到30MB左右 一下子放大这么多着实有点茫然 之后想到了一个办法 首先把图片占用体积变大 xff0c 是不会增加清晰度的 xff0c 而减小占用体积却会降低清晰度 第
  • 参数 返回值

    1 函数 函数是对功能的封装 语法 def 函数名 形参列表 函数体 代码块 return 调用 函数名 实参列表 2 返回值 return 在函数执行的时候 如果遇到return 直接返回 1 如果函数什么都不写 不写return 没有返
  • 抽象类调用自己的抽象方法,实现来自实现类(很常用)

    直接上代码 public abstract class Parent public abstract void dosomething public void say dosomething System out println 34 ww
  • 学习笔记:51单片机(STC89C52)如何定时10ms

    1 定时器如何定时 首先大致描述一下定时器的定时原理 xff0c 其实本质就一句话 xff1a 每经过一个机器周期 xff0c 寄存器就加1 这里就又要解释什么是时钟周期 xff0c 什么是机械周期 我们的51单片机无论是开发板还是最小系统
  • cmake 的使用

    官网教程 xff1a https cmake org cmake tutorial 第一个简单的例子 源文件 xff1a tutorial cpp 1 A simple program that computes the square ro
  • python 读取一个文件夹下的所jpg文件保存到txt中

    最近需要使用统计一个目录下的所有文件 xff0c 使用python比较方便 xff0c 就整理了一下代码 1 import os 2 3 def gci filepath 4 files 61 os listdir filepath 5 f
  • cmake 单个目录多个文件的情况

    参考 xff1a https www hahack com codes cmake 源文件一共有三个 xff1a main cpp MathFunctions h MathFunctions cpp 文件内容分别如下 xff1a main
  • k8s config配置文件

    接着上面的博客继续写 pwd gt etc kubernetes cat config kubernetes system config The following values are used to configure various
  • html5手机web页面底部菜单

    一 效果图 二 HTML代码 lt header class 61 34 text center 34 gt TOP lt header gt lt div id 61 34 content 34 gt lt div gt lt div i
  • redis hset hmset过期时间

    hmset m k v 127 0 0 1 6379 gt hset m k v integer 1 127 0 0 1 6379 gt hget m k 34 v 34 127 0 0 1 6379 gt expire m 30 inte
  • Mac下 .bash_profile 和 .zshrc 两者之间的区别

    这是我碰到的需要 source 之后才能使用环境变量的问题 xff0c 我就不细究了 xff0c 说说我的看法 bash profile 中修改环境变量只对当前窗口有效 xff0c 而且需要 source bash profile才能使用
  • h5页面使用js实现保存当前图片到手机相册

    很可惜 xff0c 这个鬼东西微信内置浏览器不适用 页面 xff1a lt doctype html gt lt html gt lt head gt lt meta charset 61 34 UTF 8 34 gt lt meta co
  • HTTP认证之基本认证——Basic(一)

    导航 HTTP认证之基本认证 Basic xff08 一 xff09 HTTP认证之基本认证 Basic xff08 二 xff09 HTTP认证之摘要认证 Digest xff08 一 xff09 HTTP认证之摘要认证 Digest x
  • android给方法设置进度,Android自定义View实现多节点进度条功能的方法

    Android自定义View实现多节点进度条功能的方法 发布时间 xff1a 2020 07 28 16 05 13 来源 xff1a 亿速云 阅读 xff1a 122 作者 xff1a 小猪 这篇文章主要讲解了Android自定义View
  • Linux 系统中如何查看日志 (常用命令)

    cat tail f 日志文件 日 志 文 件说 明 var log message系统启动后的信息和错误日志 xff0c 是Red Hat Linux中最常用的日志之一 var log secure与安全相关的日志信息 var log m
  • 智能指针(shared_ptr,unique_ptr)作为函数参数或者返回值时的一些注意事项

    智能指针 shared ptr unique ptr 作为函数参数或者返回值时的一些注意事项 当智能指针作为函数的参数或者返回值时 xff0c 一直在纠结到底是用智能指针对象本身还是用原始指针 Herb Sutter大师的文章很好的解决了这
  • CSP-S 模拟测试 51 题解

    考试过程 xff1a 惯例先看一遍三道题 xff0c T1 一开始反应要求割点 xff0c 但是这是有向图 xff0c 肯定不能求割点 xff0c 康了一下数据范围 xff0c 有40 是树的 xff0c 还不错 xff0c 决定待会在打
  • CSP-S 模拟测试57题解

    人生第一次A B层一块考rank2 xff0c 虽然说分差没几分 xff0c 但还是值得纪念 题解 xff1a T1 天空龙 xff1a 大神题 xff0c 因为我从不写快读也没有写考场注释的习惯 xff0c 所以不会做 xff0c 全hz
  • CSP-S 模拟53 题解

    题解 xff1a T1 u xff1a 一看到修改这么多 xff0c 但询问其实只有一个不难想到差分 xff0c 但是他这个形状可以说很不规则 xff0c 于是我们想到分别维护竖着的和斜着的差分 xff0c 然后最后合并即可 考场上瞎调了一