还是困,不过已经可以用脑子思考问题了

T1 数据恢复

没啥明确的算法,可以说是贪心?

考虑部分分,

链的直接扫,

对于菊花的发现只要根节点在第一个,剩下的点位置不重要

那么按照$a/b$排序,扫一遍就行。

这启发我们正解如何考虑祖先和儿子的关系

我们设$v=\frac{a}{b}$,那么还是贪心的选择$v$最小的最优

考虑父子关系

如果当前最优的点的父亲被选,那么直接选他更优

如果当前最优的点的父亲没选,那么选上他的父亲再选他更优

这样就可以使用并查集维护,每次找到$v$最小的点后把他和他父亲合在一起,

$a,b$也合并,然后把新的节点插进可重集内,并删掉原来的两个点。

关于答案的累加,直接在合并的时候累加一个$a_j*b_i,fa[j]=i$即可。

证明:

考虑$fa[j]=i$,设$j$后面的$a$的和为$sum$,设$i,j$合并后的大点叫$k$

原来这一部分的答案为$ans=b_j*sum+b_i*(a_j+sum)$

合并后若要计算答案为$ans=b_k*sum=b_j*sum+b_i*sum$,发现少了一项$b_i*a_j$

所以直接在合并时加这一项,剩下的那些答案也会在合并这个的时候被统计,所以直接加这个是正确的。

  1. 1 #include<bits/stdc++.h>
  2. 2 #define int long long
  3. 3 using namespace std;
  4. 4 namespace AE86{
  5. 5 inline int read(){
  6. 6 int x=0,f=1;char ch=getchar();
  7. 7 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  8. 8 while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;
  9. 9 }inline void write(int x,char opt='\n'){
  10. 10 char ch[20];int len=0;if(x<0)x=~x+1,putchar('-');
  11. 11 do{ch[len++]=x%10+(1<<5)+(1<<4);x/=10;}while(x);
  12. 12 for(register int i=len-1;i>=0;--i)putchar(ch[i]);putchar(opt);}
  13. 13 }using namespace AE86;
  14. 14 const int NN=3e5+5;
  15. 15 int n,fa[NN],ans,f[NN],a[NN],b[NN];
  16. 16 bool vis[NN];
  17. 17 struct SNOW{
  18. 18 double v; int id; SNOW(){}
  19. 19 SNOW(double v,int id):v(v),id(id){}
  20. 20 bool operator<(const SNOW&x)const{
  21. 21 if(v==x.v) return id<x.id;
  22. 22 return v<x.v;
  23. 23 }
  24. 24 };multiset<SNOW> s;
  25. 25 inline int getfa(int x){return fa[x]=(fa[x]==x?x:getfa(fa[x]));}
  26. 26 inline void merge(int i,int j){//j向i合并
  27. 27 i=getfa(i); j=getfa(j);
  28. 28 if(i==j) return;
  29. 29 ans+=a[j]*b[i];
  30. 30 a[i]+=a[j];a[j]=0;
  31. 31 b[i]+=b[j];b[j]=0;
  32. 32 fa[j]=i;
  33. 33 }
  34. 34 namespace WSN{
  35. 35 inline short main(){
  36. 36 freopen("data.in","r",stdin);
  37. 37 freopen("data.out","w",stdout);
  38. 38 n=read();for(int i=2;i<=n;i++) f[i]=read();
  39. 39 vis[0]=1;
  40. 40 for(int i=1;i<=n;i++) fa[i]=i;
  41. 41 for(int i=1;i<=n;i++)
  42. 42 a[i]=read(),b[i]=read(),s.insert(SNOW(b[i]?1.0*a[i]/b[i]:0,i));
  43. 43 while(s.size()){
  44. 44 auto it=s.begin(); s.erase(it);
  45. 45 int ff=f[it->id],f2=getfa(ff);
  46. 46 vis[it->id]=1;
  47. 47 if(vis[f2]) merge(f2,it->id);
  48. 48 else{
  49. 49 s.erase(s.find(SNOW(1.0*a[f2]/b[f2],f2)));
  50. 50 merge(f2,it->id);
  51. 51 s.insert(SNOW(1.0*a[f2]/b[f2],f2));
  52. 52 }
  53. 53 }
  54. 54 write(ans);
  55. 55 return 0;
  56. 56 }
  57. 57 }
  58. 58 signed main(){return WSN::main();}

