o(n)算法70pts求调
查看原帖
o(n)算法70pts求调
616284
GREAT_GUIDA楼主2022/11/23 10:14

用链表存堆然后合并

#include<bits/stdc++.h>
#define ll long long
#define over(i, a, b) for(i = a; i <= b; i += 1)
#define fover(i, a, b) for(i = b; i >= a; i -= 1)





using namespace std;
ll a, b, c, d, e, f, g, h, i, j, k, l, m, n, o,p, q, r, s, t, u, v, w, x, y, z;
ll maxx, maxx2, minn, ans, ans2, len, mapp[1000][1000], val[1000][1000], num[1001000];
ll tree[30][100000], lazy[400100], en[30][100000], pos[600000];
ll mid, tot, ixx[60000], iyy[60000], ix, iy, cntx, cnty, xnum[60000], ynum[60000], cnt;
ll x1, x2, yy1, y2, dist1, dist2, l1, l2, dp[31][101][101][101], dp2[200100], MOD = 10007, flag;
string S, S1, S2;
char C;
stack<ll>T, T2;
queue<ll> Q;
struct node
{
	ll v, n;
	ll p, lst, nxt, jump, jumpend;
}N[501000];
bool cmp(node a, node b)
{
	return (a.v == b.v) ? (a.n < b.n) : (a.v < b.v);
}
inline void read(ll &a)
{
	a = 0;char c;int f;
	do{c = getchar();}
	while(!(c >= '0' && c <= '9' || c == '-'));
	if(c == '-'){f = -1;c = getchar();}
	while(c >= '0' && c <= '9'){a = a * 10 + c - '0';c = getchar();}
}
inline void write(ll x)
{
    if(x >= 10)write(x / 10);
    putchar(x % 10 + '0');
}
int main()
{
	freopen("fruit.in", "r", stdin);
	freopen("fruit.out", "w", stdout);
	t = 1;
	//read(t);
	while(t--)
	{
		read(n);
		p = 2;
		over(i, 1, n)
		{
			read(num[i]);
			if(p == num[i])continue;
			p = num[i];
			N[++tot].p = i;
			N[tot].lst = tot - 1;
			N[tot].nxt = tot + 1;
			N[tot].jumpend = tot;
		}
		N[0].nxt = 1;
		N[tot + 1].lst = tot;
		N[tot + 1].p = n + 1;
		num[0] = 2;
		num[n + 1] = 3;
		while(N[0].nxt != tot + 1)
		{
			for(i = N[0].nxt; i <= tot; i = N[i].nxt)
			{
				write(N[i].p);
				printf(" ");
				N[i].p += 1;
				if(num[N[i].p] != num[N[i].p - 1])
				{
					if(N[i].jump)
					{
						N[i].p = N[N[i].jump].p;
						N[i].jump = N[N[i].jump].jump;
					}
					else
					{
						N[N[i].lst].nxt = N[i].nxt;
						N[N[i].nxt].lst = N[i].lst;
					}
				}
			}
			for(i = 0; i <= tot; i = N[i].nxt)
			{
				while(num[N[i].p] == num[N[N[i].nxt].p])
				{
					if(!N[i].jump)
					{
						N[i].jump = N[i].nxt;
						N[i].jumpend = N[N[i].nxt].jumpend;
					}
					else
					{
						N[N[i].jumpend].jump = N[i].nxt;
						N[i].jumpend = N[N[i].nxt].jumpend;
					}
					N[i].nxt = N[N[i].nxt].nxt;
					N[N[i].nxt].lst = i;
				}
			}
			printf("\n");
		}
	}
	return 0;
}




2022/11/23 10:14
加载中...