2020 China Collegiate Programming Contest Qinhuangdao Site 补题部分

已经补AEFGK

E. Exam Results

枚举+二分+动态开点权值线段树O(nlogN)O(nlogN)O(nlogN)
智商太低,想不到什么贪心只能暴力数据结构维护

对于所有学生的最高成绩只可能是ai(1≤i≤n)a_i(1\leq i\leq n)ai(1in)或者最大bib_ibi,对于后面一种情况直接特殊考虑一下即可,下面主要分析最高成绩是ai(1≤i≤n)a_i(1\leq i\leq n)ai(1in)的情况。

首先将所有学生按照aaa从大到小排序,然后依次枚举每一个学生的aia_iai作为最高成绩,假设当前这位是aia_iai,那么对于i→ni\to nin这些学生的分数肯定越大越好即所有学生的成绩应该是aaa,统计i→ni\to nin满足题目意思的个数只需要二分一下即可。
而对于1→i−11\to i-11i1这些学生,我们知道要保证当前aia_iai是最高成绩这些学生的分数一定不能是aaa,只能是bbb,因此每考虑一个学生后把当前学生的bbb加入到动态开点权值线段树中,然后对于1→i−11\to i-11i1这些学生只需要直接查询即可。
注意当前aia_iai不能作为最高分数的情况当且仅当权值线段树中的b的最大值大于aia_iai

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<random>
#include<bitset>
#include<string>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<unordered_map>
#include<unordered_set>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int mod=1e9+7;
const int N=200010;
struct node1
{int a,b;
}q[N];
bool cmp1(node1 &x,node1 &y)
{if(x.a==y.a) return x.b<y.b;return x.a>y.a;
}
bool cmp2(node1 &x,node1 &y)
{if(x.b==y.b) return x.a>y.a;return x.b>y.b;
}
int n,p;
struct node2
{int l,r;int sz;
}tree[N*40];
int root,cnt;
void insert(int &u,int l,int r,int pos)
{if(!u) u=++cnt;if(l==r) {tree[u].sz++;return;}int mid=l+r>>1;if(pos<=mid) insert(tree[u].l,l,mid,pos);else insert(tree[u].r,mid+1,r,pos);tree[u].sz=tree[tree[u].l].sz+tree[tree[u].r].sz;
}
int query(int u,int l,int r,int L,int R)
{if(L>R) return 0;if(!u) return 0;if(l>=L&&r<=R) return tree[u].sz;int mid=l+r>>1;int v=0;if(L<=mid) v+=query(tree[u].l,l,mid,L,R);if(R>mid) v+=query(tree[u].r,mid+1,r,L,R);return v;
}
void clear(int &u,int l,int r)
{if(!u) return;if(l==r){tree[u].sz=0;u=0;return;}int mid=l+r>>1;clear(tree[u].l,l,mid);clear(tree[u].r,mid+1,r);tree[u].sz=0;u=0;
}
int main()
{IO;int T=1;cin>>T;for(int ca=1;ca<=T;ca++){cin>>n>>p;for(int i=1;i<=n;i++)cin>>q[i].a>>q[i].b;int res=0;sort(q+1,q+1+n,cmp1);for(int i=1;i<=n;i++){int fl=(1ll*q[i].a*p+99)/100;if(query(root,1,1e9,q[i].a+1,1e9)>0) {insert(root,1,1e9,q[i].b);continue;}int l=i,r=n;while(l<r){int mid=l+r+1>>1;if(q[mid].a>=fl) l=mid;else r=mid-1;}res=max(res,r-i+1+query(root,1,1e9,fl,q[i].a));insert(root,1,1e9,q[i].b);}sort(q+1,q+1+n,cmp2);int now=1,fl=(1ll*q[1].b*p+99)/100;  //之前now=0一直wa,应该把now=1 少算了一个点for(int i=2;i<=n;i++)   if(q[i].a>=fl&&q[i].a<=q[1].b||q[i].b>=fl) now++;res=max(now,res);printf("Case #%d: %d\n",ca,res);clear(root,1,1e9);cnt=0;//清点}return 0;
}

F. Friendly Group

并查集维护一下连通性即可。

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
//#pragma GCC optimize(2)
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<random>
#include<bitset>
#include<string>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<unordered_map>
#include<unordered_set>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int mod=1e9+7;
const int N=1000010;
int h[N],e[2*N],ne[2*N],idx;
int p[N];
int find(int x) {return x==p[x]?x:p[x]=find(p[x]);}
void add(int a,int b)
{e[idx]=b;ne[idx]=h[a];h[a]=idx++;
}
pii edge[N];
bool st[N];
void dfs(int u,int fa)
{st[u]=1;for(int i=h[u];i!=-1;i=ne[i]){int j=e[i];if(j==fa||st[j]) continue;dfs(j,u);}
}
int main()
{IO;int T=1;cin>>T;for(int ca=1;ca<=T;ca++){int n,m;cin>>n>>m;for(int i=1;i<=n;i++){p[i]=i;st[i]=0;h[i]=-1;}idx=0;for(int i=1;i<=m;i++) {int a,b;cin>>a>>b;edge[i]={a,b};add(a,b),add(b,a);}for(int i=1;i<=m;i++){int a=edge[i].first,b=edge[i].second;if(st[a]||st[b]) continue;int pa=find(a),pb=find(b);if(pa==pb)dfs(a,-1);elsep[pa]=pb;}int cnt=0;for(int i=1;i<=n;i++) cnt-=st[i];for(int i=1;i<=m;i++){int a=edge[i].first,b=edge[i].second;if(st[a]&&st[b]) cnt++;}printf("Case #%d: %d\n",ca,cnt);}return 0;
}

G. Good Number

按块考虑,数学题。

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
//#pragma GCC optimize(2)
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<random>
#include<bitset>
#include<string>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<unordered_map>
#include<unordered_set>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int mod=1e9+7;
const int N=200010;
int n;
int main()
{IO;int T=1;cin>>T;for(int ca=1;ca<=T;ca++){ll res=0;ll n,k;cin>>n>>k;if(k==1||k>=30){printf("Case #%d: %d\n",ca,n);continue;}ll m=pow(n,1.0/k);for(int i=1;i<=m;i++){ll l=pow(i,k);ll r=min(n,(long long)pow(i+1,k)-1);res+=r/i-(l-1)/i;}printf("Case #%d: %d\n",ca,res);}return 0;
}

K. Kingdom’s Power

大佬题解1大佬题解2
看了大佬的题解,我想了一个贪心:把所有叶子拿出来,然后按照深度排序,依次遍历每个叶子,当前叶子对答案的贡献:要么从前一个叶子过来的费用(lca求一下即可)要么从根节点过来的费用。然而TLE了,也不知道这样贪心对不对先记下来吧。顺便存个tarjan求lca的板子

错误orTLE代码
//TLE
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<random>
#include<bitset>
#include<string>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<unordered_map>
#include<unordered_set>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int mod=1e9+7;
const int N=1000010;
int h[N],e[N],ne[N],idx;
void add(int a,int b){e[idx]=b,ne[idx]=h[a],h[a]=idx++;}
int dep[N];
int res,n;
int leaf[N],cnt;
bool cmp(int x,int y){return dep[x]<dep[y];}
void dfs1(int u)
{int now=0;for(int i=h[u];i!=-1;i=ne[i]){int t=e[i];now++;dep[t]=dep[u]+1;dfs1(t);}if(!now) leaf[++cnt]=u;
}
// tarjan 求lca
vector<pii> q[N];
int anc[N],st[N],p[N];
int find(int x) {return x==p[x]?x:p[x]=find(p[x]);}
void tarjan(int u)
{st[u]=1;//遍历但未回溯for(int i=h[u];i!=-1;i=ne[i]){int j=e[i];if(!st[j]){tarjan(j);//遍历子树p[j]=u;//合并节点}}for(auto &t:q[u]){int y=t.first,id=t.second;if(st[y]==2)anc[id]=find(y);}st[u]=2;//结束回溯
}
int main()
{//IO;int T=1;scanf("%d",&T);for(int ca=1;ca<=T;ca++){cin>>n;for(int i=1;i<=n;i++) {h[i]=-1;dep[i]=0;p[i]=i;st[i]=0;q[i].clear();}idx=cnt=res=0;for(int i=2;i<=n;i++)   {int p;scanf("%d\n",&p);add(p,i);}dfs1(1);sort(leaf+1,leaf+1+cnt,cmp);for(int i=2;i<=cnt;i++){q[leaf[i]].push_back({leaf[i-1],i});q[leaf[i-1]].push_back({leaf[i],i});}tarjan(1);int res=dep[leaf[1]];for(int i=2;i<=cnt;i++)res+=min(dep[leaf[i]],dep[leaf[i]]+dep[leaf[i-1]]-2*dep[anc[i]]);printf("Case #%d: %d\n",ca,res);}return 0;
}
AC代码

按照上述博客写的代码

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
//#pragma GCC optimize(2)
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<random>
#include<bitset>
#include<string>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<unordered_map>
#include<unordered_set>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int mod=1e9+7;
const int N=1000010;
vector<int> e[N];
int dep[N],dist[N];
int res,n;
bool cmp(int x,int y) {return dist[x]<dist[y];};
void dfs1(int u)
{for(auto &t:e[u]){dep[t]=dep[u]+1;dfs1(t);dist[u]=max(dist[u],dist[t]+1);}sort(e[u].begin(),e[u].end(),cmp);
}
int dfs2(int u,int cnt)
{if(e[u].empty()) return res+=cnt,1;for(auto &t:e[u]) cnt=min(dep[u],dfs2(t,cnt+1));return cnt+1;
}
int main()
{IO;int T=1;cin>>T;for(int ca=1;ca<=T;ca++){cin>>n;for(int i=1;i<=n;i++) {e[i].clear();dep[i]=dist[i]=0;}res=0;for(int i=2;i<=n;i++)   {int p;cin>>p;e[p].push_back(i);}dfs1(1);dfs2(1,0);printf("Case #%d: %d\n",ca,res);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319369.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CCPC Training Class

杭电oj 题意&#xff1a; 字符串中出现次数最多的字母的次数是多少&#xff1f; 题解&#xff1a; 题目看不懂。。。又臭又长 懒得看。。 但是仔细看样例就会发现。。其实考的很简单 比赛时这题是我做的&#xff0c;以下为考试原码 代码&#xff1a; #include<string&…

【交互】Omkar and the Meaning of Life(CF-1586D)

正题 CF-1586D 题目大意 有一个大小为n的数列a&#xff0c;你可以进行最多2*n次查询 对于每次查询&#xff0c;你要给出一个大小为n的数列b&#xff0c;ciaibic_ia_ib_ici​ai​bi​&#xff0c;题目会回答c中出现次数大于2的数的最早出现位置 现在让你得出a数组 解题思路 …

ASP.NET Core 集成测试中结合 WebApplicationFactory 使用 SQLite 内存数据库

SQLite 内存数据库&#xff08;in-memory database&#xff09;的连接字符串是 Data Source:memory: &#xff0c;它的特点是数据库连接一关闭&#xff0c;数据库就会被删除。而使用 services.AddDbContext 通过连接字符串配置 EF Core 时&#xff0c;EF Core 会在每次查询或…

P4389-付公主的背包【生成函数,多项式exp】

正题 题目链接:https://www.luogu.com.cn/problem/P4389 题目大意 nnn种物品&#xff0c;第iii种大小为viv_ivi​&#xff0c;数量无限。对于每个s∈[1,m]s\in[1,m]s∈[1,m]求刚好填满sss容量的方案数。 1≤n,m≤1051\leq n,m\leq 10^51≤n,m≤105 解题思路 统计和为一定值的…

mex性质学习

E.Complicated Computations 如果一个区间的mexamexamexa&#xff0c;满足以下条件&#xff1a; 区间未出现aaa区间出现1→a−11\to a-11→a−1 因此若考虑是否存在一个区间的mex值是aaa&#xff0c;我们尝试把整个区间以aaa为端点划分成若干段&#xff0c;只要每一段内&…

Cows

题目 题意: 有一群牛&#xff0c;每个牛有两个属性值[S,E]&#xff0c;如果牛i和牛j属性值满足Si < Sj 且 Ej < Ei 且 Ei - Si > Ej - Sj&#xff0c;牛i比牛j强壮&#xff0c;输出每个牛比自己强壮的牛的数量。 题解&#xff1a; 我们可以把[S,E]看作坐标&#x…

【SAM】差异(P4248)

正题 P4248 题目大意 设TiT_iTi​为第i个字符开始的后缀&#xff0c;求&#xff1a; ∑i1n∑ji1nlen(Ti)len(Tj)−2lcp(Ti,Tj)\sum_{i1}^n \sum_{ji1}^n len(T_i)len(T_j)-2\times lcp(T_i,T_j)i1∑n​ji1∑n​len(Ti​)len(Tj​)−2lcp(Ti​,Tj​) 解题思路 用SAM建立paren…

P4345-[SHOI2015]超能粒子炮·改【Lucas定理,类欧】

正题 题目链接:https://www.luogu.com.cn/problem/P4345 题目大意 TTT组询问&#xff0c;给出n,kn,kn,k求 ∑i0k(ni)\sum_{i0}^{k}\binom{n}{i}i0∑k​(in​) 对233323332333取模的值 1≤T≤105,1≤k≤n≤10181\leq T\leq 10^5,1\leq k\leq n\leq 10^{18}1≤T≤105,1≤k≤n≤1…

AServer - 基于Asp.net core Kestrel的超迷你http服务器

AServer是基于ASP.NET Core Kestrel封装的一个超迷你http服务器。它可以集成进你的Core程序里&#xff0c;用来快速的响应Http请求&#xff0c;而不需要集成整个ASP.NET Core MVC 框架。一&#xff1a;什么是ASever&#xff1f;AServer就像它的名字一样&#xff0c;Just a serv…

特征根是复数的二阶微分方程

考虑如下微分方程d2ydx2a1dydxa2x0\frac{d^2y}{dx^2}a_1\frac{dy}{dx}a_2x0dx2d2y​a1​dxdy​a2​x0 众所周知&#xff0c;一般求得二阶常系数线性微分方程的通常由以下步骤 根据微分方程写出它的特征方程λ2a1λa20\lambda^2a_1\lambdaa_20λ2a1​λa2​0求解特征方程的两个…

Buy and Resell 2018中国大学生程序设计竞赛 - 网络选拔赛

题目 题意&#xff1a; n个宝石&#xff0c;宝石的买入或卖出价格固定&#xff0c;一天只能到一个珠宝商店&#xff08;从左到右&#xff09;&#xff0c;问最大利润是多少&#xff1f;在保证最大利润的同时最少交换次数是多少&#xff1f; 题解&#xff1a; 题目有两问&am…

基于Service fabric + Ocelot + Identity Server4 + 52ABP 的案例展示

10.24-27 大会Microsoft Tech Summit 2018 在上海举办&#xff0c;我 有幸受邀成为这场大会的讲师。Microsoft Tech Summit 2018 微软技术暨生态大会将于10月24日至27日在上海世博中心举行&#xff0c;这也会是国内举办的最后一届 Tech Summit&#xff0c;2019 年开始会以 Micr…

【网络流】植物大战僵尸(P2805)

正题 P2805 题目大意 在一个nmn\times mnm的平面上有若干植物&#xff0c;每个植物有其攻击集合&#xff0c;吃掉一个植物要先吃掉该植物右边的所有植物&#xff0c;且该植物不能在任何一个植物的攻击集合内&#xff0c;吃掉后有贡献ai,ja_{i,j}ai,j​&#xff0c;问你最大贡…

YbtOJ#763-攻城略池【线段树合并】

正题 题目链接:http://www.ybtoj.com.cn/problem/763 题目大意 给出nnn个点的一棵树&#xff0c;每个di0d_i0di​0的点每秒会产生一个士兵往根节点走&#xff0c;走到一个节点让一个节点did_idi​减一&#xff08;为000就不管&#xff09;。 求需要多久才能让所有点的ddd值变…

ARC106——E - Medals

E - Medals 首先看到这题看不出是一个匹配的题大佬题解 把每一个工人和每一天看成一个二分图&#xff0c;如果某个工人在某天工作&#xff0c;那么两者存在边&#xff0c;现在问题转化成至少需要多少天&#xff0c;能够把nnn个工人全部匹配kkk次 显然天数可以二分&#xff0…

2020 CCPC网络赛 赛后感

第一次参加&#xff0c;做过去年19年网络赛的题&#xff0c;去年是四个水题稳做出&#xff0c;然后还有两个线段树和树状数组的题&#xff08;好像是&#xff09;&#xff0c;所以本来对这次网络赛挺有信心的&#xff08;去年好像四个题就能进,当然要手速快&#xff09;。 这次…

Feature Flag 功能发布控制

背景产品在新功能发布前&#xff0c;可能会采取小流量测试的方式&#xff0c;或者在确定方案前使用A/B测试来衡量。一般开发人员会跟运维同学合作&#xff0c;通过一些现有平台切换机器或者流量来实现。本文介绍了另外一种简便的方式&#xff0c;并解释了其在持续集成上的应用&…

P4542-[ZJOI2011]营救皮卡丘【费用流,Floyd】

正题 题目链接:https://www.luogu.com.cn/problem/P4542 题目大意 给出n1n1n1个点mmm条边的无向图&#xff0c;kkk个人开始在000号点&#xff0c;一个人进入iii号点之前必须要有人经过i−1i-1i−1号点&#xff0c;求第一个人进入nnn号点时所有人的最短移动距离和。 1≤n≤150…

【线段树】GSS5 - Can you answer these queries V(luogu-SPOJ 2916)

正题 luogu-SPOJ 2916 题目大意 给你一个序列&#xff0c;有若干询问&#xff0c;每次给出左右端点的区间&#xff0c;问你最大字段和 解题思路 用线段树维护区间信息&#xff0c;询问的区间如果有交则分类讨论求解 code #include<cstdio> #include<cstring> #…

SmartSql 动态代理仓储

SmartSql源码&#xff1a;https://github.com/Ahoo-Wang/SmartSql1|1简介动态代理仓储(SmartSql.DyRepository)组件是SmartSql非常独特的功能&#xff0c;它能简化SmartSql的使用。对业务代码除了配置几乎没有侵入。可以说使用SmartSqlContainer是原始方法&#xff0c;而DyRepo…