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分

  1. #include<iostream>
  2. #include<cstdio>
  3. #define ll long long
  4. using namespace std;
  5. ll n,m,ans,a[][],b[][];
  6. ll read()
  7. {
  8. ll aa=,bb=;char cc=getchar();
  9. while(cc>''||cc<''){if(cc=='-') bb=-;cc=getchar();}
  10. while(cc>=''&&cc<=''){aa=(aa<<)+(aa<<)+(cc^'');cc=getchar();}
  11. return aa*bb;
  12. }
  13. int main()
  14. {
  15. n=read();m=read();
  16. ll r,c,l,s;
  17. for(int i=;i<=m;i++){
  18. r=read();c=read();l=read();s=read();
  19. a[r][c]+=s;a[min(r+l,n+)][c]-=s;
  20. b[min(r+l,n+)][c+]-=s;b[min(r+l,n+)][min(c+l+,n+)]+=s;
  21. }
  22. for(int i=;i<=n;i++){
  23. for(int j=;j<=n;j++){
  24. a[i][j]+=a[i-][j];
  25. b[i][j]+=b[i][j-];
  26. }
  27. }
  28. for(int i=;i<=n;i++){
  29. for(int j=;j<=n;j++){
  30. a[i][j]+=b[i][j];
  31. a[i][j]+=a[i-][j-];
  32. ans^=a[i][j];
  33. }
  34. }
  35. printf("%lld\n",ans);
  36. return ;
  37. }

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$表

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<unordered_map>
  5. #include<ext/pb_ds/tree_policy.hpp>
  6. #include<ext/pb_ds/assoc_container.hpp>
  7. using namespace std;
  8. using namespace __gnu_pbds;
  9. int n,m,sta;
  10. double f[(<<)+];
  11. char s[];
  12. cc_hash_table<int,double>g;
  13. double dfs(int now,int num)
  14. {
  15. if(n-num>=m) return ;
  16. if(num<=&&f[now]!=-) return f[now];
  17. if(num>&&g.find(now)!=g.end()) return g[now];
  18. double sum=;
  19. for(int i=;i<=num>>;i++){
  20. int c1=(now>>(num-i))&,c2=(now>>(i-))&;
  21. int las1=now&((<<num-i)-),las2=now&((<<i-)-);
  22. int st1=(now>>num-i+<<num-i)+las1,st2=(now>>i<<i-)+las2;
  23. sum+=*max(dfs(st1,num-)+c1,dfs(st2,num-)+c2);
  24. }
  25. if(num&){
  26. int nn=num>>;
  27. int c=(now>>nn)&;
  28. int las=now&((<<nn)-);
  29. int st=(now>>nn+<<nn)+las;
  30. sum+=dfs(st,num-)+c;
  31. }
  32. sum=(double)sum/num;
  33. if(num<=) f[now]=sum;
  34. else g[now]=sum;
  35. return sum;
  36. }
  37. int main()
  38. {
  39. scanf("%d%d%s",&n,&m,s+);
  40. for(int i=;i<=(<<);i++) f[i]=-;
  41. sta=;
  42. for(int i=;i<=n;i++){
  43. sta<<=;
  44. if(s[i]=='W') sta|=;
  45. }
  46. printf("%.7lf\n",dfs(sta,n));
  47. return ;
  48. }

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$与父亲的边的情况,而且建树的时候也可以直接记录这条边是否需要翻转。

  1. #include<iostream>
  2. #include<cstdio>
  3. #define inf 0x7ffff
  4. using namespace std;
  5. struct node
  6. {
  7. int to,nxt,tpy;
  8. }h[];
  9. int n,tot,nxt[];
  10. pair<int,int>f[][];
  11. int read()
  12. {
  13. int aa=,bb=;char cc=getchar();
  14. while(cc>''||cc<''){if(cc=='-') bb=-;cc=getchar();}
  15. while(cc>=''&&cc<=''){aa=(aa<<)+(aa<<)+(cc^'');cc=getchar();}
  16. return aa*bb;
  17. }
  18. int add(int x,int y,int tpy)
  19. {
  20. h[++tot].to=y;
  21. h[tot].tpy=tpy;
  22. h[tot].nxt=nxt[x];
  23. nxt[x]=tot;
  24. }
  25. pair<int,int> cal(pair<int,int> a,pair<int,int> b)
  26. {
  27. return make_pair(a.first+b.first,a.second+b.second);
  28. }
  29. void dfs(int x,int fa,int tpy)
  30. {
  31. pair<int,int>w1,w2;//w1:不以x作为端点 w2:以x作为端点
  32. w1=make_pair(,);w2=make_pair(inf,inf);
  33. for(int i=nxt[x];i;i=h[i].nxt){
  34. int y=h[i].to;
  35. if(y==fa) continue;
  36. dfs(y,x,h[i].tpy);
  37. pair<int,int>tmp1=min(cal(w1,f[y][]),cal(w2,f[y][]));
  38. pair<int,int>tmp2=min(cal(w1,f[y][]),cal(w2,f[y][]));
  39. w1=tmp1;w2=tmp2;
  40. }
  41. if(tpy==){
  42. f[x][]=min(w1,make_pair(w2.first+,w2.second));
  43. f[x][]=min(make_pair(w1.first+,w1.second+),make_pair(w2.first,w2.second+));
  44. }
  45. else if(tpy==){
  46. f[x][]=make_pair(inf,inf);
  47. f[x][]=min(make_pair(w1.first+,w1.second+),make_pair(w2.first,w2.second+));
  48. }
  49. else if(tpy==){
  50. f[x][]=min(w1,make_pair(w2.first+,w2.second));
  51. f[x][]=make_pair(inf,inf);
  52. }
  53. }
  54. int main()
  55. {
  56. n=read();
  57. int u,v,c,cc;
  58. for(int i=;i<n;i++){
  59. u=read();v=read();c=read();cc=read();
  60. if(cc==) add(u,v,),add(v,u,);
  61. else add(u,v,c^cc),add(v,u,c^cc);
  62. }
  63. dfs(,,);
  64. printf("%d %d\n",f[][].first/,f[][].second);
  65. return ;
  66. }

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. Win32 程序开发:创建一个应用程序窗口

    一.创建一个应用程序窗口 代码如下: // 头文件 #include <windows.h> // 全局变量 WCHAR g_lpszClassName[] = L"CLASSN ...

  2. DirectShow 进行视频预览和录制

    这一篇讲怎么采集摄像头图像并预览,以及录制视频到本地. 程序实现流程 这里通过使用 CaptureGraphBuilder 来简化 Graph 的创建流程. 具体流程如下: 初始化 COM 库 创建各 ...

  3. 记录使用echarts的graph类型绘制流程图全过程(二)- 多层关系和圆形图片的设置

    本文主要记录在使用echarts的graph类型绘制流程图时候遇到的2个问题:对于圆形图片的剪切和多层关系的设置 图片的设置 如果用echarts默认的symbol参数来显示图片,会显示图片的原始状态 ...

  4. Ansible 日常使用技巧 - 运维总结

    Ansible默认只会创建5个进程并发执行任务,所以一次任务只能同时控制5台机器执行.如果有大量的机器需要控制,例如20台,Ansible执行一个任务时会先在其中5台上执行,执行成功后再执行下一批5台 ...

  5. PHP 扩展与 ZEND 引擎的整合

    PHP 扩展是对 PHP 功能的一个补充,编写完 PHP 扩展以后, ZEND 引擎需要获取到 PHP 扩展的信息,比如 phpinfo() 函数是如何列出 PHP 扩展的信息,PHP 扩展中的函数如 ...

  6. Spring Cloud Alibaba基础教程:Sentinel Dashboard同步Apollo存储规则

    在之前的两篇教程中我们分别介绍了如何将Sentinel的限流规则存储到Nacos和Apollo中.同时,在文末的思考中,我都指出了这两套整合方案都存在一个不足之处:不论采用什么配置中心,限流规则都只能 ...

  7. 在C#中使用Panel控件实现在一个窗体中嵌套另一个窗体

    在C#中使用Panel控件实现在一个窗体中嵌套另一个窗体 在C#中使用Panel控件实现在一个窗体中嵌套另一个窗体ShowAllPage sAllPage = new ShowAllPage();   ...

  8. javascript json的使用

    转自:http://blog.csdn.net/lushuaiyin/article/details/7061483 对于js使用json,首先到官网拷贝json.js文件,地址http://www. ...

  9. JavaScript初探 二 (了解数据)

    JavaScript初探 (二) JavaScript 事件 HTML事件 HTML事件是可以在浏览器或用户做的某些事情 HTML事件的例子: HTML网页完成加载 HTML输入字段被修改 HTML按 ...

  10. iOS10跳转至设置页面

    在iOS10之前,跳转到系统设置界面的某个指定界面的方式如下: //打开定位服务界面 NSURL*url=[NSURL URLWithString:@"prefs:root=Privacy& ...