Submission #139228

#TimeUsernameProblemLanguageResultExecution timeMemory
139228Lawliet모임들 (IOI18_meetings)C++14
17 / 100
126 ms9052 KiB
#include <bits/stdc++.h>

#define MAX 100010

using namespace std;
typedef long long int lli;

class SegmentTree
{
	public:

		int getLeft(int node) { return 2*node; }
		int getRight(int node) { return 2*node + 1; }

		void merge(int node, int idLeft, int idRight)
		{
			mx[ node ] = max(mx[ idLeft ] , mx[ idRight ]);

			blockLeft[ node ] = blockLeft[ idLeft ];
			blockRight[ node ] = blockRight[ idRight ];

			if(mx[ idLeft ] == 1) blockLeft[ node ] += blockLeft[ idRight ];
			if(mx[ idRight ] == 1) blockRight[ node ] += blockRight[ idLeft ];

			block[ node ] = max(block[ idLeft ] , block[ idRight ]);
			block[ node ] = max(block[ node ] , blockRight[ idLeft ] + blockLeft[ idRight ]);
		}

		void build(int node, int l, int r, int* v)
		{
			N = max(N , r);

			if(l == r)
			{
				int aux = 0;

				//printf("l = %d\n",l);

				if(v[l] == 1) aux = 1;

				mx[ node ] = v[ l ];
				block[ node ] = aux;
				blockLeft[ node ] = aux;
				blockRight[ node ] = aux;

				//printf("===pp %d %d %d %d  --- %d %d %d %d\n",mx[0],block[0],blockLeft[0],blockRight[0],mx[node],block[node],blockLeft[node],blockRight[node]);

				return;
			}

			int m = (l + r)/2;

			build(getLeft(node) , l , m , v);
			build(getRight(node) , m + 1 , r , v);

			merge(node , getLeft(node) , getRight(node));
		}

		void query(int node, int l, int r, int i, int j)
		{
			if(j < l || r < i) return;

			if(i <= l && r <= j) 
			{
				//printf("node = %d   %d %d\n",node,l,r);
				merge(1 , 0 , node);

				mx[0] = mx[1];
				block[0] = block[1];
				blockLeft[0] = blockLeft[1];
				blockRight[0] = blockRight[1];

				//printf("=== %d %d %d %d  --- %d %d %d %d\n",mx[0],block[0],blockLeft[0],blockRight[0],mx[node],block[node],blockLeft[node],blockRight[node]);

				return;
			}

			int m = (l + r)/2;

			query(getLeft(node) , l , m , i , j);
			query(getRight(node) , m + 1 , r , i , j);
		}

		int query(int l, int r)
		{
			mx[0] = mx[1] = -1;
			block[0] = block[1] = 0;
			blockLeft[0] = blockLeft[1] = 0;
			blockRight[0] = blockRight[1] = 0;

			query(2 , 1 , N , l , r);

			return block[ 0 ];
		}

		SegmentTree() : N( 0 ) {}

	private:

		int N;

		int mx[4*MAX];
		int block[4*MAX];
		int blockLeft[4*MAX];
		int blockRight[4*MAX];
};

int N, Q;

int v[MAX];

vector<lli> ans;

SegmentTree SEG;

vector<long long int> minimum_costs(vector<int> H, vector<int> l, vector<int> r)
{
	N = H.size(); Q = l.size();

	for(int g = 1 ; g <= N ; g++)
		v[ g ] = H[ g - 1 ];

	SEG.build(2 , 1 , N , v);

	for(int g = 0 ; g < Q ; g++)
	{
		int L = l[g] + 1;
		int R = r[g] + 1;

		int blockOne = SEG.query(L , R);
		//printf("-> %d\n",blockOne);

		ans.push_back( blockOne*1 + (R - L + 1 - blockOne)*2 );
	}

	return ans;
}

/*int main()
{
	int nn, qq;

	scanf("%d %d",&nn,&qq);

	vector<int> hh(nn);
	vector<int> ll(qq), rr(qq);

	for(int g = 0 ; g < nn ; g++)
		scanf("%d",&hh[g]);

	for(int g = 0 ; g < qq ; g++)
		scanf("%d %d",&ll[g],&rr[g]);

	vector<lli> aux = minimum_costs(hh , ll , rr);

	for(int g = 0 ; g < qq ; g++)
		printf("%lld\n",aux[g]);
}*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...