玄关,输入RE求调
查看原帖
玄关,输入RE求调
377842
liuxy1234楼主2023/12/6 23:00

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,玄关求助!

2023/12/6 23:00
加载中...