RT,调了一个小时了,心态炸裂。
#include <bits/stdc++.h>
// #define int long long
using namespace std;
inline int read()
{
register int x = 0, f = 1;
register char c = getchar();
while(c < '0' || c > '9')
{
if(c == '-')f = -1;
c = getchar();
}
while(c <= '9' && c >= '0')
{
x = x * 10 + c - '0';
c = getchar();
}
return x * f;
}
inline void write(int x)
{
if(!x)return;
write(x / 10);
putchar(x % 10 + '0');
return;
}
int id[100010], sum[100010], a[100010], hsh[100010], len, n, m, v;
int b[100010], c[100010];
struct query
{
int l, r, a, b, id;
}q[100010];
bool cmp1(query a, query b)
{
if(id[a.l] != id[b.l])return a.l < b.l;
if(id[a.l] & 1)return a.r < b.r;
return a.r > b.r;
}
bool cmp(int x, int b)
{
if(a[x] != a[b])return a[x] < a[b];
return x < b;
}
unordered_map <int, int> mp;
void add(int x)
{
if(mp[x])c[mp[x]]--, sum[id[mp[x]]]--;
mp[x]++;
c[mp[x]]++;
sum[id[mp[x]]]++;
return;
}
void del(int x)
{
c[mp[x]]--;
sum[id[mp[x]]]--;
mp[x]--;
if(mp[x] > 0)c[mp[x]]++, sum[id[mp[x]]]++;
return;
}
int query(int k)
{
int ans = -1;
int i = 1;
while(k > sum[i])k -= sum[i], i++;
i = (i - 1) * len + 1;
while(c[i] < k && i <= n)
{
k -= c[i];
i++;
}
if(i <= n)ans = i;
// cout <<i << " " << k << " " << ans << "\n";
return ans;
}
//int find(int x)
//{
// int l = 1, r = n, ans = n + 1;
// while(l <= r)
// {
// int mid = (l + r) / 2;
// if(b[mid] >= x)ans = mid, r = mid - 1;
// else l = mid + 1;
// }
// return ans;
//}
int ans[100010];
signed main()
{
freopen("P3730_1.in", "r", stdin);
freopen("P3730.out", "w", stdout);
// cout << "bruhbruhbruh\n";
scanf("%d%d",&n, &m);
// cout <<n << " " <<m << "\n";
// cout << n << " " << m <<"\n";
for(int i = 1;i <= n;i++)
{
scanf("%d", &a[i]);
// b[i] = a[i];
// mp[a[i]] = 1;
// add(a[i]);
// cout << a[i] << " ";
}
// cout << "\n";
// sort(b + 1, b + n + 1);
// cout << m << '\n';
for(int i = 1;i <= m;i++)
{
// cout << "here" << i << "\n";
q[i].l = read();
q[i].r = read();
q[i].a = read();
// scanf("%d%d%d", &q[i].l, &q[i].r, &q[i].a);
q[i].id = i;
// cout << q[i].l << " " << q[i].r << " " << q[i].a << "\n";
}
// cout << "here\n";
// for(int i = 1;i <= 600000000;i++);
// cout << "here\n";
len = 300;
for(int i = 1;i <= n;i++)
{
id[i] = (i - 1) / len + 1;
}
sort(q + 1, q + m + 1, cmp1);
int l = 1, r = 0, nowans = 0;
// cout << "\n";
for(int i = 1;i <= m;i++)
{
while(l >= q[i].l)
{
add(a[--l]);
}
while(r <= q[i].r)
{
add(a[++r]);
}
while(l < q[i].l)
{
del(a[l++]);
}
while(r > q[i].r)
{
del(a[r--]);
}
// cout << q[i].a << " ";
nowans = query(q[i].a);
// cout << nowans << "\n";
ans[q[i].id] = nowans;
// cout << l << " " << r << "\n";
// for(int i = 1;i <= n;i++)cout << c[i] << " ";
// cout << "\n";
// for(int i = 1;i <= id[n];i++)
// {
// cout << sum[i] << " ";
// }
// cout << "\n";
}
for(int i = 1;i <= m;i++)
{
cout << ans[i] << "\n";
}
//6 3
//1 2 2 3 3 3
//1 6 1
//1 6 2
//1 6 3
return 0;
}
由于调的难受也没管主函数美不美观了。
目前发现:把len=300到cout << ans[i] << "\n";注释掉可以正常输入,但是加上这些就会re,玄关求助!