cf1187解题报告

cf

A

去掉都有的,剩下的取最大值+1

  1. #include <bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. signed main() {
  5. int T;
  6. cin>>T;
  7. while(T--) {
  8. int n,s,t;
  9. cin>>n>>s>>t;
  10. int k=s+t-n;
  11. s-=k,t-=k;
  12. int ans=max(s,t)+1;
  13. cout<<ans<<"\n";
  14. }
  15. return 0;
  16. }

B

有点笨的办法,每个字母分别二分,得到的最大值是答案。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. const int N=4e5+7;
  5. int n,m,sum[N][26],tong[26];
  6. char s[N];
  7. int main() {
  8. scanf("%d%s",&n,s+1);
  9. for(int i=1;i<=n;++i) {
  10. for(int j=0;j<26;++j) sum[i][j]=sum[i-1][j];
  11. sum[i][s[i]-'a']++;
  12. }
  13. scanf("%d",&m);
  14. for(int i=1;i<=m;++i) {
  15. scanf("%s",s+1);
  16. int len=strlen(s+1),ans=0;
  17. for(int j=0;j<26;++j) tong[j]=0;
  18. for(int j=1;j<=len;++j) tong[s[j]-'a']++;
  19. for(int j=0;j<26;++j) {
  20. int l=1,r=n,tmp=0;
  21. while(l<=r) {
  22. int mid=(l+r)>>1;
  23. if(sum[mid][j]>=tong[j]) tmp=mid,r=mid-1;
  24. else l=mid+1;
  25. }
  26. ans=max(ans,tmp);
  27. }
  28. printf("%d\n",ans);
  29. }
  30. return 0;
  31. }

C

1的区间是相同的个数,能降就降,最后check。

wrong了几发:先n^2判断包含判断NO,然后直接YES,显然是错的。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N=1e5+7;
  4. int read() {int x;cin>>x;return x;}
  5. int n,m;
  6. vector<pair<int,int> > a[2];
  7. int vis[N],ans[N];
  8. int main() {
  9. scanf("%d%d",&n,&m);
  10. for(int i=1;i<=m;++i) {
  11. int opt=read(),l=read(),r=read();
  12. a[opt].push_back(make_pair(l,r));
  13. }
  14. sort(a[0].begin(),a[0].end());
  15. sort(a[1].begin(),a[1].end());
  16. for(int i=1;i<=n;++i) ans[i]=1;
  17. int js=n<<1,l=0;
  18. for(auto i:a[1]) {
  19. if(i.second<=l) continue;
  20. if(i.first>l) {js--;for(int j=l+1;j<i.first;++j) ans[j]=js--;}
  21. for(int j=i.first;j<=i.second;++j) ans[j]=js;
  22. l=max(i.second,l);
  23. }
  24. while(l+1<=n) ans[++l]=--js;
  25. for(auto i:a[0]) {
  26. int flag=0;
  27. for(int j=i.first+1;j<=i.second;++j)
  28. if(ans[j]!=ans[j-1]) flag=1;
  29. if(!flag) return puts("NO"),0;
  30. }
  31. printf("YES\n");
  32. for(int i=1;i<=n;++i) cout<<ans[i]<<" ";
  33. return 0;
  34. }

D

我感觉D和E反了。

一开始:前后的数字的前面的大于他的相对位置不变。

正确:和一开始差不多?类似冒泡,依次把\(b_i\)的对应的\(a_j\)挪过来,挪的过程中当然是只能和最大的挪。

是区间的最小值。用线段树维护。

  1. #include <bits/stdc++.h>
  2. #define ls rt<<1
  3. #define rs rt<<1|1
  4. using namespace std;
  5. const int N=3e5+7;
  6. int T,n,a[N],b[N];
  7. int read() {
  8. int x=0,f=1;char s=getchar();
  9. for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
  10. for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
  11. return x*f;
  12. }
  13. namespace seg {
  14. int mi[N<<2];
  15. void build(int l,int r,int rt) {
  16. if(l==r) return mi[rt]=a[l],void();
  17. int mid=(l+r)>>1;
  18. build(l,mid,ls);
  19. build(mid+1,r,rs);
  20. mi[rt]=min(mi[ls],mi[rs]);
  21. }
  22. int query(int l,int r,int L,int R,int rt) {
  23. if(L<=l&&r<=R) return mi[rt];
  24. int mid=(l+r)>>1;
  25. if(L<=mid&&R>mid) return min(query(l,mid,L,R,ls),query(mid+1,r,L,R,rs));
  26. else if(L<=mid) return query(l,mid,L,R,ls);
  27. else return query(mid+1,r,L,R,rs);
  28. }
  29. void modify(int L,int l,int r,int rt) {
  30. if(l==r) return mi[rt]=0x3f3f3f3f,void();
  31. int mid=(l+r)>>1;
  32. if(L<=mid) modify(L,l,mid,ls);
  33. else modify(L,mid+1,r,rs);
  34. mi[rt]=min(mi[ls],mi[rs]);
  35. }
  36. }
  37. vector<int> T_T[N],OwO[N];
  38. int pos[N];
  39. void solve() {
  40. n=read();
  41. for(int i=1;i<=n;++i) T_T[i].clear(),OwO[i].clear();
  42. for(int i=1;i<=n;++i) a[i]=read(),T_T[a[i]].push_back(i);
  43. for(int i=1;i<=n;++i) b[i]=read(),OwO[b[i]].push_back(i);
  44. for(int i=1;i<=n;++i) if(T_T[i].size()!=OwO[i].size()) return puts("NO"),void();
  45. for(int i=1;i<=n;++i) pos[i]=0;
  46. seg::build(1,n,1);
  47. for(int i=1;i<=n;++i) {
  48. int r=T_T[b[i]][pos[b[i]]++];
  49. if(seg::query(1,n,1,r,1)<b[i]) return puts("NO"),void();
  50. seg::modify(r,1,n,1);
  51. }
  52. return puts("YES"),void();
  53. }
  54. int main() {
  55. T=read();
  56. while(T--) solve();
  57. return 0;
  58. }

