题解:

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 题解的更多相关文章

  1. [CQOI2012]模拟工厂 题解(搜索+贪心)

    [CQOI2012]模拟工厂 题解(搜索+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327574 链接题目地址:洛谷P3161 BZOJ P26 ...

  2. [CSP-S模拟测试53]题解

    A.u 只涉及到区间修改可以考虑差分,然而如果每一行都差分复杂度还是过高.我们发现差分标记也是连续的(一行横着的一行斜着的),所以可以维护两个 差分的差分,扫两遍统计即可. #include<c ...

  3. NOIP第7场模拟赛题解

    NOIP模拟赛第7场题解: 题解见:http://www.cqoi.net:2012/JudgeOnline/problemset.php?page=13 题号为2221-2224. 1.car 边界 ...

  4. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  5. HGOI NOIP模拟4 题解

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

  6. 10.8 wtx模拟题题解

    填坑 orz w_x_c_q w_x_c_q的模拟赛(150pts,炸了) money 题目背景: 王小呆又陷入自己的梦里.(活在梦里...) 题目描述: 王小呆是一个有梦想的小菜鸡,那就是赚好多好多 ...

  7. [NOIP模拟13]题解

    A.矩阵游戏 其实挺水的? 考场上根本没有管出题人的疯狂暗示(诶这出题人有毛病吧这么简单的东西写一大堆柿子),而且推公式能力近乎没有,所以死掉了. 很显然乘法有交换率结合率所以操作顺序对最终结果没什么 ...

  8. 「题解」NOIP模拟测试题解乱写II(36)

    毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...

  9. Noip模拟53 2021.9.14

    T1 ZYB和售货机 首先这道题有两种做法. 一种是发现每个点都可以先被取到只剩一个,只要收益大于$0$ 然后发现建一个$i->f[i]$的图时出现环,要把它去掉, 那么跑一个$tarjan$枚 ...

随机推荐

  1. TheSierpinskiFractal(POJ-1941)【递推】

    题意:用‘\’,'/','_'按照给定规则画出三角形 题目链接:https://vjudge.net/problem/POJ-1941 思路:题中的三角形生成规则是符合递推关系的,可以先手动完成第一个 ...

  2. HeidiSQL 导入Excel数据

    一 前言 原文出处:http://blog.csdn.net/qq_27727681/article/details/53944744 二 效果演示: 2000多条数据,顺利导入成功. 三  实现方法 ...

  3. Idea加载项目扫描完毕后自动退出

    问题描述:Idea平时好好的,突然就打开后扫描完毕后自动退出.网上说修改idea.exe.vmoptions文件的Xmx,还是不行. 后来根据http://www.pianshen.com/artic ...

  4. spring-cloud 学习四 服务网关

    API Gateway 服务网关在微服务中是一个很重要的组成部分,通过服务网关可以统一向外提供REST API,例如 / 映射到后端应用 /api/user 映射到 user service,  /a ...

  5. Python实现英文文章加密传送,收到后进行解密

    思路:将I Love You这样的字符串中的每一个字符,将他的Unicode码都就进行加或减去一个特定的数, 在传送过程中,如果被截获,获取的也是一段混乱的文章,当收到这段文章后,按相同的方式对Uni ...

  6. 正则表达式(Regular Expression)分组(Group)

    基本语法 (exp)匹配exp, 并捕获文本到自动命名的组里 (?<name>exp)  自己命名分组 static void Main(string[] args)        {   ...

  7. zepto学习(一)之click事件和tap事件比较

    一.click 和 tap 比较 两者都会在点击时触发,但是在手机WEB端,click会有 200~300 ms,所以请用tap代替click作为点击事件. singleTap和doubleTap分别 ...

  8. 初学java4 编译器优化

    编译器自动转义 short/char/byte 在定义变量时,后面赋值小于边界值,即可自动转义 右侧值小于左侧范围,编译器直接强转 右侧值大于左侧范围,编译器报错 short a = 10+1; // ...

  9. Django 开发相关知识 整理

    前言 前端ajax HTTP请求头 ajax上传文件 jsonp跨域 URL 设计 分发 url参数编码 反向生成url 视图 request对象 POST url信息 视图返回值 HttpRespo ...

  10. dict 字典 函数值应用

    函数 说明 D代表字典对象   D.clear() 清空字典 D.pop(key) 移除键,同时返回此键所对应的值 D.copy() 返回字典D的副本,只复制一层(浅拷贝) D.update(D2) ...