日期:

八月第一天

 总分:

300分

 难度:

提高 ~ 省选  

 得分:

100分(不应该啊!)

题目目录:

T1:战争调度

T2:选数

T3:由乃的OJ

赛后心得:

MMP,首先第一题花了大概一半的时间,碰巧想到了正解。

好吧,作为数学渣的我看到T2肯定是懵的啦!T3又那么难,导致我后半场比赛都在发呆……

看来我要恶补数学了!!……

题解:

T1:战争调度

树形dp,暴力枚举每个点的染色情况,发$f[i][j]$表示$i$的子树中,有$j$个黑点,所产生的最大贡献。

时间复杂度 $O(2^{2n+1})$

CODE:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5.  
  6. int n,m,ans=,f[][],v[][][];
  7. bool p[];
  8.  
  9. void dfs(int x,int d){
  10. memset(f[x],,sizeof(f[x]));
  11. if(d==){
  12. for(int j=;j<=n-;j++){
  13. if(p[j+])f[x][]+=v[x][j][];
  14. else f[x][]+=v[x][j][];
  15. }
  16. return;
  17. }
  18. p[d]=true,dfs(x<<,d-),dfs(x<<|,d-);
  19. for(int i=;i<(<<d-);i++){
  20. for(int j=;j<(<<d-);j++)
  21. f[x][i+j]=max(f[x][i+j],f[x<<][i]+f[x<<|][j]);
  22. }
  23. p[d]=false,dfs(x<<,d-),dfs(x<<|,d-);
  24. for(int i=;i<(<<d-);i++){
  25. for(int j=;j<(<<d-);j++)
  26. f[x][i+j]=max(f[x][i+j],f[x<<][i]+f[x<<|][j]);
  27. }
  28. }
  29.  
  30. int main(){
  31. scanf("%d%d",&n,&m);
  32. for(int i=(<<n-);i<(<<n);i++){
  33. for(int j=;j<=n-;j++)
  34. scanf("%d",v[i][j]+);
  35. }
  36. for(int i=(<<n-);i<(<<n);i++){
  37. for(int j=;j<=n-;j++)
  38. scanf("%d",v[i][j]+);
  39. }
  40. dfs(,n);
  41. for(int i=;i<=m;i++)ans=max(ans,f[][i]);
  42. printf("%d",ans);
  43. }

T2:选数

推公式应该不算太难,只不过这题要用杜教筛。

\begin{aligned}
ans&=\sum^H_{x_i=L}[gcd(x_i)=K]\\
&=\sum^h_{x_i=l}[gcd(x_i)=1] &(l=\lfloor\frac{L-1}{K}\rfloor,h=\lfloor\frac{H}{K}\rfloor)\\
&=\sum^h_{x_i=l}\sum_{d\mid gcd(x_i)}\mu(d)\\
&=\sum^h_{x_i=l}\sum_{d\mid x_i}\mu(d)\\
&=\sum^h_{d=1}\sum_{l<x_i h,d\mid x_i}\mu(d)\\
&=\sum^h_{d=1}(\lfloor\frac{h}{d}\rfloor-\lfloor\frac{l}{d}\rfloor)^n\mu(d)\\
\end{aligned}

CODE:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<map>
  4. using namespace std;
  5.  
  6. #define mod 1000000007
  7. int n,k,l,r,ans=;
  8. int mu1[],pri[],cnt=;
  9. bool vis[];
  10. map<int,int> mu2;
  11.  
  12. int qpow(int x,int y){
  13. int ans=;
  14. while(y){
  15. if(y&)ans=1LL*ans*x%mod;
  16. y>>=,x=1LL*x*x%mod;
  17. }
  18. return ans;
  19. }
  20.  
  21. int init(){
  22. mu1[]=;
  23. for(int i=;i<=;i++){
  24. if(!vis[i]){
  25. mu1[i]=-;
  26. pri[++cnt]=i;
  27. }
  28. for(int j=;j<=cnt&&i*pri[j]<=;j++){
  29. vis[i*pri[j]]=true;
  30. if(i%pri[j]==){
  31. mu1[i*pri[j]]=;break;
  32. }else mu1[i*pri[j]]=-mu1[i];
  33. }
  34. }
  35. for(int i=;i<=;i++)mu1[i]+=mu1[i-];
  36. }
  37.  
  38. int get_mu(int x){
  39. if(x<=)return mu1[x];
  40. if(mu2.count(x))return mu2[x];
  41. long long ans=;
  42. for(int i=,pos;i<=(x>>);i=pos+){
  43. pos=x/(x/i);
  44. ans-=1LL*(get_mu(pos)-get_mu(i-))*(x/i-);
  45. }
  46. return mu2[x]=(ans+mod)%mod;
  47. }
  48.  
  49. int main(){
  50. scanf("%d%d%d%d",&n,&k,&l,&r);
  51. init();
  52. l=(l-)/k,r=r/k;
  53. for(int i=,pos;i<=r;i=pos+){
  54. pos=min(r/(r/i),l/i?(l/(l/i)):(int)2e9);
  55. ans=(ans+1LL*qpow(r/i-l/i,n)*(get_mu(pos)-get_mu(i-)))%mod;
  56. }
  57. printf("%d",(ans+mod)%mod);
  58. }

