4012: [HNOI2015]开店
4012: [HNOI2015]开店
Time Limit: 70 Sec Memory Limit: 512 MB
Submit: 1241 Solved: 536
[Submit][Status][Discuss]
Description
风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到
Input
第一行三个用空格分开的数 n、Q和A,表示树的大小、开店的方案个数和妖
Output
对于每个方案,输出一行表示方便值。
Sample Input
0 0 7 2 1 4 7 7 7 9
1 2 270
2 3 217
1 4 326
2 5 361
4 6 116
3 7 38
1 8 800
6 9 210
7 10 278
8 9 8
2 8 0
9 3 1
8 0 8
4 2 7
9 7 3
4 7 0
2 2 7
3 2 1
2 3 4
Sample Output
957
7161
9466
3232
5223
1879
1669
1282
0
HINT
满足 n<=150000,Q<=200000。对于所有数据,满足 A<=10^9
Source
[Submit][Status][Discuss]
题目要求在线查询路径权值和。。。可以考虑用点分树呀。。? 每个点维护年龄离散化以后路径权值前缀和(以年龄为关键字分开) 这样查询操作的写法很显然,除了常数大,这个算法挺好的= = 复杂度O(nlog^2n),狂用vector导致常数感人。。。。。 最后lower_bound都手写了才水过去的= =
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;const int maxn = 1E5 + 5E4 + 10;
typedef long long LL;struct E{int to,w; E(){}E(int to,int w): to(to),w(w){}
};struct data{int Num,sm; LL sum; data(){}data(int Num,LL sum,int sm): Num(Num),sum(sum),sm(sm){}bool operator < (const data &B) const {return Num < B.Num;}bool operator == (const data &B) const {return Num == B.Num;}
};int n,m,O,cnt,rt,tp,cur,Cur,Max,a[maxn],A[maxn],siz[maxn],stk[maxn];
bool Huge[maxn];
LL LastAns,Age;vector <E> v[maxn];
vector <data> C[maxn],D[maxn];
vector <int> g[maxn],Num[maxn],Dep[maxn],h[maxn];int Lower_Bound(const vector <data> &V,int l,int r,const data &k)
{while (r - l > 1){int mid = (l + r) >> 1;if (V[mid] == k) return mid;if (k < V[mid]) r = mid; else l = mid;}if (k < V[l] || V[l] == k) return l;if (k < V[r] || V[r] == k) return r;return r + 1;
}void Pre_Work(int *s,int tp,int &c)
{c = 1; sort(s + 1,s + tp + 1);for (int i = 2; i <= tp; i++)if (s[i] != s[i-1]) s[++c] = s[i];
}void Dfs1(int x,int from,int tot)
{int ma = 0; siz[x] = 1; stk[++tp] = A[x];for (int i = 0; i < v[x].size(); i++){int to = v[x][i].to;if (to == from || Huge[to]) continue;Dfs1(to,x,tot); siz[x] += siz[to]; ma = max(ma,siz[to]);}ma = max(ma,tot - siz[x]);if (ma < Max) Max = ma,O = x;
}void Dfs2(int x,int from)
{stk[++tp] = A[x];for (int i = 0; i < v[x].size(); i++){int to = v[x][i].to;if (to == from || Huge[to]) continue;Dfs2(to,x);}
}void Dfs3(int x,int from,int o,int y,int now,int sum,vector <data> &c,vector <data> &d)
{Num[x].push_back(now); Dep[x].push_back(sum); siz[x] = 1;int pos = Lower_Bound(c,0,c.size() - 1,data(A[x],0,0));c[pos].sum += 1LL * sum; ++c[pos].sm;pos = Lower_Bound(d,0,d.size() - 1,data(A[x],0,0));d[pos].sum += 1LL * sum; ++d[pos].sm;for (int i = 0; i < v[x].size(); i++){E e = v[x][i];if (e.to == from || Huge[e.to]) continue;Dfs3(e.to,x,o,y,now,sum + e.w,c,d); siz[x] += siz[e.to];}
}int Work(int x,int tot)
{Max = maxn; tp = 0; Dfs1(x,0,tot); Huge[O] = 1;int o = O,now = 0; Pre_Work(stk,tp,Cur);vector <data> &c = C[o];for (int i = 0; i <= Cur; i++) c.push_back(data(stk[i],0,0));for (int i = 0; i < v[o].size(); i++){E e = v[o][i]; if (Huge[e.to]) continue;tp = 0; Dfs2(e.to,o); Pre_Work(stk,tp,Cur); ++cnt;vector <data> &d = D[cnt];for (int j = 0; j <= Cur; j++) d.push_back(data(stk[j],0,0));Dfs3(e.to,o,o,cnt,now++,e.w,c,d); h[o].push_back(cnt);for (int j = 1; j <= Cur; j++) d[j].sum += d[j-1].sum,d[j].sm += d[j-1].sm;g[o].push_back(Work(e.to,siz[e.to]));}for (int j = 1; j < c.size(); j++) c[j].sum += c[j-1].sum,c[j].sm += c[j-1].sm;return o;
}LL Calc(const vector <data> &V,const int &k,int &P)
{if (!k) {P = 0; return 0;}int pos = Lower_Bound(V,0,V.size() - 1,data(k,0,0));if (pos == V.size() || V[pos].Num > k) --pos;P = pos; return V[pos].sum;
}LL Query(int x,int y,int l,int r,int now)
{if (x == y) return Calc(C[x],r,now) - Calc(C[x],l - 1,now);int Nex = h[x][Num[y][now]],p1,p2,p3,p4; LL ret = 0;ret = (Calc(C[x],r,p1) - Calc(D[Nex],r,p2)) - (Calc(C[x],l - 1,p3) - Calc(D[Nex],l - 1,p4));ret += 1LL * Dep[y][now] * ((C[x][p1].sm - D[Nex][p2].sm) - (C[x][p3].sm - D[Nex][p4].sm));if (l <= A[x] && A[x] <= r) ret += 1LL * Dep[y][now];return ret + Query(g[x][Num[y][now]],y,l,r,now + 1);
}int getint()
{char ch = getchar(); int ret = 0;while (ch < '0' || '9' < ch) ch = getchar();while ('0' <= ch && ch <= '9')ret = ret*10 + ch - '0',ch = getchar();return ret;
}char s[20];
void Print(LL x)
{if (!x) {puts("0"); return;} int len = 0;while (x) s[++len] = x % 10LL,x /= 10LL;for (int i = len; i; i--) putchar(s[i] + '0'); puts("");
}int main()
{#ifdef DMCfreopen("DMC.txt","r",stdin);#endifn = getint(); m = getint(); Age = getint();for (int i = 1; i <= n; i++) a[i] = A[i] = getint();Pre_Work(a,n,cur);for (int i = 1; i <= n; i++)A[i] = lower_bound(a + 1,a + cur + 1,A[i]) - a;for (int i = 1; i < n; i++){int x = getint(),y,w;y = getint(); w = getint();v[x].push_back(E(y,w));v[y].push_back(E(x,w));}rt = Work(1,n);while (m--){int x = getint(),y,z;y = (getint() + LastAns) % Age;z = (getint() + LastAns) % Age;if (y > z) swap(y,z);int py = lower_bound(a + 1,a + cur + 1,y) - a;int pz = lower_bound(a + 1,a + cur + 1,z) - a;if (py > cur) {puts("0"); LastAns = 0; continue;}if (pz > cur || a[pz] > z) --pz;Print(LastAns = Query(rt,x,py,pz,0)); LastAns %= Age;}return 0;
}
4012: [HNOI2015]开店相关推荐
- BZOJ 4012: [HNOI2015]开店 -- 动态树分治
4012: [HNOI2015]开店 Time Limit: 70 Sec Memory Limit: 512 MB Submit: 1463 Solved: 635 [Submit][Statu ...
- bzoj 4012: [HNOI2015]开店
Description 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到 人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱.这样的 想法当然非常好啦,但是她们也发现 ...
- bzoj 4012: [HNOI2015]开店 主席树
Description 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到 人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱.这样的 想法当然非常好啦,但是她们也发现 ...
- BZOJ4012 [HNOI2015]开店
BZOJ4012 [HNOI2015]开店 这道题因为太多人拿这个题卡$BZOJ$,于是成了权限题... 本蒟蒻表示没钱氪金... 无奈,拿出了洛谷:P3241 [HNOI2015]开店 还有$LOJ ...
- [HNOI2015]开店
[HNOI2015]开店 法一 一个点到所有点距离? 树上路径问题,从一个点出发的 虽然不是统计一次,虽然强制在线,点分治也可以做! 因为可以动态点分治的分治树来搞! vector维护到根路径dis, ...
- 洛谷 P3241 [HNOI2015]开店 解题报告
P3241 [HNOI2015]开店 题目描述 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱. 这样的想法当然非 ...
- BZOJ4012[HNOI2015]开店——树链剖分+可持久化线段树/动态点分治+vector
题目描述 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到 人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱.这样的 想法当然非常好啦,但是她们也发现她们面临着一个 ...
- BZOJ4012 [HNOI2015]开店 (动态点分治)
Description 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到 人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱.这样的 想法当然非常好啦,但是她们也发现 ...
- luogu P3241 [HNOI2015]开店
传送门 (下面记年龄为\(a_x\))题目要求的是\[\sum_{x=1}^{n} [a_x\in [l,r]]*dis(x,u)=\sum_{x=1}^{n} [a_x\in [l,r]]*de_x ...
最新文章
- R语言gganimate包创建可视化gif动图:ggplot2可视化静态条形图(bar plot)、gganimate包创建动态条形图(bar plot)动画、基于transition_time函数
- AI芯片初创公司单纯卖芯片还是捆绑算法的商业模式更好?
- 一些Java开发人员在编程中常见的雷!
- 解决 SQL Server 耗尽内存的情况
- 游戏安全资讯精选 2017年第十期 英国彩票网遭遇DDoS攻击,中断90分钟 DNSMASQ多高危漏洞公告 阿里云协助警方破获国内最大黑客攻击案,攻击峰值690G...
- 理解Silverlight的路径填充规则
- 编辑器未包含main类型_利用 ONLYOFFICE 将在线文档编辑器集成到 Python Web 应用程序中...
- 暑假快来了,又该何去何从
- ecshop添加404页面
- gradle下载很慢
- WBS工作分解结构法
- p6spy 简单使用
- theano java_Theano:调用Theano函数的论据
- Android开发书籍推荐
- cocos2dx 3.17海外sdk接入填坑全纪录 Appodeal(广告) SDK 接入(5)
- 抢滩登陆瑞星杀毒2005(转)
- 小厮吃货:智能便利店不是新零售的风口?!
- win7 解决飞秋无法接收文件(准备接收)问题
- 【渝粤题库】广东开放大学 服务标准化 形成性考核
- Verizon将基于从英特尔收购的技术打造新款机顶盒
热门文章
- 火车采集器-对在固定网页上进行更新的文件的下载方法
- 软件工程到底能不能教会不怎么写程序的人开发软件?
- 时间管理之背上的猴子
- 华东理工大学计算机专业英语,化学工程与工艺专业英语翻译(华东理工大学_最完整版本).pdf...
- WIN10环境下 CCS6.0+SEED-DTK6437 实验
- Python量化投资——股票择时到底能否赚钱?技术指标大比拼——AROON指标
- Windows xp是32位还是64位
- 波士顿动力机器人跳舞啦!一定要看到最后!
- 华为鸿蒙经济新闻,华为鸿蒙生态加速 市场相关板块再度活跃
- 2015年10月管理系统中计算机应用答案,全国2015年10月高等教育自学考试管理系统中计算机应用必考题和答案...