2019 杭电多校(第三场)

2023-11-09 15:49
文章标签 2019 第三场 杭电多校

本文主要是介绍2019 杭电多校(第三场),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1002 Blow up the city (支配树)

http://acm.hdu.edu.cn/showproblem.php?pid=6604

题意

给你个DAG图 然后若干次询问 每次询问给你两个点 问你去掉某个点使这量两个点不能到达最终点

进阶版 https://blog.csdn.net/sdut_jk17_zhangming/article/details/98069924

思路

去掉不能到达 即给定点是去掉点的支配点 建支配树即可

代码

#include <bits/stdc++.h>using namespace std;
const int maxn = 1e5+10;
vector<int> G[maxn];
vector<int> E[maxn];
vector<int> T[maxn];
int fa[maxn][20],deep[maxn];
int dfn[maxn],in[maxn];
int n,m;
int ans[maxn];
void init()
{memset(in,0,sizeof(in));for(int i = 0;i <= n;i++){E[i].clear(),G[i].clear(),T[i].clear();}
}
int LCA(int u,int v)
{if(deep[u] < deep[v]) swap(u,v);for(int i = 18;i >= 0;i--){if(deep[fa[u][i]] >= deep[v])u = fa[u][i];}if(u == v) return u;for(int i = 18;i >= 0;i--){if(fa[u][i] != fa[v][i]){u = fa[u][i];v = fa[v][i];}}return fa[u][0];
}
void solve(int u)
{int x = G[u][0];for(int i = 1;i < G[u].size();i++){x = LCA(x,G[u][i]);}T[x].push_back(u);deep[u] = deep[x]+1;fa[u][0] = x;for(int j = 1;j <= 18;j++){fa[u][j] = fa[fa[u][j-1]][j-1];}
}
void topsort()
{for(int i = 1;i <= n;i++){if(in[i] == 0){G[i].push_back(0);E[0].push_back(i);}}queue<int> q;q.push(0);deep[0] = 0;while(!q.empty()){int x = q.front();q.pop();for(int i = 0;i < E[x].size();i++){int y = E[x][i];in[y]--;if(in[y]<= 0){q.push(y);solve(y);}}}
}
void dfs(int u,int num)
{ans[u] = num;for(int i = 0;i < T[u].size();i++){int v = T[u][i];dfs(v,ans[u]+1);}
}int main()
{int T;scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);init();for(int i = 1;i <= m;i++){int u,v;scanf("%d%d",&u,&v);in[u]++;E[v].push_back(u);G[u].push_back(v);}topsort();dfs(0,1);int qw;scanf("%d",&qw);while(qw--){int u,v;scanf("%d%d",&u,&v);int w = LCA(u,v);int sum = ans[u] + ans[v] - ans[w] - 1;printf("%d\n",sum);}}return 0;
}

1004 Distribution of books

http://acm.hdu.edu.cn/showproblem.php?pid=6606

题意

给你n个数 让你从前面取若干数 分成k个区间 让区间最大值最小

思路

最大值最小 二分

 

#include<bits/stdc++.h>using namespace std;
typedef long long ll;
const ll maxn = 2e5 + 10;
const ll inf = 1e18;
ll a[maxn],b[maxn];
int tree[maxn*4];
int n,k,tot;
void build(int x,int l,int r)
{tree[x] = 0;if(l == r) return ;int mid = (l + r) / 2;build(x*2,l,mid);build(x*2+1,mid+1,r);
}
int query(int x,int l,int r,int L,int R)
{if(L <= l&&R >= r) return tree[x];int mid = (l + r) / 2;int res = 0;if(L <= mid) res = max(query(x*2,l,mid,L,R),res);if(R > mid) res = max(res,query(x*2+1,mid+1,r,L,R));return res;
}
void update(int x,int l,int r,int pos,int val)
{if(l == r){tree[x] = max(val,tree[x]);return ;}int mid = (l + r) / 2;if(pos <= mid) update(x*2,l,mid,pos,val);if(pos > mid) update(x*2+1,mid+1,r,pos,val);tree[x] = max(tree[x*2],tree[x*2+1]);
}int check(ll mid)
{build(1,1,tot);ll sum=0,mxsum=0;for(int i=1;i<=n;i++){sum+=a[i];if(sum-mid>mxsum) continue;int pos=lower_bound(b+1,b+1+tot,sum-mid)-b;int dp=query(1,1,tot,pos,tot)+1;pos=lower_bound(b+1,b+1+tot,sum)-b;update(1,1,tot,pos,dp);mxsum=max(mxsum,sum);if(dp>=k)return 1;}return 0;
}
int main()
{int T;scanf("%d",&T);while(T--){scanf("%d%d",&n,&k);b[0] = 0;for(int i = 1;i <= n;i++){scanf("%lld",&a[i]);b[i] = b[i-1] + a[i];}sort(b+1,b+1+n);tot = unique(b+1,b+1+n) - (b+1);ll l = -inf,r = inf;while(l + 1 < r){ll mid = (l + r) / 2;if(check(mid)){r = mid;}else l = mid;}if(check(l)) printf("%lld\n",l);else printf("%lld\n",r);}return 0;
}