T3:由乃的OJ

强烈建议先做简化版——起床困难综合症

核心:位运算每位独立,互不影响,不像加法、乘法会有进位!!

这个只不过变为了多组查询,树上操作。

用树剖啊!!线段树维护每一位正着和反着,每一位 1 与 0 的情况,压在一个 unsigned long long 里

会做那题,肯定能想到这题的正解,只不过很考验代码实现能力。

CODE:

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4.  
  5. #define LL long long
  6. #define lch (o<<1)
  7. #define rch (o<<1|1)
  8. int n,m,k,ot,x,y,tot=,cnt=,h[];
  9. int fa[],dep[],son[],opt[];
  10. int siz[],tp[],tid[],rak[];
  11. unsigned long long z,val[];
  12. struct Node{
  13. unsigned long long L0,L1,R0,R1;
  14. }v[],ans1[],ans2[];
  15. struct Edge{
  16. int x,next;
  17. }e[];
  18.  
  19. void add_edge(int x,int y){
  20. e[++tot].x=y;
  21. e[tot].next=h[x],h[x]=tot;
  22. }
  23.  
  24. void dfs1(int x,int father,int deep){
  25. fa[x]=father,dep[x]=deep,siz[x]=;
  26. for(int i=h[x];i;i=e[i].next){
  27. if(e[i].x==father)continue;
  28. dfs1(e[i].x,x,deep+);
  29. siz[x]+=siz[e[i].x];
  30. if(siz[e[i].x]>siz[son[x]])son[x]=e[i].x;
  31. }
  32. }
  33.  
  34. void dfs2(int x,int top){
  35. tp[x]=top,tid[x]=++cnt,rak[cnt]=x;
  36. if(son[x])dfs2(son[x],top);
  37. for(int i=h[x];i;i=e[i].next){
  38. if(e[i].x==fa[x]||e[i].x==son[x])continue;
  39. dfs2(e[i].x,e[i].x);
  40. }
  41. }
  42.  
  43. unsigned LL opr(unsigned LL x,int opt,unsigned LL y){
  44. if(opt==)return x&y;
  45. if(opt==)return x|y;
  46. if(opt==)return x^y;
  47. }
  48.  
  49. Node merge(Node l,Node r){
  50. Node o;
  51. o.L0=o.L1=o.R0=o.R1=;
  52. o.L0=(l.L0&r.L1)|((~l.L0)&r.L0);
  53. o.L1=(l.L1&r.L1)|((~l.L1)&r.L0);
  54. o.R0=(r.R0&l.R1)|((~r.R0)&l.R0);
  55. o.R1=(r.R1&l.R1)|((~r.R1)&l.R0);
  56. return o;
  57. }
  58.  
  59. void build(int o,int l,int r){
  60. if(r==l){
  61. v[o].L0=v[o].R0=opr(,opt[rak[l]],val[rak[l]]);
  62. v[o].L1=v[o].R1=opr(-,opt[rak[l]],val[rak[l]]);
  63. }else{
  64. int mid=l+r>>;
  65. build(lch,l,mid),build(rch,mid+,r);
  66. v[o]=merge(v[lch],v[rch]);
  67. }
  68. }
  69.  
  70. void update(int o,int l,int r,int x){
  71. if(r==l){
  72. v[o].L0=v[o].R0=opr(,opt[rak[l]],val[rak[l]]);
  73. v[o].L1=v[o].R1=opr(-,opt[rak[l]],val[rak[l]]);
  74. }else{
  75. int mid=l+r>>;
  76. if(x<=mid)update(lch,l,mid,x);
  77. else update(rch,mid+,r,x);
  78. v[o]=merge(v[lch],v[rch]);
  79. }
  80. }
  81.  
  82. Node query(int o,int l,int r,int x,int y){
  83. if(l>=x&&r<=y)return v[o];
  84. else{
  85. int mid=l+r>>,pd=false;
  86. Node ans;
  87. if(x<=mid)ans=query(lch,l,mid,x,y),pd=true;
  88. if(y>mid){
  89. if(pd)ans=merge(ans,query(rch,mid+,r,x,y));
  90. else ans=query(rch,mid+,r,x,y);
  91. }
  92. return ans;
  93. }
  94. }
  95.  
  96. Node solve(int x,int y){
  97. int cnt1=,cnt2=;
  98. while(tp[x]!=tp[y]){
  99. if(dep[tp[x]]>dep[tp[y]]){
  100. ans1[++cnt1]=query(,,n,tid[tp[x]],tid[x]);
  101. x=fa[tp[x]];
  102. }
  103. else{
  104. ans2[++cnt2]=query(,,n,tid[tp[y]],tid[y]);
  105. y=fa[tp[y]];
  106. }
  107. }
  108. if(dep[x]<dep[y])
  109. ans2[++cnt2]=query(,,n,tid[x],tid[y]);
  110. else
  111. ans1[++cnt1]=query(,,n,tid[y],tid[x]);
  112. for(int i=;i<=cnt1;i++)
  113. swap(ans1[i].L0,ans1[i].R0),swap(ans1[i].L1,ans1[i].R1);
  114. Node sum;
  115. if(cnt1)sum=ans1[];
  116. else sum=ans2[cnt2];
  117. for(int i=;i<=cnt1;i++)sum=merge(sum,ans1[i]);
  118. if(cnt1&&cnt2)sum=merge(sum,ans2[cnt2]);
  119. for(int i=cnt2-;i>=;i--)sum=merge(sum,ans2[i]);
  120. return sum;
  121. }
  122.  
  123. int main(){
  124. scanf("%d%d%d",&n,&m,&k);
  125. for(int i=;i<=n;i++)
  126. scanf("%d%llu",opt+i,val+i);
  127. for(int i=;i<n;i++){
  128. scanf("%d%d",&x,&y);
  129. add_edge(x,y);
  130. add_edge(y,x);
  131. }
  132. dfs1(,-,),dfs2(,);
  133. build(,,n);
  134. for(int i=;i<=m;i++){
  135. scanf("%d%d%d%llu",&ot,&x,&y,&z);
  136. if(ot==){
  137. Node a=solve(x,y);
  138. unsigned LL ans=;
  139. for(int j=;j>=;j--){
  140. if(a.L0&(1ULL<<j))ans+=1ULL<<j;
  141. else if(a.L1&(1ULL<<j)&&(1ULL<<j)<=z)
  142. ans+=1ULL<<j,z-=1ULL<<j;
  143. }
  144. printf("%llu\n",ans);
  145. }
  146. if(ot==){
  147. opt[x]=y,val[x]=z;
  148. update(,,n,tid[x]);
  149. }
  150. }
  151. }

