CSES - Datatähti 2015 loppu - Tekniset ohjeet

Rajat

Jokaisen tehtävän aikaraja on ilmoitettu tehtävän alussa.

Jokaisen tehtävän muistiraja on 128 Mt. Pinomuistia saa käyttää enintään 64 Mt.

Koodin koko saa olla enintään 128 kt.

Virhetilanteet

CSES tunnistaa seuraavat virhetilanteet:

COMPILE ERROR: Ohjelman kääntäminen ei onnistunut. Lisätiedoissa näet kääntäjän virheilmoituksen.

OUTPUT LIMIT EXCEEDED: Ohjelma tuotti liikaa tulostetta.

TIME LIMIT EXCEEDED: Ohjelman suoritus kesti liian kauan.

RUNTIME ERROR: Ohjelma palautti nollasta poikkeavan palautusarvon (exit code). Tämä tulee esimerkiksi, jos muisti loppuu kesken tai koodi heittää käsittelemättömän poikkeuksen.

Mikäli ohjelma tuottaa useamman virheen, niistä näytetään edellisen listan mukaan ensimmäinen.

Ohjelmointikielet

Sallitut ohjelmointikielet ovat C++ ja Java. Huomaa, että voit joutua käyttämään alla olevia optimointeja, jotta syötteen lukeminen ja tulostus on riittävän nopeaa.

C++

C++ käännetään g++ 4.8.2-kääntäjällä. Kääntäjäliput ovat -std=c++0x -O2 -Wall.

C++:n cin ja cout voivat olla oletuksena liian hitaita, mutta niitä nopeuttaa huomattavasti, jos poistaa niiden synkronoinnin C:n stdio-kirjaston kanssa. Tämä tehdään lisäämällä rivi

cin.sync_with_stdio(false);

main-funktion alkuun:

#include <iostream>

using namespace std;

int main() {
	cin.sync_with_stdio(false);
	
	// ratkaise tehtävä tähän
}

Java

Käytettävä Java-jakelu on OpenJDK versio 1.8.0_40 (eli siis Java 8).

Nimeä kooditiedostosi Javan käytäntöjen mukaisesti, eli jos main-luokan nimi on Main niin uploadattavan tiedoston nimen tulee olla Main.java. Koodi ei saa olla missään pakkauksessa, tai muuten kääntö epäonnistuu.

Syötteeseen ja tulostukseen Javan Scanner-luokka ja komento System.out.println saattavat olla liian hitaita. Ajoympäristössä on käytössäsi nopeamman syötteen ja tulostuksen mahdollistava IO-luokka, jota ei tarvitse erikseen importata (IO.class on samassa hakemistossa ohjelman kanssa). IO-luokkaa käytetään seuraavasti:

public class Ratkaisu {
public static void main(String[] args) {
	IO io = new IO();
	
	String a = io.next(); // Lukee seuraavan välein erotellun merkkijonon.
	int b = io.nextInt(); // Lukee seuraavan välein erotellun int-kokonaisluvun.
	long c = io.nextLong(); // Lukee seuraavan välein erotellun long-kokonaisluvun.
	double d = io.nextDouble(); // Lukee seuraavan välein erotellun double-liukuluvun.
	
	// Toimii kuten System.out.println.
	io.println("Annoit syötteenä " + a + " " + b + " " + c + " " + d);
	
	io.close(); // TÄYTYY KUTSUA LOPUKSI, muuten tuloste voi jäädä kirjoittamatta
}
}

IO-luokan koodin löydät täältä: IO.java.