T1 u

拿到题感觉他很水,但到死没想到正解,只会骗部分分(我太弱了)

考虑用两个差分数组维护,不同的是最后更新答案是$a[i][j]+=a[i-1][j-1]$,首先考虑在斜着加的起点,就是竖着的直角边,在这些地方打上标记,可以竖着差分,n^2扫一遍就得到了需要所有的标记。但下边有一部分加多了,那就在第$r+l$行的$c+1~c+l+1$的地方减去该贡献,所以再用一个差分数组横着记录哪些地方需要减。最后把两个差分数组相加,就是最后的差分数组,利用$a[i][j]+=a[i-1][j-1]$转移过来就是最后的表,直接暴力统计答案即可

记得开$long long$,不然炸成0分

#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
ll n,m,ans,a[][],b[][];
ll read()
{
ll aa=,bb=;char cc=getchar();
while(cc>''||cc<''){if(cc=='-') bb=-;cc=getchar();}
while(cc>=''&&cc<=''){aa=(aa<<)+(aa<<)+(cc^'');cc=getchar();}
return aa*bb;
}
int main()
{
n=read();m=read();
ll r,c,l,s;
for(int i=;i<=m;i++){
r=read();c=read();l=read();s=read();
a[r][c]+=s;a[min(r+l,n+)][c]-=s;
b[min(r+l,n+)][c+]-=s;b[min(r+l,n+)][min(c+l+,n+)]+=s;
}
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
a[i][j]+=a[i-][j];
b[i][j]+=b[i][j-];
}
}
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
a[i][j]+=b[i][j];
a[i][j]+=a[i-][j-];
ans^=a[i][j];
}
}
printf("%lld\n",ans);
return ;
}

u

T2 v

$n$的范围很小,只有30,考虑状压,倒着转移就行了(我太菜了,这都没想到)

如果记录每个球是否在剩余的序列里,会有很多冗余状态(剩下的球不同但颜色排列相同),所以改变状态,改为记录剩余的序列颜色顺序为sta的期望。$0$表示$B$,$1$表示$W$。最初始的状态就是原序列里的$01$状态。记忆化搜索用$dfs$转移。在当前状态为$now$,剩余$num$个球,抽到$i(i<=num/2)$的时候(正着和倒着的期望+是否是白色)$*2/num$,$*2$是因为抽到对称的数的时候贡献一样。如果当前$num$是奇数,特殊转移一下中间那一位就行。拿掉这个地方的球后剩下的状态可以用二进制搞(稍恶心),最后记忆化$f[i][sta]$表示还剩$i$个球的时候,颜色状态为$sta$的期望。

由于$n$太大,数组开不下,所以可以用$map$,小的用数组记,大的用$map$(全用$map$会$T$的很惨)

但这样仍然不能过最后一个点(毒瘤出题人)

我们发现每个状态都是$2^i$,所以第一维可以省掉,在每个状态的$i+1$为打上标记,就代表了第一维。这样我们就可以愉快的用$hash$表优化了,你也可以用一些奇技淫巧,比如$pbds$库中自带的$hash$表

#include<iostream>
#include<cstdio>
#include<cstring>
#include<unordered_map>
#include<ext/pb_ds/tree_policy.hpp>
#include<ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
int n,m,sta;
double f[(<<)+];
char s[];
cc_hash_table<int,double>g;
double dfs(int now,int num)
{
if(n-num>=m) return ;
if(num<=&&f[now]!=-) return f[now];
if(num>&&g.find(now)!=g.end()) return g[now];
double sum=;
for(int i=;i<=num>>;i++){
int c1=(now>>(num-i))&,c2=(now>>(i-))&;
int las1=now&((<<num-i)-),las2=now&((<<i-)-);
int st1=(now>>num-i+<<num-i)+las1,st2=(now>>i<<i-)+las2;
sum+=*max(dfs(st1,num-)+c1,dfs(st2,num-)+c2);
}
if(num&){
int nn=num>>;
int c=(now>>nn)&;
int las=now&((<<nn)-);
int st=(now>>nn+<<nn)+las;
sum+=dfs(st,num-)+c;
}
sum=(double)sum/num;
if(num<=) f[now]=sum;
else g[now]=sum;
return sum;
}
int main()
{
scanf("%d%d%s",&n,&m,s+);
for(int i=;i<=(<<);i++) f[i]=-;
sta=;
for(int i=;i<=n;i++){
sta<<=;
if(s[i]=='W') sta|=;
}
printf("%.7lf\n",dfs(sta,n));
return ;
}

v

T3 w

树上$dp$,在最小化操作次数的前提下最小化路径长度,最方便的就是用二元组将两个捆绑

