Submission #366904

#TimeUsernameProblemLanguageResultExecution timeMemory
366904HenryHElection (BOI18_election)Java
100 / 100
1750 ms89452 KiB
import java.util.*;
import java.io.*;

public class election {
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		PrintWriter pw = new PrintWriter(System.out);
		StringTokenizer t = new StringTokenizer(br.readLine());
		int n = Integer.parseInt(t.nextToken());
		String votes = "";
		votes = br.readLine();
		segTree = new Segment[4 * n];
		build(0, 0, n-1, votes);
		t = new StringTokenizer(br.readLine());
		int q = Integer.parseInt(t.nextToken());
		for(int i = 0; i < q; i++) {
			t = new StringTokenizer(br.readLine());
			int curr1 = Integer.parseInt(t.nextToken()) - 1;
			int curr2 = Integer.parseInt(t.nextToken()) - 1;
			pw.println(query(0, curr1, curr2, 0, n-1, segTree).answer);
		}
		pw.close();
	}
	public static Segment[] segTree;
	public static Segment query(int node, int start, int end, int j, int k, Segment[] segTree) {
		if (k < j)return new Segment(0, 0, 0, 0);
		if (k < start || j > end) {
			return new Segment(0, 0, 0, 0);
		}
		if (start <= j && k <= end) {
			return segTree[node];
		}
		int midPt = (j + k)/2;
		return merge(query(node * 2 + 1, start, end, j, midPt, segTree), query(node * 2 + 2, start, end, midPt + 1, k, segTree));
	}
	public static void build(int node, int l, int r, String s) {
	    if (l == r) {
	        if (s.charAt(l) == 'T') segTree[node] = new Segment(1, 1, 1, 1);
	        else segTree[node] = new Segment(0, 0, -1, 0);
	    } else {
	        int mid = (l + r) / 2;
	        build(node * 2+1, l, mid, s);
	        build(node * 2 + 2, mid + 1, r, s);
	        segTree[node] = merge(segTree[node * 2+1], segTree[node * 2 + 2]);
	    }
	}
	public static Segment merge(Segment seg1, Segment seg2) {
		int newL = Math.max(seg1.maxL, seg1.total + seg2.maxL);
		int newR = Math.max(seg2.maxR, seg2.total + seg1.maxR);
		int total = seg1.total + seg2.total;
		int newAns = Math.max(Math.max(seg1.answer + seg2.total, seg1.total + seg2.answer), seg1.maxL + seg2.maxR);
		return new Segment(newL, newR, total, newAns);
	}
}

class Segment{
	int maxL;
	int maxR;
	int total;
	int answer;
	public Segment(int a, int b, int c, int d) {
		maxL = a;
		maxR = b;
		total = c;
		answer = d;
	}
	public String toString() {
		return maxL + " " + maxR + " " + total + " " + answer;
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...