社区讨论
悬关 WA 0pts求调
P3730曼哈顿交易参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @lo1upoem
- 此快照首次捕获于
- 2023/10/23 03:17 2 年前
- 此快照最后确认于
- 2023/11/03 03:48 2 年前
CPP
#include<bits/stdc++.h>
#define maxn 200005
#define int long long
using namespace std;
int n,m,size,tot,sum;
int a[maxn],ans[maxn],cnt[maxn],cnt_bl[maxn];//cnt_bl每块cnt之和
int bl[maxn],block[maxn],ls[maxn],rs[maxn];
struct query{
int l,r,id,k;
}q[maxn];
struct disc{
int id,num;
}d[maxn];//离散化
int rk[maxn];
bool cmp(query x,query y)
{
if(bl[x.l] == bl[y.l])
return x.r < y.r;
return x.l < y.l;
}
bool cmp2(disc x,disc y)
{
return x.num < y.num;
}
void discre()
{
sort(d + 1,d + n + 1,cmp2);
for(int i = 1;i <= n;i++)
{
if(d[i].num != d[i - 1].num)
++tot;
rk[d[i].id] = tot;
}
}
void add(int x)
{
cnt[rk[x]]++;
cnt_bl[ bl[rk[x]] ] += cnt[rk[x]] == 1;
}
void del(int x)
{
cnt[rk[x]]--;
cnt_bl[ bl[rk[x]] ] -= cnt[rk[x]] == 0;
}
int get_ans(int x)
{
int res = 0,i;
for(i = 1;i <= tot / size + 1;i++)
{
if(res + cnt_bl[i] >= x)
goto nxt;
res += cnt_bl[i];
}
return -1;
nxt:
for(int j = ls[i];j <= rs[i];j++)
{
if(res + (bool)cnt[i] == x)
return cnt[i];
res += (bool)cnt[i];
}
}
signed main()
{
cin >> n >> m;
size = max(1.0,pow(n,2.0/3.0));
for(int i = 1;i <= n;i++)
{
scanf("%lld",&a[i]);
d[i].num = a[i];d[i].id = i;
bl[i] = (i - 1) / size + 1;
}
discre();
for(int i = 1;i <= m;i++)
scanf("%lld%lld%lld",&q[i].l,&q[i].r,&q[i].k),q[i].id = i;
sort(q + 1,q + m + 1,cmp);
size = sqrt(tot);
for(int i = 1;i <= tot;i++)
{
bl[i] = (i - 1) / size + 1;
ls[i] = (int)((i - 1) / size) * size + 1;
rs[i] = (int)((i - 1) / size + 1) * size;
// if(bl[i] != bl[i - 1])
// cout << ls[i] << '/' <<rs[i]<<endl;
}
int l = 1,r = 0;
for(int i = 1;i <= m;i++)
{
while(l > q[i].l)
add(--l);
while(r < q[i].r)
add(++r);
while(l < q[i].l)
del(l++);
while(r > q[i].r)
del(r--);
//cout << l << "->" <<r <<endl;
//cout <<cnt[1] << "/" << cnt[2] <<endl;
int k = q[i].k;
ans[q[i].id] = get_ans(k);
}
for(int i = 1;i <= m;i++)
{
printf("%lld\n",ans[i]);
}
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...