设$f[x][0/1]$表示x与x的父亲的连边是否翻转,$0$不翻转,$1$翻转,$first$表示度为奇数的点的个数,$second$表示路径长度

$1.$一条边最优情况下只会被翻转一次

$2.$如果翻转一条边的同时在他的两个端点处$+1$,那么最后操作此时就是度为奇数的点的个数$/2$

设$w1$为当前$x$不作为一条翻转链的端点的最优情况,$w2$为$x$作为一条翻转链的端点,$y$为$x$的儿子($x$肯定最多只会作为一条链的端点)

$w1=min(w1'+f[y][0],w2'+f[y][1])$

$w2=min(w1'+f[y][1],w2'+f[y][0])$

如果x不作为端点$w1$:他儿子跟他的连边不翻转,那么需要他本身就不是端点;他儿子跟他的连边翻转了,那就需要$x$本身是端点,然后两条链并起来

如果x是端点$w2$:他儿子跟他的连边翻转了,那他需要他以前不是端点,然后新翻的这一条边使$x$成为端点;他儿子跟他的连边不翻转,那么他应该本来就已经是端点

更新$x$:

$1.x$与父亲的边必须翻:首先$f[x][0]=(inf,inf)$,如果$x$不是端点,那么再连出去一条边就多了一个奇数点,那么度为奇数的点$+1$,路径$+1$;如果$x$是端点($fa$直接跟$x$连上就行,奇数点不变)只需要路径$+1$,;两者中取$min$,

即$f[x][1]=min(make$_$pair(w1.first+1,w1.second+1),make$_$pair(w2.first,w2.second+1));$

$2.x$与父亲的边不能翻:首先$f[x][1]=(inf,inf)$;如果$x$不是端点,度为奇数的点不变,路径长度不变,所以就是$w1$;如果x是端点,度为奇数的点$+1$,路径长度不变;两者取$min$,

即$f[x][0]=min(w1,make$_$pair(w2.first+1,w2.second))$;

$3.x$与父亲的边可翻可不翻:就是$1,2$的结合

$f[x][0]=min(w1,make$_$pair(w2.first+1,w2.second));$

$f[x][1]=min(make$_$pair(w1.first+1,w1.second+1),make$_$pair(w2.first,w2.second+1));$

每次都要传参传过来$x$与父亲的边的情况,而且建树的时候也可以直接记录这条边是否需要翻转。

#include<iostream>
#include<cstdio>
#define inf 0x7ffff
using namespace std;
struct node
{
int to,nxt,tpy;
}h[];
int n,tot,nxt[];
pair<int,int>f[][];
int read()
{
int aa=,bb=;char cc=getchar();
while(cc>''||cc<''){if(cc=='-') bb=-;cc=getchar();}
while(cc>=''&&cc<=''){aa=(aa<<)+(aa<<)+(cc^'');cc=getchar();}
return aa*bb;
}
int add(int x,int y,int tpy)
{
h[++tot].to=y;
h[tot].tpy=tpy;
h[tot].nxt=nxt[x];
nxt[x]=tot;
}
pair<int,int> cal(pair<int,int> a,pair<int,int> b)
{
return make_pair(a.first+b.first,a.second+b.second);
}
void dfs(int x,int fa,int tpy)
{
pair<int,int>w1,w2;//w1:不以x作为端点 w2:以x作为端点
w1=make_pair(,);w2=make_pair(inf,inf);
for(int i=nxt[x];i;i=h[i].nxt){
int y=h[i].to;
if(y==fa) continue;
dfs(y,x,h[i].tpy);
pair<int,int>tmp1=min(cal(w1,f[y][]),cal(w2,f[y][]));
pair<int,int>tmp2=min(cal(w1,f[y][]),cal(w2,f[y][]));
w1=tmp1;w2=tmp2;
}
if(tpy==){
f[x][]=min(w1,make_pair(w2.first+,w2.second));
f[x][]=min(make_pair(w1.first+,w1.second+),make_pair(w2.first,w2.second+));
}
else if(tpy==){
f[x][]=make_pair(inf,inf);
f[x][]=min(make_pair(w1.first+,w1.second+),make_pair(w2.first,w2.second+));
}
else if(tpy==){
f[x][]=min(w1,make_pair(w2.first+,w2.second));
f[x][]=make_pair(inf,inf);
}
}
int main()
{
n=read();
int u,v,c,cc;
for(int i=;i<n;i++){
u=read();v=read();c=read();cc=read();
if(cc==) add(u,v,),add(v,u,);
else add(u,v,c^cc),add(v,u,c^cc);
}
dfs(,,);
printf("%d %d\n",f[][].first/,f[][].second);
return ;
}

w

