HNOI2015

传送门

http://www.lydsy.com/JudgeOnline/problem.php?id=4012

题解

代码

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <algorithm>
  4
  5 #define REP(i, l, r) for(int i=(l); i!=(r); ++i)
  6 #define FOR(i, l, r) for(int i=(l); i<=(r); ++i)
  7 #define DRP(i, l, r) for(int i=(l); i!=(r); --i)
  8 #define DFR(i, l, r) for(int i=(l), i>=(r); --i)
  9
 10 typedef long long LL;
 11
 12 template<class T>T Min(const T &a, const T &b) {return a < b ? a : b;}
 13 template<class T>T Max(const T &a, const T &b) {return a > b ? a : b;}
 14 template<class T>bool Chkmin(T &a, const T &b) {return a > b ? a=b, 1 : 0;}
 15 template<class T>bool Chkmax(T &a, const T &b) {return a < b ? a=b, 1 : 0;}
 16
 17 const int SN = 150000 + 47;
 18 const int SM = SN << 1 | 1;
 19 const int ST = 10000000 + 47;
 20
 21 int head[SN], nxt[SM], to[SM], wei[SM], tot;
 22 int size[SN], fa[SN], deep[SN], son[SN], val[SN], dis[SN];
 23 int top[SN], f[SN], g[SN], rnk;
 24 int a[SN], b[SN], c[SN], sum[SN], n, m, p;
 25 int rt[ST], lson[ST], rson[ST], data[ST], cnt;
 26 LL segs[ST], sd[SN], lstans;
 27
 28 void NxtInt(int &);
 29 bool Cmp(const int &, const int &);
 30 void Add(int, int, int);
 31 void DFS(int);
 32 void DFS(int, int);
 33 void Get(int);
 34 int Modify(int, int, int, int, int);
 35 void Query(int, int, int);
 36 LL Query(int, int, int, int, int, int);
 37
 38 int main() {
 39
 40     freopen("shop.in", "r", stdin);
 41     freopen("shop.out", "w", stdout);
 42
 43     int x, y, z, r, s;
 44     NxtInt(n), NxtInt(m), NxtInt(p);
 45     FOR(i, 1, n) NxtInt(a[i]), b[i] = i;
 46     std::sort(b+1, b+n+1, Cmp);
 47     FOR(i, 1, n) c[b[i]] = i;
 48     std::sort(a+1, a+n+1);
 49
 50     REP(i, 1, n) NxtInt(x), NxtInt(y), NxtInt(z), Add(c[x], c[y], z);
 51     deep[1]=1, DFS(1), DFS(1, 1);
 52     FOR(i, 1, n) sum[i] = sum[i-1]+val[i];
 53     FOR(i, 1, n) sd[i] = sd[i-1]+dis[i];
 54     FOR(i, 1, n) Get(i);
 55
 56     while(m--) {
 57         NxtInt(x), NxtInt(y), NxtInt(z);
 58         y = (y+lstans)%p, z = (z+lstans)%p;
 59         if(Min(y, z)>a[n] || Max(y, z)<a[0]) {puts("0"), lstans = 0; continue;}
 60         r = std::lower_bound(a+1, a+n+1, Min(y, z)) - a;
 61         s = std::upper_bound(a+1, a+n+1, Max(y, z)) - a - 1;
 62         Query(r, s, c[x]);
 63         printf("%lld\n", lstans=sd[s]-sd[r-1]+1LL*(s-r+1)*dis[c[x]]-2*lstans);
 64     }
 65
 66     return 0;
 67
 68 }
 69
 70 void NxtInt(int &in) {
 71     char ch;
 72     for(ch=getchar(); ch>‘9‘||ch<‘0‘; ch=getchar()) ;
 73     for(in=0; ch>=‘0‘&&ch<=‘9‘; ch=getchar()) in=in*10+ch-‘0‘;
 74 }
 75
 76 bool Cmp(const int &x, const int &y) {
 77     return a[x] < a[y];
 78 }
 79
 80 void Add(int u, int v, int w) {
 81     nxt[++tot]=head[u]; head[u]=tot; to[tot]=v; wei[tot]=w;
 82     nxt[++tot]=head[v]; head[v]=tot; to[tot]=u; wei[tot]=w;
 83 }
 84
 85 void DFS(int u) {
 86     size[u] = 1;
 87     for(int i=head[u]; i; i=nxt[i])
 88         if(to[i] != fa[u]) {
 89             deep[to[i]]=deep[u]+1, fa[to[i]] = u;
 90             val[to[i]]=wei[i], dis[to[i]]=dis[u]+wei[i];
 91             DFS(to[i]), size[u]+=size[to[i]];
 92             if(size[to[i]]>size[son[u]]) son[u] = to[i];
 93         }
 94 }
 95
 96 void DFS(int u, int v) {
 97     top[u] = v, g[f[u]=++rnk] = u;
 98     if(son[u]) DFS(son[u], v);
 99     for(int i=head[u]; i; i=nxt[i])
100         if(to[i]!=son[u] && to[i]!=fa[u])
101             DFS(to[i], to[i]);
102 }
103
104 void Get(int x) {
105     int y = x;
106     rt[x] = rt[x-1];
107     while(top[y] != 1)
108         rt[x] = Modify(rt[x], 1, n, f[top[y]], f[y]), y = fa[top[y]];
109     if(y != 1) rt[x] = Modify(rt[x], 1, n, 1, f[y]);
110 }
111
112 int Modify(int rt, int l, int r, int L, int R) {
113     int x = ++cnt, mid = l+r>>1;
114     if(l==L && r==R) {
115         lson[x] = lson[rt], rson[x] = rson[rt];
116         data[x]=data[rt]+1, segs[x]=segs[rt]+dis[g[r]]-dis[fa[g[l]]];
117         return x;
118     }
119     if(R <= mid) {
120         lson[x] = Modify(lson[rt], l, mid, L, R);
121         rson[x] = rson[rt];
122     }
123     else if(L > mid) {
124         lson[x] = lson[rt];
125         rson[x] = Modify(rson[rt], mid+1, r, L, R);
126     }
127     else {
128         lson[x] = Modify(lson[rt], l, mid, L, mid);
129         rson[x] = Modify(rson[rt], mid+1, r, mid+1, R);
130     }
131     data[x] = data[rt];
132     segs[x]=segs[lson[x]]+segs[rson[x]]+1LL*data[rt]*(dis[g[r]]-dis[fa[g[l]]]);
133     return x;
134 }
135
136 void Query(int x, int y, int z) {
137     lstans = 0;
138     while(top[z] != 1)
139         lstans += Query(rt[x-1], rt[y], 1, n, f[top[z]], f[z]), z = fa[top[z]];
140     if(z != 1) lstans += Query(rt[x-1], rt[y], 1, n, 1, f[z]);
141 }
142
143 LL Query(int rt1, int rt2, int l, int r, int L, int R) {
144     if(l==L && r==R) return segs[rt2]-segs[rt1];
145     int mid = l+r>>1;
146     LL x = 1LL * (data[rt2]-data[rt1]) * (dis[g[R]]-dis[fa[g[L]]]);
147     if(R <= mid) return Query(lson[rt1], lson[rt2], l, mid, L, R) + x;
148     else if(L > mid) return Query(rson[rt1], rson[rt2], mid+1, r, L, R) + x;
149     else return Query(lson[rt1], lson[rt2], l, mid, L, mid) +
150              Query(rson[rt1], rson[rt2], mid+1, r, mid+1, R) + x;
151 }

