lahlahblog喵~

P7530 [USACO21OPEN] United Cows of Farmer John P

lahlah·2021-12-22 08:06·74 次阅读

P7530 [USACO21OPEN] United Cows of Farmer John P

https://www.luogu.com.cn/problem/P7530

按照套路,我们记pre[i]表示上一个和i相同颜色的位置
考虑扫描线,记f[l]为每个左端点的答案,用线段树维护就是区间(pre[r],r1)f[l]

考虑i[l,r],pre[i]显然能作为左端点,把它当系数设为0,假设i是中间点,那么它可以把(pre[i],i)中可以作为左端点的f[l]全部加1
写个带系数的线段树维护即可

code:

Copy
#include<bits/stdc++.h> #define ll long long #define N 400050 using namespace std; #define ls (rt << 1) #define rs (rt << 1 | 1) ll s[N << 2], val[N << 2], tg[N << 2], sz[N << 2]; void update(int rt) { s[rt] = s[ls] + s[rs], sz[rt] = sz[ls] + sz[rs]; } void padd(int rt, int o) { tg[rt] += o, s[rt] += o * sz[rt], val[rt] += o; } void pushdown(int rt) { if(tg[rt]) { padd(ls, tg[rt]), padd(rs, tg[rt]); tg[rt] = 0; } } void addx(int rt, int l, int r, int x, int o) { if(l == r) { sz[rt] += o; s[rt] += o * val[rt]; return ; } pushdown(rt); int mid = (l + r) >> 1; if(x <= mid) addx(ls, l, mid, x, o); else addx(rs, mid + 1, r, x, o); update(rt); } void add(int rt, int l, int r, int L, int R, int o) { if(L > R) return ; if(L <= l && r <= R) { padd(rt, o); return ; } pushdown(rt); int mid = (l + r) >> 1; if(L <= mid) add(ls, l, mid, L, R, o); if(R > mid) add(rs, mid + 1, r, L, R, o); update(rt); } ll query(int rt, int l, int r, int L, int R) { if(L > R) return 0; if(L <= l && r <= R) return s[rt]; pushdown(rt); int mid = (l + r) >> 1; ll ret = 0; if(L <= mid) ret = query(ls, l, mid, L, R); if(R > mid) ret += query(rs, mid + 1, r, L, R); return ret; } int n, a[N], pre[N], mp[N]; int main() { scanf("%d", &n); for(int i = 1; i <= n; i ++) scanf("%d", &a[i]), pre[i] = mp[a[i]], mp[a[i]] = i; ll ans = 0; for(int i = 1; i <= n; i ++) { if(pre[i]) addx(1, 1, n, pre[i], - 1), add(1, 1, n, pre[pre[i]] + 1, pre[i] - 1, - 1); ans += query(1, 1, n, pre[i] + 1, i - 1); addx(1, 1, n, i, 1); add(1, 1, n, pre[i] + 1, i - 1, 1); } printf("%lld", ans); return 0; }
posted @   lahlah  阅读(74)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示