T2 下落的小球

考虑设$siz_i$表示子树大小,$w_i$表示$i$子树内叶子节点的$\sum a$,$r_i=w_i-siz_i$

那么这个$r_i$就是这颗子树可以让他的上面的那一条链掉球的数量。

那么直接对于$r$和$siz$做可重集排列就行。

  1. 1 #include<bits/stdc++.h>
  2. 2 #define int long long
  3. 3 using namespace std;
  4. 4 namespace AE86{
  5. 5 inline int read(){
  6. 6 int x=0,f=1;char ch=getchar();
  7. 7 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  8. 8 while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;
  9. 9 }inline void write(int x,char opt='\n'){
  10. 10 char ch[20];int len=0;if(x<0)x=~x+1,putchar('-');
  11. 11 do{ch[len++]=x%10+(1<<5)+(1<<4);x/=10;}while(x);
  12. 12 for(register int i=len-1;i>=0;--i)putchar(ch[i]);putchar(opt);}
  13. 13 }using namespace AE86;
  14. 14 const int NN=1e6+5,mod=1e9+7;
  15. 15 int n,fa[NN],h[NN],v[NN],w[NN],ans=1;
  16. 16 struct SNOW{int to,next;}e[NN<<1]; int head[NN],rp;
  17. 17 inline void add(int x,int y){e[++rp]=(SNOW){y,head[x]};head[x]=rp;}
  18. 18 inline int qmo(int a,int b,int ans=1){
  19. 19 int c=mod; a%=c;for(;b;b>>=1,a=a*a%c) if(b&1) ans=ans*a%c;
  20. 20 return ans;
  21. 21 }
  22. 22 inline void pre(){
  23. 23 h[0]=h[1]=1; v[0]=v[1]=1;
  24. 24 for(int i=2;i<NN;i++) h[i]=h[i-1]*i%mod;
  25. 25 v[NN-1]=qmo(h[NN-1],mod-2);
  26. 26 for(int i=NN-2;i>=2;i--) v[i]=v[i+1]*(i+1)%mod;
  27. 27 }
  28. 28 int siz[NN];
  29. 29 inline void dfs(int x){
  30. 30 siz[x]=1;int s1=0,s2=0;
  31. 31 for(int i=head[x];i;i=e[i].next){
  32. 32 int y=e[i].to; dfs(y);
  33. 33 siz[x]+=siz[y]; w[x]+=w[y];
  34. 34 s1+=w[y]-siz[y]; s2+=siz[y];
  35. 35 if(w[y]>=siz[y]) ans=ans*v[w[y]-siz[y]]%mod*v[siz[y]]%mod;
  36. 36 } if(w[x]<siz[x]) ans=0;
  37. 37 if(s1>0&&s2>0) ans=ans*h[s1]%mod*h[s2]%mod;
  38. 38 }
  39. 39 namespace WSN{
  40. 40 inline short main(){
  41. 41 freopen("ball.in","r",stdin);
  42. 42 freopen("ball.out","w",stdout);
  43. 43 n=read(); pre();
  44. 44 for(int i=2,a;i<=n;i++) a=read(),add(a,i);
  45. 45 for(int i=1;i<=n;i++) w[i]=read(); dfs(1);
  46. 46 write(ans);
  47. 47 return 0;
  48. 48 }
  49. 49 }
  50. 50 signed main(){return WSN::main();}

T3 消失的字符串

咕咕咕,只会$k=0$

T4 古老的序列问题

$n<=2000$预处理前缀和表示从$i$到$j$的$\sum \sum cost(i,j)$

然后每次询问$O(n^2)$

单调不降部分分,$\sum \sum a_l*a_r$,拆柿子预处理前缀和就行