E

题目大意:给你一棵白色树,每次选个和黑点的白点,加上他所在白色联通块的贡献,然后染黑。初始点任选。

先求出任意一个点的贡献。然后考虑换根就行了。

\(f[u]=f[v]+n-siz[v]*2\)

  1. #include <bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. const int N=2e5+7;
  5. vector<int> G[N];
  6. int n,siz[N],f[N];
  7. void dfs1(int u,int fa) {
  8. siz[u]=1;
  9. for(auto v:G[u]) {
  10. if(v==fa) continue;
  11. dfs1(v,u);
  12. siz[u]+=siz[v];
  13. }
  14. f[1]+=siz[u];
  15. }
  16. void dfs2(int u,int fa) {
  17. for(auto v:G[u]) {
  18. if(v==fa) continue;
  19. f[v]=f[u]+n-siz[v]-siz[v];
  20. dfs2(v,u);
  21. }
  22. }
  23. signed main() {
  24. scanf("%lld",&n);
  25. for(int i=1,u,v;i<n;++i) {
  26. scanf("%lld%lld",&u,&v);
  27. G[u].push_back(v),G[v].push_back(u);
  28. }
  29. dfs1(1,0),dfs2(1,0);
  30. int ans=0;
  31. for(int i=1;i<=n;++i) ans=max(ans,f[i]);
  32. printf("%lld\n",ans);
  33. return 0;
  34. }

cf1187解题报告的更多相关文章

  1. CH Round #56 - 国庆节欢乐赛解题报告

    最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...

  2. 二模13day1解题报告

    二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...

  3. BZOJ 1051 最受欢迎的牛 解题报告

    题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4438  Solved: 2353[S ...

  4. 习题:codevs 2822 爱在心中 解题报告

    这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...

  5. 习题:codevs 1035 火车停留解题报告

    本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...

  6. 习题: codevs 2492 上帝造题的七分钟2 解题报告

    这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...

  7. 习题:codevs 1519 过路费 解题报告

    今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...

  8. NOIP2016提高组解题报告

    NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合

  9. LeetCode 解题报告索引

    最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中......                        ...

随机推荐

  1. 《PHP7底层设计与源码实现》学习笔记2——结构体对齐

    书里给了一段代码,假如有个结构体如下: struct test {     char a;     int b;     long c;     void* d;     int e;     cha ...

  2. 封装:Windows系统文件图标

    原文:封装:Windows系统文件图标 用途:用于获取文件系统默认图标 using System; using System.Collections.Generic; using System.Dra ...

  3. 递归-求n和n以前的自然数

    #include <iostream> using namespace std; void zrs(int n)//用递归求自然数(n和它之前) { ) { cout<<< ...

  4. 带入gRPC:分布式链路追踪 gRPC + Opentracing + Zipkin

    在实际应用中,你做了那么多 Server 端,写了 N 个 RPC 方法.想看看方法的指标,却无处下手? 本文将通过 gRPC + Opentracing + Zipkin 搭建一个分布式链路追踪系统 ...

  5. Linux环境下:vmware安装Windows报错误-缺少所需的CD/DVD驱动器设备驱动程序

    解决方法:将硬盘格式从SCSI改为IDE. 方法如下: 右键点击你新建的虚拟机名,点击最下面的setting,看到左侧第二行是hard disk 了么,你那里肯定是SCSI的,选中它,点最下面的rem ...

  6. 计算n阶乘中尾部零的个数

    大佬答案 大佬的思路看了好久,每次看都会明白一丢丢,现在还有不明白的地方,但是要往后继续加油了,知新温故. 结论:参与阶乘的所有数的因子中只要存在一个2和一个5就会在阶乘的结果中产生一个0. 又因为因 ...

  7. Android四大组件——Activity跳转动画、淡出淡入、滑出滑入、自定义退出进入

    Activity跳转动画.淡入淡出.滑入滑出.自定义退出进入 前言: 系统中有两个定义好的Activity跳转动画:fade_in.fade_out.slide_in_left.slide_out_r ...

  8. sweetalert 弹框简单使用

    sweetalert网站 简单使用教程 拷贝文件 放到项目中 使用 页面效果 修改代码应用到事件中 成功删除演示(后台数据也会删除) 作 者:郭楷丰 出 处:https://www.cnblogs.c ...

  9. shell:echo -e "\033字体颜色"

    格式: echo -e "\033[字背景颜色;字体颜色m字符串\033[0m" 例如: echo -e "\033[41;36m 你好 \033[0m" 其中 ...

  10. MySQL的JOIN连接

    MySQL的JOIN join的含义跟英文单词"join"一样,连接连接两张表.分为 内连接:inner join 外连接   (1)左外连接(左边的表不加限制):left joi ...