时间: 2024-10-25 07:52:01

HNOI2015的相关文章

BZOJ 4008: [HNOI2015]亚瑟王( dp )

dp(i, j)表示考虑了前i张牌, 然后还有j轮的概率. 考虑第i+1张牌: 发动的概率 : p = dp(i, j) * (1 - (1-p[i+1])^j) 没发动的概率 : dp(i, j) * (1 - p[i+1])^j 分别转移到状态: dp(i+1, j-1) dp(i+1, j) 同时假如i+1发动了对答案还有贡献p*d(i+1) 时间复杂度O(NTR) (好像有点不和谐..... ------------------------------------------------

bzoj4010【HNOI2015】菜肴制作

4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec  Memory Limit: 512 MB Submit: 981  Solved: 480 [Submit][Status][Discuss] Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1到N的顺序编号,预估质量最高的菜肴编号为1.由于菜肴之间口味搭配的问题, 某些菜肴必须在另一些菜肴之前制作,具体的

HNOI2015题解

奇了怪了我上次发的题解怎么不见了? 题意自己戳链接-- Day 1 HNOI2015 Arthur 思路:期望DP 直接DP是死也D不出的 转化一下 令f[i][j]--第i张卡在第j回合发动的概率 得到状态转移方程: f[i][j]--f[i?1][j]?(1?pi?1)j+f[i?1][j+1]?(1?(1?pi?1)j+1) 这样下来,答案就为: ∑ni=1∑rj=1f[i][j]?(1?(1?pi)j)?di 时间复杂度:O(Tnr) HNOI2015 Fruit 思路:DFS序+整体二

4010: [HNOI2015]菜肴制作

4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec  Memory Limit: 512 MBSubmit: 446  Solved: 251[Submit][Status][Discuss] Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1到N的顺序编号,预估质量最高的菜肴编号为1.由于菜肴之间口味搭配的问题, 某些菜肴必须在另一些菜肴之前制作,具体的,一

bzoj 4010: [HNOI2015]菜肴制作 拓扑排序

4010: [HNOI2015]菜肴制作 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/67 Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1到N的顺序编号,预估质量最高的菜肴编号为1.由于菜肴之间口味搭配的问题, 某些菜肴必须在另一些菜肴之前制作,具体的,一共有 M 条形如“i 号菜肴‘必须’

[HNOI2015]菜肴制作 题解(自带口胡证明)

[HNOI2015]菜肴制作 时间限制: 1 Sec  内存限制: 512 MB 题目描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1到N的顺序编号,预估质量最高的菜肴编号为1.由于菜肴之间口味搭配的问题, 某些菜肴必须在另一些菜肴之前制作,具体的,一共有 M 条形如"i 号菜肴'必须' 先于 j 号菜肴制作"的限制,我们将这样的限制简写为<i,j>.现在,酒店希望能求 出一个最

[洛谷 P3239] [HNOI2015]亚瑟王

[HNOI2015]亚瑟王 题目描述 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑.他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知,亚瑟王是一个看脸的游戏,技能的发动都是看概率的. 作为一个非洲人,同时作为一个前 OIer,小 K 自然是希望最大化造成伤害的期望值.但他已经多年没写过代码,连 Spaly都敲不对了,因此,希望你能帮帮小 K,让他感受一下当欧洲人是怎样的体验. 本题中我们将考虑游戏的一个简化版模型. 玩家有一套卡牌

BZOJ 4011: [HNOI2015]落忆枫音( dp )

DAG上有个环, 先按DAG计数(所有节点入度的乘积), 然后再减去按拓扑序dp求出的不合法方案数(形成环的方案数). -------------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long l

BZOJ 4009: [HNOI2015]接水果

4009: [HNOI2015]接水果 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 636  Solved: 300[Submit][Status][Discuss] Description 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果. 由于她已经DT FC 了The big black,  她觉得这个游戏太简单了,于是发明了一个更 加难的版本.首先有一个地图,是一棵由 n 个顶点.n-1 条边组成的树(例如图

【BZOJ 4010】 [HNOI2015]菜肴制作

4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec Memory Limit: 512 MB Submit: 426 Solved: 242 [Submit][Status][Discuss] Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1到N的顺序编号,预估质量最高的菜肴编号为1.由于菜肴之间口味搭配的问题, 某些菜肴必须在另一些菜肴之前制作,具体的,一