1006 Fansblog (数论定理 威尔逊定理)

http://acm.hdu.edu.cn/showproblem.php?pid=6608

题意

给你一个素数P 让你求Q!%Q   Q是小于P的最大素数

思路

威尔逊定理 : 对于一个素数P (p-1)! ≡ -1(p)

可以求出(P-1)! 除去(P-1)比Q多的

#include <bits/stdc++.h>using namespace std;
typedef long long ll;
ll ksc(ll x,ll y,ll p){//计算x乘y的积ll res=0;//加法初始化while(y){if(y&1)res=(res+x)%p;//模仿二进制x=(x<<1)%p; y>>=1;//将x不断乘2达到二进制}return res;
}
ll qpow(ll x,ll n,ll mod)
{ll ans = 1;while(n){if(n % 2 == 1){ans = ksc(ans,x,mod) % mod;}x = ksc(x,x,mod) % mod;n /= 2;}return ans;
}int ok(ll x)
{int qw = sqrt(x);for(int i = 2; i <= qw;i++){if(x % i == 0) return 0;}return 1;
}
int main()
{int T;scanf("%d",&T);while(T--){ll p,q;scanf("%lld",&p);ll ans = p - 1;;for(ll i = p-1;i >= 1;i--){if(ok(i)){printf("%lld\n",ans);break;}ans = (ksc(ans,qpow(i,p-2,p),p))%p;}}return 0;
}

1007 Find the answer (权值线段树)

http://acm.hdu.edu.cn/showproblem.php?pid=6609

题意

给你n个数 问你1 - i(1<=i<=n) 去掉多少个数和小于等于m

思路

对于每个位置,求出需要减掉的数 然后在权值线段树上进行二分找答案。

代码

#include <bits/stdc++.h>using namespace std;
typedef long long ll;
const int MAX = 200005;struct node
{ll num,sum;
}tree[MAX*4];
int n,m,nn;
ll a[MAX],w[MAX];
ll ans;
void build(int rt,int l,int r)
{tree[rt].num = tree[rt].sum = 0;if(l==r) return ;int mid = (l + r) / 2;build(rt*2,l,mid);build(rt*2+1,mid+1,r);
}
void updata(int rt,int l,int r,int x)
{if(l == r&&l == x){tree[rt].num++;tree[rt].sum += a[x];return ;}int mid = (l + r) / 2;if(mid >= x) updata(rt*2,l,mid,x);else updata(rt*2+1,mid+1,r,x);tree[rt].num = tree[rt*2].num + tree[rt*2+1].num;tree[rt].sum = tree[rt*2].sum + tree[rt*2+1].sum;
}
void query(int rt,int l,int r,ll need)
{if(l == r){   ans += need / a[l];if(need%a[l]) ans++;return ;}int mid = (l+r)/2;if(tree[rt*2+1].sum >= need){query(rt*2+1,mid+1,r,need);}else{ans += tree[rt*2+1].num;query(rt*2,l,mid,need-tree[rt*2+1].sum);}}
int main()
{int T;scanf("%d",&T);while(T--){scanf("%d%d",&nn,&m);for(int i = 1;i <= nn;i++){scanf("%lld",&a[i]);w[i] = a[i];}sort(a+1,a+1+nn);n = unique(a+1,a+1+nn) - (a+1);build(1,1,n);ll sum = 0;for(int i = 1;i <= nn;i++){sum += w[i];if(sum <= m){printf("0 ");int x = lower_bound(a+1,a+1+n,w[i]) - (a);updata(1,1,n,x);}else{ll need = sum - m;ans = 0;query(1,1,n,need);printf("%lld ",ans);int x = lower_bound(a+1,a+1+n,w[i]) - (a);updata(1,1,n,x);}}printf("\n");}return 0;
}

 

