CF Round #782 D - Reverse Sort Sum
D - Reverse Sort Sum
线段树 / 树状数组
从后往前遍历,如果 c[i] = i, 则说明第 i 个位置上的 1 是从时刻1到 时刻 i 都存在的,所以这一位最开始就是 1,此时若前 i 位有 k 个 1,它们一定在 [i - k + 1, i] 位置上,这个区间 - 1,这是第 i 位的 1 被永远留在这一位了,所以 k--;
否则 k 不减 1,其余操作一样
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
const int N = 2e5 + 10;
int n;
int c[N], tr[N];
int ans[N];
int lowbit(int x)
{
return x & -x;
}
void add(int idx, int k)
{
for (int i = idx; i <= n; i += lowbit(i))
tr[i] += k;
}
void modify(int l, int r, int k)
{
add(l, k);
add(r + 1, -k);
}
int query(int idx)
{
int ans = 0;
for (int i = idx; i; i -= lowbit(i))
ans += tr[i];
return ans;
}
int main()
{
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int T;
cin >> T;
while(T--)
{
cin >> n;
fill(tr, tr + n + 2, 0);
ll sum = 0;
for (int i = 1; i <= n; i++)
{
cin >> c[i];
sum += c[i];
modify(i, i, c[i]);
}
int k = sum / n;
for (int i = n; i >= 1; i--)
{
int t = query(i);
int sub = 0;
if (t == i)
{
ans[i] = 1;
sub++;
}
else
ans[i] = 0;
int r = i, l = r - k + 1;
modify(l, r, -1);
k -= sub;
}
for (int i = 1; i <= n; i++)
cout << ans[i] << " ";
cout << endl;
}
return 0;
}
分类:
acm / 数据结构
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!