运输计划noip
靠!这道题TM搞了我好几天,真是烦死人!!!早上打了一个倍增的TM只有95分QAQ。。。
然后一气之下开始不断卡常,各种玄学优化,可是就是T。。TAT。。
可恶!晚上我就直接打了个tarjan,还好跑过了,可是打的我身心俱残!!!仿佛想起了打splay的岁月,各个代码3000+。。。
不过一次就打成功了,还算比较好吧。。。
先上95分的代码
- #include<cstdio>
- #include<algorithm>
- #include<cmath>
- #include<cstring>
- #define maxn 600500
- #define ll long long
- using namespace std;
- struct st{
- ll u,v,next,val;
- }s[maxn];
- struct qu{
- ll a,b,lca,len;
- }quest[maxn];
- ll n,m,u,v,root,tot,val,head[maxn],ceng[maxn],fa[maxn][],len[maxn],fedge[maxn],zou[maxn],cf[maxn],maxlen,l,r,ma;
- inline void add(ll u,ll v,ll val)
- {
- tot++;
- s[tot].val = val;
- s[tot].u = u;
- s[tot].v = v;
- s[tot].next = head[u];
- head[u] = tot;
- }
- inline void dfs(ll f,ll now)
- {
- fa[now][] = f;
- ceng[now] = ceng[f] + ;
- for(ll i = head[now];i;i = s[i].next)
- {
- v = s[i].v;
- if(!ceng[v])
- {
- fedge[v] = s[i].val;
- len[v] = len[now] + s[i].val;
- dfs(now,v);
- }
- }
- }
- inline void init()
- {
- for(ll j=;(<<j)<=n;j++)
- {
- for(ll i=;i<=n;i++)
- {
- fa[i][j]=fa[fa[i][j-]][j-];
- }
- }
- }
- inline ll lca(ll a,ll b)
- {
- if(ceng[a] > ceng[b]) swap(a,b);
- ll cha = ceng[b] - ceng[a];
- for(ll i = ;( << i) <= cha;i++)
- {
- if(( << i) & cha) b = fa[b][i];
- }
- if(a!=b)
- {
- for(ll i=(ll)log2(n);i>=;i--)
- {
- if(fa[a][i]!=fa[b][i])
- {
- a=fa[a][i];
- b=fa[b][i];
- }
- }
- a = fa[a][];
- }
- return a;
- }
- inline ll find(ll pos,ll num)
- {
- ll val = cf[pos];
- zou[pos] = ;
- for(ll i=head[pos];i;i=s[i].next)
- {
- if(zou[s[i].v]) continue;
- val += find(s[i].v,num);
- }
- if(val >= num) ma = max(ma,fedge[pos]);
- return val;
- }
- inline ll check(ll ans)
- {
- memset(zou,,sizeof(zou));
- memset(cf,,sizeof(cf));
- ll ce = ;
- for(ll i=;i<=m;i++)
- {
- if(quest[i].len > ans)
- {
- cf[quest[i].a]++;
- cf[quest[i].b]++;
- cf[quest[i].lca] -= ;
- ce++;
- }
- }
- ma = -;
- find(,ce);
- if(ma == -) return ;
- if(ans + ma >= maxlen) return ;
- return ;
- }
- int main(){
- scanf("%lld%lld%",&n,&m);
- for(ll i=;i<n;i++)
- {
- scanf("%lld%lld%lld",&u,&v,&val);
- add(u,v,val);
- add(v,u,val);
- }
- dfs(,);
- init();
- for(ll i=;i<=m;i++)
- {
- scanf("%lld%lld",&u,&v);
- quest[i].a = u;
- quest[i].b = v;
- quest[i].lca = lca(u,v);
- quest[i].len = len[u] + len[v] - * len[quest[i].lca];
- maxlen = max(maxlen , quest[i].len);
- }
- r = maxlen;
- while(l < r)
- {
- ll mid = l + r >> ;
- if(check(mid)) r = mid;
- else l = mid + ;
- }
- printf("%lld",l);
- }
然后上个100 的!!!
- #include<cstdio>
- #include<algorithm>
- #define maxn 300300 << 1
- using namespace std;
- int head_edge[maxn],head_quest[maxn],fedge[maxn],f[maxn],len[maxn],vis[maxn],cf[maxn],n,m,ma,maxlen,tot,u,v,val,l,r;
- struct st{
- int v,val,next;
- }s[maxn];
- struct que{
- int u,v,lca,len,next;
- que *es;
- }quest[maxn];
- inline int find(int x)
- {
- if(f[x] == x) return x;
- f[x] = find(f[x]);
- return f[x];
- }
- inline void add_edge(int u,int v,int val)
- {
- tot++;
- s[tot].v = v;
- s[tot].val = val;
- s[tot].next = head_edge[u];
- head_edge[u] = tot;
- }
- inline void add_quest(int u,int v)
- {
- tot++;
- quest[tot].u = u;
- quest[tot].v = v;
- if(tot & ) quest[tot].es = &quest[tot + ];
- else quest[tot].es = &quest[tot - ];
- quest[tot].next = head_quest[u];
- head_quest[u] = tot;
- }
- inline void dfs_tarjan(int father,int now)
- {
- for(int i=head_edge[now];i;i=s[i].next)
- {
- if(father == s[i].v) continue;
- fedge[s[i].v] = s[i].val;
- len[s[i].v] = len[now] + s[i].val;
- dfs_tarjan(now,s[i].v);
- }
- }
- inline void lca_tarjan(int father,int now)
- {
- for(int i=head_edge[now];i;i=s[i].next)
- {
- if(s[i].v == father) continue;
- lca_tarjan(now,s[i].v);
- }
- for(int i=head_quest[now];i;i=quest[i].next)
- {
- if(vis[quest[i].v])
- {
- quest[i].lca = find(quest[i].v);
- quest[i].len = len[quest[i].u] + len[quest[i].v] - * len[quest[i].lca];
- quest[i].es -> lca = quest[i].lca;
- quest[i].es -> len = quest[i].len;
- maxlen = max(maxlen,quest[i].len);
- }
- }
- vis[now] = ;
- f[now] = father;
- }
- inline int dfs_check(int pos,int num)
- {
- vis[pos] = ;
- int val = cf[pos];
- for(int i=head_edge[pos];i;i=s[i].next)
- {
- if(vis[s[i].v]) continue;
- val += dfs_check(s[i].v,num);
- }
- if(val >= num) ma = max(ma,fedge[pos]);
- return val;
- }
- inline int check(int ans)
- {
- for(int i=;i<=n;i++)
- {
- vis[i] = ;
- cf[i] = ;
- }
- int num = ;
- ma = -;
- for(int i=;i<=m;i++)
- {
- if(quest[i].len > ans)
- {
- cf[quest[i].u]++;
- cf[quest[i].v]++;
- cf[quest[i].lca] -= ;
- num++;
- }
- }
- if(!num) return ;
- dfs_check(,num);
- if(ma == - || ans + ma < maxlen) return ;
- return ;
- }
- int main(){
- scanf("%d%d",&n,&m);
- for(int i=;i<n;i++)
- {
- scanf("%d%d%d",&u,&v,&val);
- add_edge(u,v,val);
- add_edge(v,u,val);
- }
- dfs_tarjan(,);
- tot = ;
- for(int i=;i<=n;i++) f[i] = i;
- for(int i=;i<=m;i++)
- {
- scanf("%d%d",&u,&v);
- add_quest(u,v);
- add_quest(v,u);
- }
- lca_tarjan(,);
- for(int i=;i<=m;i++) quest[i] = quest[i * ];
- r = maxlen;
- l = max(,r - );
- while(l < r)
- {
- int mid = l + r >> ;
- if(check(mid)) r = mid;
- else l = mid + ;
- }
- printf("%d",l);
- }
运输计划noip的更多相关文章
- 4632 NOIP[2015] 运输计划
4632 NOIP[2015] 运输计划 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题解 题目描述 Description 公元 2044 ...
- [NOIP 2015]运输计划-[树上差分+二分答案]-解题报告
[NOIP 2015]运输计划 题面: A[NOIP2015 Day2]运输计划 时间限制 : 20000 MS 空间限制 : 262144 KB 问题描述 公元 2044 年,人类进入了宇宙纪元. ...
- Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分)
Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分) Description L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之 ...
- cogs 2109. [NOIP 2015] 运输计划 提高组Day2T3 树链剖分求LCA 二分答案 差分
2109. [NOIP 2015] 运输计划 ★★★☆ 输入文件:transport.in 输出文件:transport.out 简单对比时间限制:3 s 内存限制:256 MB [题 ...
- NOIP 2015 BZOJ 4326 运输计划 (树链剖分+二分)
Description 公元 年,人类进入了宇宙纪元. L 国有 n 个星球,还有 n− 条双向航道,每条航道建立在两个星球之间,这 n− 条航道连通了 L 国的所有星球. 小 P 掌管一家物流公司, ...
- 【NOIP 2015 DAY2 T3】 运输计划 (树链剖分-LCA)
题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航道连通了 L 国的所有星球. 小 P 掌管一家 ...
- NOIP[2015] 运输计划
传送门 题目描述 Description 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所有星球 ...
- [noip 2015]运输计划 [LCA][树链剖分]
用了luogu上的题目描述 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航道连通了 L 国的 ...
- NOIP 2015运输计划
题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航道连通了 L 国的所有星球. 小 P 掌管一家 ...
随机推荐
- LeetCode算法题-Positions of Large Groups(Java实现)
这是悦乐书的第323次更新,第346篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第193题(顺位题号是830).在由小写字母组成的字符串S中,那些相同的连续字符会组成集 ...
- 重载Prometheus配置
发送SIGHUP信号给应用程序的主进程: pid ‘’-1‘’是指“终端断线” 发送post请求给指定端点: curl -XPOST http://ip:9090/-/reload 对于此种方法要注意 ...
- Java实验3与第五周总结
1.已知字符串:"this is a test of java".按要求执行以下操作:(要求源代码.结果截图.) •统计该字符串中字母s出现的次数. •统计该字符串中子串" ...
- 2019 java学习 第二周总结
新学期,新气象,新老师,不同的语言学习. 我已经荒废了大一,感觉自己在大一根本没学啥,可能是自己太贪玩了,导致自己学的不精,自己对其他的见解很少. 也有自大的原因,导致自己一直浮在水平面,有实力,有耐 ...
- UrlConnection发送http请求 中文乱码解决
中文乱码 DataOutputStream dos = new DataOutputStream(httpConn.getOutputStream()); //dos.writeBytes(jsonD ...
- [Git] 025 标签命令
0. 前言 小时候看<剑花-烟雨-江南>,惊讶于那个多重身份的"小侯爷" 后来发现,现实中拥有比小侯爷更多身份的人多如牛毛 其实,在 "Git" 中 ...
- 【监控笔记】【2.3】扩展事件——慢查询SQL(执行超过3S的SQL)
--sql server 2008及以上才支持,2012及以上才支持GUI界面 msdn 扩展事件:点击打开链接 [1]T-SQL实现 基于 rpc_completed(远程过程调用已完成时发生) 事 ...
- 剑指Offer编程题(Java实现)——链表中环的入口结点
题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 思路一 迭代遍历链表,利用HashSet将每个结点添加到哈希表中,如果添加失败(重复遍历了这个结点即遇到环),输出 ...
- [BZOJ 3509] [CodeChef] COUNTARI (FFT+分块)
[BZOJ 3509] [CodeChef] COUNTARI (FFT+分块) 题面 给出一个长度为n的数组,问有多少三元组\((i,j,k)\)满足\(i<j<k,a_j-a_i=a_ ...
- bootstrap使用总结(carousel设置大小。item设置大小,img设置大小)
在bootstrap中使用carousel,先要给.carousel一个大小, 要想使carousel和item和img随着浏览器大小而变,就要设置 .carousel .item { height: ...