9.27 csp-s模拟测试53 u+v+w的更多相关文章

  1. 2019.9.27 csp-s模拟测试53 反思总结

    这个起名方式居然还有后续?! 为什么起名不是连续的?! T1想了半天,搞出来了,结果数组开小[其实是没注意范围].T2概率期望直接跳,后来翻回来写发现自己整个理解错了期望的含义[何].T3错误想到赛道 ...

  2. [考试反思]0927csp-s模拟测试53:沦陷

    很喜欢Yu-shi说过的一句话 在OI里,菜即是原罪 对啊. 都会.谁信呢? 没有分数,你说话算什么呢? 你就是菜,你就是不对,没有别的道理. 最没有用的,莫过于改题大神,这就是菜的借口. 但是其实这 ...

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

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

  4. csp-s模拟测试53u,v,w题解

    题面:https://www.cnblogs.com/Juve/articles/11602450.html u: 用差分优化修改 二维差分:给(x1,y1),(x2,y2)加上s: $d[x1][y ...

  5. Mock 模拟测试简介及 Mockito 使用入门

    Mock 是什么mock 测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法.这个虚拟的对象就是mock对象.mock对象就是真实对象在调试期间的代 ...

  6. 【转】利用Python中的mock库对Python代码进行模拟测试

    出处 https://www.toptal.com/python/an-introduction-to-mocking-in-python http://www.oschina.net/transla ...

  7. csp-s模拟测试93

    csp-s模拟测试93 自闭场. $T1$想到$CDQ$,因为复杂度少看见一个$0$打了半年还用了$sort$直接废掉,$T2$,$T3$直接自闭暴力分都没有.考场太慌了,心态不好. 02:07:34 ...

  8. csp-s模拟测试91

    csp-s模拟测试91 倒悬吃屎的一套题. $T1$认真(?)分析题意发现复杂度不能带$n$(?),计划直接维护答案,考虑操作对答案的影响,未果.突然发现可以动态开点权值线段树打部分分,后来$Tm$一 ...

  9. csp-s模拟测试60

    csp-s模拟测试60       2019-10-05 RT. 又颓又垃圾. 状态低迷,题都交不上去. 交了也是爆零,垃圾玩家没有什么可说的,就是垃圾. A. 嘟嘟噜 $mlogn$的毒瘤做法. 贴 ...

随机推荐

  1. HDU2899Strange fuction(二分/三分)

    传送门 题目大意:求 F(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-y*x (0 <= x <=100):的最小值 题解:求个导,二分导函数零点,就是原函数最小值所在的 ...

  2. Codeforces Round #602 (Div. 2, based on Technocup 2020 Elimination Round 3) D2. Optimal Subsequences (Hard Version) 数据结构 贪心

    D2. Optimal Subsequences (Hard Version) This is the harder version of the problem. In this version, ...

  3. SpringMVC拦截器和数据校验

    1.什么是拦截器 Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理.例如通过拦截器可以进行权限验证.记录请求 ...

  4. SpringBoot系列之Spring容器添加组件方式

    SpringBoot系列之Spring容器添加组件方式 本博客介绍SpringBoot项目中将组件添加到Spring容器中的方法,SpringBoot项目有一个很明显的优点,就是不需要再编写xml配置 ...

  5. vue 仿微信朋友圈9张图上传功能

    项目需求要求用户上传商品的时候可以一次性上传9张图,多余9张提示‘只能上传9张图’,并且每张图右上角有个删除按钮,图片也可以点击放大. 出来的效果图如下: 话不多说,上代码: <el-form- ...

  6. njnja 安装

    git clone git://github.com/ninja-build/ninja.git && cd ninja 安装re2c wget  https://kojipkgs.f ...

  7. Netty - 粘包和半包(下)

    上一篇介绍了粘包和半包及其通用的解决方案,今天重点来看一下 Netty 是如何实现封装成帧(Framing)方案的. 解码核心流程 之前介绍过三种解码器FixedLengthFrameDecoder. ...

  8. InnoSetup 安装选择不同语言,修改软件配置参数,达到安装语言就是软件语言效果

    需求 在软件安装时,选择中英文安装界面,选择的中英文界面就是对应软件内界面语言. 在软件安装时,选择中文界面,打开软件就是中文界面. 在软件安装时,选择英文界面,打开软件就是英文界面. 实际上,就是在 ...

  9. Razor 页面解说

    自己开始从头深造- 本是想将时间缩短,但发现自己还是很难呀.希望你理解吧,这里的知识 是 页面的基本信息.也页面的跳转关系和 Tag的帮助标签. Section   PartView.  @page ...

  10. Google浏览器出现崩溃问题解决

    更新google浏览器79版本后所有页面出现崩溃情况,在试过加no-sandbox和兼容模式之后还是不太满意,后来搜到可能是网络问题,然后打开google浏览器安装文件夹,发现chrome_proxy ...