然后不会了

  1. 1 #include<bits/stdc++.h>
  2. 2 #define int long long
  3. 3 using namespace std;
  4. 4 namespace AE86{
  5. 5 inline int read(){
  6. 6 int x=0,f=1;char ch=getchar();
  7. 7 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  8. 8 while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;
  9. 9 }inline void write(int x,char opt='\n'){
  10. 10 char ch[20];int len=0;if(x<0)x=~x+1,putchar('-');
  11. 11 do{ch[len++]=x%10+(1<<5)+(1<<4);x/=10;}while(x);
  12. 12 for(int i=len-1;i>=0;--i)putchar(ch[i]);putchar(opt);}
  13. 13 }using namespace AE86;
  14. 14 const int NN=1e5+5,mod=1e9+7;
  15. 15 int n,m,s[NN],L,R,ans;
  16. 16 int sm[2005][2005];
  17. 17 inline void task1(){
  18. 18 for(int i=1;i<=n;i++){
  19. 19 int mn=0x3fffffff,mx=0;
  20. 20 for(int j=i;j<=n;j++){
  21. 21 mn=min(mn,s[j]);mx=max(mx,s[j]);
  22. 22 sm[i][j]=(sm[i][j-1]+mn*mx%mod)%mod;
  23. 23 }
  24. 24 }
  25. 25 while(m--){
  26. 26 L=read(),R=read(),ans=0;
  27. 27 for(int i=L;i<=R;i++) ans=(ans+sm[i][R])%mod;
  28. 28 write(ans);
  29. 29 }
  30. 30 }
  31. 31 int tmp,sum[NN],S[NN];
  32. 32 inline void task2(){
  33. 33 for(int i=1;i<=n;i++) sum[i]=(sum[i-1]+s[i])%mod;
  34. 34 for(int i=1;i<=n;i++) S[i]=(S[i-1]+s[i]*sum[i-1]%mod)%mod;
  35. 35 while(m--){
  36. 36 L=read(),R=read(),ans=0;
  37. 37 ans=(sum[R]*(sum[R]-sum[L-1]+mod)%mod-(S[R]-S[L-1]+mod)%mod+mod)%mod;
  38. 38 write(ans);
  39. 39 }
  40. 40 }
  41. 41 namespace WSN{
  42. 42 inline short main(){
  43. 43 freopen("sequence.in","r",stdin);
  44. 44 freopen("sequence.out","w",stdout);
  45. 45 n=read(); m=read();
  46. 46 for(int i=1;i<=n;i++) s[i]=read();
  47. 47 if(n<=2000) return task1(),0;
  48. 48 for(int i=2;i<=n;i++) if(s[i]-s[i-1]>=0) ++tmp;
  49. 49 if(tmp==n-1) return task2(),0;
  50. 50 return 0;
  51. 51 }
  52. 52 }
  53. 53 signed main(){return WSN::main();}

30

花了一节课大概听懂了战神做法,过于弱了。。。