这篇关于2019 杭电多校(第三场)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/377074

相关文章

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

CPC23第三场、第四场总结

这两天跟着Arthur学长们混了两天现场赛,有种打怪升级的感觉,就是90级的老大们带30级的我去打100级的BOSS,看着Arthur他们在不断的输出,我在一旁水经验·······不过我也没闲着玩泥巴,在status里留下了一大片WA、TLE、RE··········         CPC23第三场,开场19分钟,Arthur全场一A了C题,于是我就开始跟着切C题。看了一眼题目

2015多校联合训练第三场Work(hdu5326)

题意: a是b的上司,b是c的上司,则a是c的上司,问构成一个树种,有多人是 k个人的上司 思路: 先找出root,然后dfs一下就行 #include <bits/stdc++.h>#define LL long longusing namespace std;const int MAXN = 1e6;int f[105];int n, k;int mp[101][101];

2015年多校联合训练第三场RGCDQ(hdu5317)

题意: f(i)代表i数中有的素数的种数,给出区间[l,r],求区间内max(gcd(f(i))), 由于i最大是1e6,2*3*5*7*11*13*17>1e6,故最多不超过7种素数, 先打表打出1e6内的素数种数表,然后用sum[i][j]代表1-i个数中,还有j个素数的个数,最后用sum[r][j] - sum[l-1][j]求出区间内含有j个素数的数的个数,暴力找出1,2,3,4,5

2019学习计划

工作三年了,第一年感觉是荒废的,第二年开始学习python,第三年开始自动化 感觉自己会的东西比较少,而且不够深入,流于表面 现制定一下今年大概的学习计划 需持续巩固加强:python、ui自动化、接口自动化、sql等 代码量需提升,敲的不够(重点) 学习: 1.移动端测试,appium等 2.前端知识系统整理学习  3.性能测试 4.docker入门,环境搭建 5.shell

最简单的使用JDBC[连接数据库] mysql 2019年3月18日

最极简版本的, 我们这里以mysql为例: 首先要创建maven工程, 需要引入jar包:,这里需要注意, 如果你安装的是mysql最新版本8以上的, 下面有些地方需要更改,具体就是mysql连接的url, 和5版本的不一样,具体解决请自行百度哈.这里只演示mysql5版本的? 依赖: <dependency>   <groupId>mysql</groupId>   <artifactId

(php伪随机数生成)[GWCTF 2019]枯燥的抽奖

审核源码发现加载check.php,审计发现使用了mt_rand()函数,这个函数生成的值是伪随机的 参考下面这篇文章 PHP mt_rand安全杂谈及应用场景详解 - FreeBuf网络安全行业门户 kali里面输入下载工具 git clone https://github.com/openwall/php_mt_seed.git cd进去输入make后编译出的文件先

2019年2月17日

今天又重新看了一下输出第1500个丑数 在我错了八次之后发现要输出一个句号还要输出换行 接下来的两天应该进入复习阶段了。

National Contest for Private Universities (NCPU), 2019 E. Generalized Pascal's Triangle

编辑代码 2000ms 262144K Generalized Pascal's Triangle Pascal's triangle is a triangular array in which each number can be calculated by the sum of the two numbers directly above that number as shown i

Hinton等人最新研究:大幅提升模型准确率,标签平滑技术 2019-7-8

导读:损失函数对神经网络的训练有显著影响,也有很多学者人一直在探讨并寻找可以和损失函数一样使模型效果更好的函数。后来,Szegedy 等学者提出了标签平滑方法,该方法通过计算数据集中 hard target 的加权平均以及平均分布来计算交叉熵,有效提升了模型的准确率。近日,Hinton 团队等人在新研究论文《When Does Label Smoothing Help?》中,就尝试对标签平滑技术对