可怕!!

2017.8.1 Noip2018模拟测试赛(十七)的更多相关文章

  1. 2017.8.2 Noip2018模拟测试赛(十八)

     日期: 八月二日  总分: 300分  难度: 提高 ~ 省选  得分: 40分(又炸蛋了!!) 题目列表: T1:分手是祝愿 T2:残缺的字符串 T3:树点涂色 赛后心得: 哎,T1求期望,放弃. ...

  2. 2018.8.8 Noip2018模拟测试赛(二十一)

    日期: 八月七号  总分: 300分  难度: 提高 ~ 省选    得分: 112分(OvO) 题目目录: T1:幸福的道路 T2:Solitaire T3:Flags 赛后心得: 第一题裸树d啊! ...

  3. 2018.8.7 Noip2018模拟测试赛(二十)

    日期: 八月七号  总分: 300分  难度: 提高 ~ 省选    得分: 100分(呵呵一笑) 题目列表: T1:SS T2:Tree Game T3:二元运算 赛后反思: Emmmmmm…… 开 ...

  4. 2018.8.6 Noip2018模拟测试赛(十九)

    日期: 八月六号  总分: 300分  难度: 提高 ~ 省选    得分: 10分(MMP) 题目目录: T1:Tree T2:异或运算 T3:Tree Restoring 赛后反思: Emmmmm ...

  5. 2018.7.31 Noip2018模拟测试赛(十六)

     日期: 七月最后一天  总分: 300分  难度: 提高 ~ 省选  得分: 30分(少的可怜) 我太弱了:(题目目录) T1:Mushroom追妹纸 T2:抵制克苏恩 T3:美味 失分分析:(QA ...

  6. noi2019模拟测试赛(四十七)

    noi2019模拟测试赛(四十七) T1与运算(and) 题意: ​ 给你一个序列\(a_i\),定义\(f_i=a_1\&a_2\&\cdots\&a_i\),求这个序列的所 ...

  7. [2018冬令营模拟测试赛(二十一)]Problem A: Decalcomania

    [2018冬令营模拟测试赛(二十一)]Problem A: Decalcomania 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见&quo ...

  8. [CSP-S模拟测试]:赛(贪心+三分)

    题目描述 由于出题人思维枯竭所以想不出好玩的背景.有$n$个物品,第$i$个物品的价格是$v_i$,有两个人,每个人都喜欢$n$个物品中的一些物品.要求选出正好$m$个物品,满足选出的物品中至少有$k ...

  9. [NOIP2018模拟赛10.16]手残报告

    [NOIP2018模拟赛10.16]手残报告 闲扯 炉石乱斗模式美滋滋啊,又颓到好晚... 上来T2先敲了树剖,看T1发现是个思博DP,然后没过大样例,写个暴力发现还是没过大样例!?才发现理解错题意了 ...

随机推荐

  1. npm 安装插件失败

    由于npm的很多安装包的下载源来自国外网站,所以比较缓慢甚至访问失败. 再此可以用淘宝的镜像文件来安装插件.方法其实很简单:

  2. cocos2d-x中解决暂停并保存画面和开始的功能

    1.调用所有对象的pauseSchedulerAndActions().太麻烦,不太现实,而且有很多对象不易获取. 2.CCDirector::sharedirector()->pause(). ...

  3. 51nod——2504 是子序列的个数(一看就会的序列自动机原理)

    还以为序列自动机是什么,写完无意间看到帖子原来这就是序列自动机……这算自己发现算法

  4. [LOJ] #2360. 「NOIP2016」换教室

    期望DP #include<iostream> #include<cstring> #include<cstdio> #include<cctype> ...

  5. LNMP一键安装包开启pathinfo和rewrite模式

    此教程适用于集成安装包lnmp,官网是https://lnmp.org/ 一. 开启pathinfo #注释 下面这一行 #include enable-php.conf #载入新的配置文件 incl ...

  6. ASP( VBScript ) 解析 JSON

    <script language="jscript" runat="server"> Array.prototype.get = function( ...

  7. PHP将html内容转换为image图片

    /** * 将html内容转换为image图片 * @param $htmlcontent * @param $toimagepath * @author james.ou 2011-11-1 */ ...

  8. crond定时操作 crontab

    * * * * *  分别表示 分钟  小时  日  月  星期(0-6) 30 17,28,19 * * *  或 30 17-19 * * *  在每天的17-19小时半点时刻执行 30 8-18 ...

  9. hashable与unhashable

    不可哈希(unhashable):就是指其可变,如列表.字典等,都能原地进行修改. 可哈希(hashable):不可变,如字符串.元组那样,不能原地修改. 利用set()和{}建立集合时,要求集合中的 ...

  10. solr7.7.1完整教程

    安装 上传solr-7.7.1.tgz至服务器 opt文件加下 解压 tar -zxvf solr-7.7.1.tgz 运行 进入到加压后的文件夹/opt/solr-7.7.1,执行一下命令启动sol ...