Noip模拟67 2021.10.3的更多相关文章

  1. Noip模拟70 2021.10.6

    T1 暴雨 放在第一道的神仙题,不同的做法,吊人有的都在用线段树维护$set$预处理 我是直接$dp$的,可能代码的复杂度比那种的稍微小一点 设$f[i][j][p][0/1]$表示考虑了前$i$列, ...

  2. Noip模拟69 2021.10.5

    考场拼命$yy$高精度结果没学好$for$循环痛失$50pts$,当场枯死 以后一定打对拍,要不考后会... T1 石子游戏 首先要知道典型的$NIM$博弈,就是说如果所有堆石子个数的异或和为$0$则 ...

  3. Noip模拟76 2021.10.14

    T1 洛希极限 上来一道大数据结构或者单调队列优化$dp$ 真就没分析出来正解复杂度 正解复杂度$O(q+nm)$,但是据说我的复杂度是假的 考虑一个点转移最优情况是从它上面的一个反$L$形转移过来 ...

  4. Noip模拟81 2021.10.20

    T1 语言 比较简单的题,然后就瞎写了,所以考场上就我一个写了线段树的,所以我的常数.... 所以就枚举动词的位置,找前面后面有没有出现$4$即可 1 #include<bits/stdc++. ...

  5. Noip模拟83 2021.10.26

    T1 树上的数 有手就能在衡中$OJ$上过,但是$WaitingCoders$不行,就是这样 必须使用$O(n)$算法加上大力卡常,思路就是找子树内没更新的更新,更新过了直接$return$ 1 #i ...

  6. Noip模拟80 2021.10.18

    预计得分:5 实际得分:140?????????????? T1 邻面合并 我考场上没切掉的大水题....(证明我旁边的cty切掉了,并觉得很水) 然而贪心拿了六十,离谱,成功做到上一篇博客说的有勇气 ...

  7. Noip模拟79 2021.10.17(题目名字一样)

    T1 F 缩点缩成个$DAG$,然后根据每个点的度数计算期望值 1 #include<cstdio> 2 #include<cstring> 3 #include<vec ...

  8. Noip模拟78 2021.10.16

    这次时间分配还是非常合理的,但可惜的是$T4$没开$\textit{long long}$挂了$20$ 但是$Arbiter$上赏了蒟蒻$20$分,就非常不错~~~ T1 F 直接拿暴力水就可以过,数 ...

  9. Noip模拟77 2021.10.15

    T1 最大或 $T1$因为没有开$1ll$右移给炸掉了,调了一年不知道为啥,最后实在不懂了 换成$pow$就过掉了,但是考场上这题耽误了太多时间,后面的题也就没办法好好打了.... 以后一定要注意右移 ...

随机推荐

  1. 获取input对应的的选项

    需求是把所有题目中的选项ABCDEF等对应保存到后台, 这个问卷中有多选项和单选项 var data = {}; $(".u-box .u-item").each(function ...

  2. POJ3061——Subsequence(尺取法)

    Subsequence POJ - 3061 给定长度为n的数列整数a0,a1,a2-an-1以及整数S.求出总和不小于S的连续子序列的长度的最小值,如果解不存在输出0. 反复推进区间的开头和末尾,来 ...

  3. Docker系列(17)- MySQL同步数据

    #获取镜像 [root@localhost ~]# docker pull mysql:5.7 #启动容器,需要做数据挂载!安装启动mysql,需要配置密码的,这是注意点! #官方安装文档:docke ...

  4. MySql分区、分表和分库

    MySql分区.分表和分库 数据库的数据量达到一定程度之后,为避免带来系统性能上的瓶颈.需要进行数据的处理,采用的手段是分区.分片.分库.分表. 一些问题的解释: 1.为什么要分表和分区? 日常开发中 ...

  5. 有哪些浏览器还支持flash?

    Flash是大名鼎鼎的全家桶公司Adobe设计的一款网页动画软件,早期的动态网页基本都是基于Flash开发的.但是后来不断爆出关于Flash的安全漏洞和运行效率问题,虽然Adobe公司一直在尝试解决, ...

  6. FastAPI logger日志记录方案 loguru模块

    实现方式: 采用 loguru 模块.跟flask直接挂载到app上有区别,当然也可以尝试去这样做. 但是 好像没有这个必要.要的就是个快速.整那些子虚乌有的东西完全木有意义. 1.首先是去项目git ...

  7. 1.3redis小结--配置php reids拓展

    1.执行php文件 输出phpinfo();  <?php phpinfo(); 2.根据PHPinfo的信息确定需要下载的 php_redis.dll , php_igbinary.dll 版 ...

  8. 对代理IP进行检测是否可用

    第一种方法是使用telnetlib import telnetlib import requests from lxml import etree #解析此url页面的IP url = 'http:/ ...

  9. 测试开发【提测平台】分享11-Python实现邮件发送的两种方法实践

    微信搜索[大奇测试开],关注这个坚持分享测试开发干货的家伙. 按照开发安排,本篇本应该是关于提测页面的搜索和显示实现,怕相似内容疲劳,这期改下内容顺序,将邮件服务的相关的提前,在之前的产品需求和原型中 ...

  10. 关于java中BigDecimal的简介

    关于java中BigDecimal的简介 1.BigDecimal属于大数据,精度极高,不属于基本数据类型,属于java对象(引用数据类型), 这是sun提供的一个类,专门用在财务软件中. 2.注意: ...