第一个:显然是I/O的class啦~!
/*IO相关*/ class InputReader { public InputReader() { // TODO Auto-generated constructor stub tokenizer = new StringTokenizer(""); reader = new BufferedReader(new InputStreamReader(System.in)); } public String nextTokenizer() throws IOException { while (!tokenizer.hasMoreTokens()) { tokenizer = new StringTokenizer(reader.readLine()); } return tokenizer.nextToken(); } public int nextInt() throws IOException { return Integer.valueOf(nextTokenizer()); } StringTokenizer tokenizer; BufferedReader reader; }
Map使用:
比赛常用HashMap和TreeMap
先介绍TreeMap:
二叉树Map嘛,自然就是log级各种运算的时间。所以对自定义结构体需要定义比较函数。
比如常用的比较器这样写。
/*常用的包含x,y节点的node的class*/ class nodexy { int x,y; nodexy(){} nodexy(int xx, int yy) { x = xx; y = yy; } } /*使用这样的比较函数*/ static Comparator<nodexy> cmp = new Comparator<nodexy>() { public int compare(nodexy o1, nodexy o2) { // TODO Auto-generated method stub if (o1.x==o2.x) return o1.y-o2.y; return o1.x-o2.x; } };
下面是一个简单的TreeMap的样例:
public static void main(String args[]) throws IOException { Map<Integer, Integer>q = new TreeMap<Integer, Integer>(); //int,int类型的TreeMap,没有包含比较器! q.put(1, 1); q.put(2, 2); q.put(3, 3); q.put(3, 4); //重复的key的value只保留最后一个~ key才是关键字 q.put(-1,0); q.put(-11,4); q.put(12,2); @SuppressWarnings("rawtypes") //消除下面的警告信息 Iterator it = q.entrySet().iterator(); //和C++一样用迭代器遍历 System.out.print("size = " + q.size()+"\n"); //总元素数量 while (it.hasNext()) { @SuppressWarnings("unchecked") //消除下面的警告信息 Map.Entry<Integer, Integer> ent = (Entry<Integer, Integer>) it.next(); int key = ent.getKey(); //key int value = ent.getValue(); //value System.out.println(key+" " + value); } }
public static void main(String args[]) throws IOException { TreeMap<Integer, Integer>q = new TreeMap<Integer, Integer>(); //int,int类型的TreeMap,没有包含比较器! q.put(1, 1); q.put(2, 2); q.put(3, 3); q.put(3, 4); //重复的key的value只保留最后一个~ key才是关键字 q.put(-1,0); q.put(-11,4); q.put(12,2); @SuppressWarnings({ "rawtypes", "unused" }) //消除下面的警告信息 Iterator it = q.entrySet().iterator(); //和C++一样用迭代器遍历 System.out.print("size = " + q.size()+"\n"); //总元素数量 /* * 不需要输出一次啦,直接这样 while (it.hasNext()) { @SuppressWarnings("unchecked") //消除下面的警告信息 Map.Entry<Integer, Integer> ent = (Entry<Integer, Integer>) it.next(); int key = ent.getKey(); //key int value = ent.getValue(); //value System.out.println(key+" " + value); } */ int ans = q.get(12); System.out.println(ans); //输出了2 /*对于不存在的键值的处理, 先判断是否是null*/ if (q.get(13) != null) { ans = q.get(13); System.out.println(ans); }else System.out.println("nothing");//输出了nothing System.out.println(q.higherKey(4));//比4大的是12,所以输出12 System.out.println(q.higherKey(12));//比12大的没有,输出null System.out.println(q.lastKey()); //输出最后一个key,也就是12,也是对的 q.remove(2); //删除键为2的 if (q.get(2) != null) { ans = q.get(2); System.out.println(ans); }else System.out.println("nothing");//因为2被删了,所以输出了nothing }
关于遍历,访问,删除迭代器指向内容的话
public static void main(String args[]) throws IOException { TreeMap<Integer, Integer>q = new TreeMap<Integer, Integer>(); //int,int类型的TreeMap,没有包含比较器! q.put(1, 1); q.put(2, 2); q.put(3, 3); q.put(3, 4); //重复的key的value只保留最后一个~ key才是关键字 q.put(-1,0); q.put(-11,4); q.put(12,2); @SuppressWarnings({ "rawtypes", "unused" }) //消除下面的警告信息 Iterator it = q.entrySet().iterator(); //和C++一样用迭代器遍历 System.out.print("size = " + q.size()+"\n"); //总元素数量 while (it.hasNext()) { @SuppressWarnings("unchecked") //消除下面的警告信息 Map.Entry<Integer, Integer> ent = (Entry<Integer, Integer>) it.next(); int key = ent.getKey(); //key int value = ent.getValue(); //value if (key==-1 || key == 1 || key==12)it.remove(); //删除迭代器这个值,并且向后迭代! System.out.println(key+" " + value); } System.out.println(); System.out.println(); /*再出输出一次,发现-1,1,12都已经被删啦!*/ it = q.entrySet().iterator(); while (it.hasNext()) { @SuppressWarnings("unchecked") //消除下面的警告信息 Map.Entry<Integer, Integer> ent = (Entry<Integer, Integer>) it.next(); int key = ent.getKey(); //key int value = ent.getValue(); //value System.out.println(key+" " + value); } }<span style="white-space:pre"> </span>
/*下面例子依然是TreeMap,但是我们修改了key为一个class, 同时设置了比较函数~,比较经典*/ class Pack { int a, b; Pack(){} Pack(int x, int y) { a=x; b=y; } boolean same(Pack tmp) { if (tmp.a == a && tmp.b==b) return true; return false; } }; public class Doit { //一边访问,一边删除迭代器指向的内容 static Comparator<Pack> cmp = new Comparator<Pack>() { @Override public int compare(Pack o1, Pack o2) { // TODO Auto-generated method stub if (o1.a==o2.a) return o1.b-o2.b; return o1.a-o2.a; } }; public static void main(String args[]) throws IOException { TreeMap<Pack, Integer>q = new TreeMap<Pack, Integer>(cmp); //int,int类型的TreeMap,没有包含比较器! q.put(new Pack(1,1), 1); q.put(new Pack(2,2), 2); q.put(new Pack(2,3), 3); q.put(new Pack(1,-1), 4); //重复的key的value只保留最后一个~ key才是关键字 q.put(new Pack(5,2),0); q.put(new Pack(5,3),4); q.put(new Pack(4,2),2); q.put(new Pack(4,2),2); @SuppressWarnings("rawtypes") Iterator it = q.entrySet().iterator(); //和C++一样用迭代器遍历 System.out.print("size = " + q.size()+"\n"); //总元素数量,输出为7个 while (it.hasNext()) { @SuppressWarnings("unchecked") //消除下面的警告信息 Map.Entry<Pack, Integer> ent = (Entry<Pack, Integer>) it.next(); Pack key = ent.getKey(); int key1 = ent.getKey().a; //key int key2 = ent.getKey().b; int value = ent.getValue(); //value if (key.same(new Pack(5,3)) || key.same(new Pack(2,2)))it.remove(); //删除迭代器这个值,并且向后迭代! System.out.println(key1+" "+key2+" " + value); } System.out.println(); System.out.println(); /*再出输出一次,发现-1,1,12都已经被删啦!*/ it = q.entrySet().iterator(); while (it.hasNext()) { @SuppressWarnings("unchecked") //消除下面的警告信息 Map.Entry<Pack, Integer> ent = (Entry<Pack, Integer>) it.next(); Pack key = ent.getKey(); int key1 = ent.getKey().a; //key int key2 = ent.getKey().b; int value = ent.getValue(); //value System.out.println(key1+" "+key2+" " + value); } } }
===============================================大分割线=========================
实现c++的vector功能的arraylist.
用一个class的例子
class Pack { int a, b; Pack(){} Pack(int x, int y) { a=x; b=y; } boolean same(Pack tmp) { if (tmp.a == a && tmp.b==b) return true; return false; } }; public class Doit { //一边访问,一边删除迭代器指向的内容 static Comparator<Pack> cmp = new Comparator<Pack>() { @Override public int compare(Pack o1, Pack o2) { // TODO Auto-generated method stub if (o1.a==o2.a) return o1.b-o2.b; return o1.a-o2.a; } }; public static void main(String args[]) throws IOException { ArrayList<Pack>q = new ArrayList<Pack>(); q.add(new Pack(5,5));//塞入队尾 q.add(new Pack(4,4)); q.add(new Pack(7,7)); System.out.println(q.get(0).a + " " + q.get(0).b); System.out.println(q.get(1).a + " " + q.get(1).b); System.out.println(q.get(2).a + " " + q.get(2).b); //Pack sb[] = q.toArray(); Pack sb[]; sb = q.toArray(new Pack[q.size()]); //转换成数组 for (int i = 0; i != q.size(); ++ i) { System.out.println(sb[i].a); } } }
关于数组排序:
class Pack { int a, b; Pack(){} Pack(int x, int y) { a=x; b=y; } boolean same(Pack tmp) { if (tmp.a == a && tmp.b==b) return true; return false; } }; public class Doit { //一边访问,一边删除迭代器指向的内容 static Comparator<Pack> cmp = new Comparator<Pack>() { @Override public int compare(Pack o1, Pack o2) { // TODO Auto-generated method stub if (o1.a==o2.a) return o1.b-o2.b; return o1.a-o2.a; } }; public static void main(String args[]) throws IOException { ArrayList<Pack>q = new ArrayList<Pack>(); q.add(new Pack(5,5));//塞入队尾 q.add(new Pack(4,4)); q.add(new Pack(7,7)); q.add(new Pack(4,3)); q.add(new Pack(4,2)); q.add(new Pack(4,10)); q.add(new Pack(4,4)); /*访问arraylist内元素方法用get*/ System.out.println(q.get(0).a + " " + q.get(0).b); System.out.println(q.get(1).a + " " + q.get(1).b); System.out.println(q.get(2).a + " " + q.get(2).b); //Pack sb[] = q.toArray(); /*arraylist转化为数组*/ Pack sb[]; sb = q.toArray(new Pack[q.size()]); //转换成数组 /* for (int i = 0; i != q.size(); ++ i) { System.out.println(sb[i].a); } */ /*数组排序的方法*/ Arrays.sort(sb,0, q.size(),cmp); //排序,[L,R)区间进行排序。 例子是[0,q.size()) 之间的数字进行排序 for (int i = 0; i != q.size(); ++ i) //输出了数组中的元素,从小到大 { System.out.println(sb[i].a + " " + sb[i].b); } } }
容器的排序:
class Pack { int a, b; Pack(){} Pack(int x, int y) { a=x; b=y; } boolean same(Pack tmp) { if (tmp.a == a && tmp.b==b) return true; return false; } }; public class Doit { //一边访问,一边删除迭代器指向的内容 static Comparator<Pack> cmp = new Comparator<Pack>() { @Override public int compare(Pack o1, Pack o2) { // TODO Auto-generated method stub if (o1.a==o2.a) return o1.b-o2.b; return o1.a-o2.a; } }; public static void main(String args[]) throws IOException { ArrayList<Pack>q = new ArrayList<Pack>(); q.add(new Pack(5,5));//塞入队尾 q.add(new Pack(4,4)); q.add(new Pack(7,7)); q.add(new Pack(4,3)); q.add(new Pack(4,2)); q.add(new Pack(4,10)); q.add(new Pack(4,4)); q.add(new Pack(2,4)); /*访问arraylist内元素方法用get*/ System.out.println(q.get(0).a + " " + q.get(0).b); System.out.println(q.get(1).a + " " + q.get(1).b); System.out.println(q.get(2).a + " " + q.get(2).b); //Pack sb[] = q.toArray(); System.out.println(); System.out.println(); System.out.println(); Collections.sort(q,cmp); Iterator it = q.iterator(); while (it.hasNext()) { Pack tmp = (Pack) it.next(); System.out.println(tmp.a+" "+tmp.b); } } }
================================
另一种做比较器的方法 用接口实现:
class Pack { int a, b; Pack(){} Pack(int x, int y) { a=x; b=y; } boolean same(Pack tmp) { if (tmp.a == a && tmp.b==b) return true; return false; } }; class MyCmp implements Comparator<Pack> { //@Override public int compare(Pack o1, Pack o2) { // TODO Auto-generated method stub if (o1.a==o2.a) return o1.b-o2.b; return o1.a - o2.a; } } public class Doit { //一边访问,一边删除迭代器指向的内容 static Comparator<Pack> cmp = new MyCmp(); public static void main(String args[]) throws IOException { ArrayList<Pack>q = new ArrayList<Pack>(); q.add(new Pack(5,5));//塞入队尾 q.add(new Pack(4,4)); q.add(new Pack(7,7)); q.add(new Pack(4,3)); q.add(new Pack(4,2)); q.add(new Pack(4,10)); q.add(new Pack(4,4)); q.add(new Pack(2,4)); /*访问arraylist内元素方法用get*/ System.out.println(q.get(0).a + " " + q.get(0).b); System.out.println(q.get(1).a + " " + q.get(1).b); System.out.println(q.get(2).a + " " + q.get(2).b); //Pack sb[] = q.toArray(); System.out.println(); System.out.println(); System.out.println(); Collections.sort(q,cmp); Iterator it = q.iterator(); while (it.hasNext()) { Pack tmp = (Pack) it.next(); System.out.println(tmp.a+" "+tmp.b); } } }
===========分界线===========================================================
POJ 2386 挑战P32 BFS/DFS搜索裸题 queue使用方法static Queue<Coordinate> queue = new LinkedList<Coordinate>();//队列必须new LinkedList类型
queue.offer(new Coordinate(arg0, arg1)); 塞入新元素
queue.poll();//弹出头元素
long nowx = queue . peek (). x ; //peek读取头元素
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.security.Principal;
import java.util.StringTokenizer;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Queue;
import java.util.StringTokenizer;
import java.util.LinkedList;
import java.util.Queue;
public class Main
{
static InputReader reader = new InputReader(System.in);
static PrintWriter writer = new PrintWriter(System.out);
static long n, m;
static char map[][] = new char [150][150];
static Queue<Coordinate> queue = new LinkedList<Coordinate>();
static boolean vis[][] = new boolean[150][150];
final static long dx[] = {0, 0, 1, -1, 1, 1, -1, -1};
final static long dy[] = {-1, 1, 0, 0, -1, 1, -1, 1};
//false为没哟放,true为访问过
public static void main(String args[])
{
try
{
init();
doit();
}catch (IOException e){
System.out.println("chuwenti");
}
finally
{
writer.close();
}
}
static void init() throws IOException
{
for (int i = 0; i != 150; ++ i)
for (int j = 0; j != 150; ++ j)
vis[i][j] = false;
n = reader.nextInt();
m = reader.nextInt();
for (int i = 0; i != n; ++ i)
{
String tmp = reader.nextString();
map[i] = tmp.toCharArray();
}
//debug 输出读入的数据监测是否正确
/*
for (int i = 0; i != n; ++ i)
{
for (int j = 0; j != m; ++ j)
writer.print(map[i][j]);
writer.print('\n');
}
*/
}
static void bfs(long arg0, long arg1)
{
queue.offer(new Coordinate(arg0, arg1));
while (!queue.isEmpty())
{
long nowx = queue.peek().x;
long nowy = queue.peek().y;
queue.poll();
for (int i = 0; i != 8; ++ i)
{
long willx = nowx + dx[i];
long willy = nowy + dy[i];
if (willx <0 || willy <0 || willx >= n || willy >= m) continue;
if (map[(int) willx][(int) willy] == '.') continue;
queue.offer(new Coordinate(willx, willy));
map[(int) willx][(int) willy] = '.';
}
}
}
static void doit()
{
long ans = 0;
for (int i = 0; i != n; ++ i)
for (int j = 0; j != m; ++ j)
{
if (map[i][j] == '.') continue;
bfs(i, j);
ans ++;
}
writer.println(ans);
}
}
class InputReader {
InputReader(InputStream in) {
this.reader = new BufferedReader(new InputStreamReader(in));
this.tokenizer = new StringTokenizer("");
}
public String nextToken() throws IOException {
while (!tokenizer.hasMoreTokens()) {
tokenizer = new StringTokenizer(reader.readLine());
}
return tokenizer.nextToken();
}
public int nextInt() throws IOException {
return Integer.parseInt(nextToken());
}
public String nextString() throws IOException
{
return nextToken();
}
private BufferedReader reader;
private StringTokenizer tokenizer;
}
class Coordinate
{
long x, y;
public Coordinate() {
// TODO Auto-generated constructor stub
x = -2;
y = -2;
}
public Coordinate(long x, long y) {
// TODO Auto-generated constructor stub
this.x = x;
this.y = y;
}
}
POJ 3253 挑战P47 贪心,JAVA heap注意事项, PrintWriter注意事项
static Comparator<Integer> myCmp = new MyCmp();
static PriorityQueue<Integer> q = new PriorityQueue<Integer>(mkh,myCmp);
切记,构造函数第一个需要填写数字。否则在部分OJ编译失败。并且这个数字大小写11即可。
同时,
PrintWriter必须close,否则无输出!
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main
{
static Comparator<Integer> myCmp = new MyCmp();
static PriorityQueue<Integer> q = new PriorityQueue<Integer>(20000,myCmp);
static Integer num[] = new Integer[30000];
static int n;
static PrintWriter writer = new PrintWriter(System.out);
static InputReader reader = new InputReader(System.in);
public static void main(String args[]) throws IOException
{
init();
doit();
}
static void init() throws IOException
{
n = reader.nextInteger();
for (int i = 0; i != n; ++ i)
{
num[i] = reader.nextInteger();
}
}
static void doit()
{
//System.out.println("!");
long ans = 0;
for (int i = 0; i != n; ++ i)
q.offer(num[i]);
while (!q.isEmpty())
{
if (q.size() == 1)
{
break;
}
long arg0 = q.poll();
long arg1 = q.poll();
ans += arg0 + arg1;
q.offer(Integer.valueOf( (int) (arg0 + arg1)));
}
writer.println(ans);
writer.close();
}
}
class MyCmp implements Comparator<Integer>
{
//@Override
public int compare(Integer o1, Integer o2) {
// TODO Auto-generated method stub
return o1 - o2;
}
}
class InputReader
{
public InputReader(InputStream in) {
// TODO Auto-generated constructor stub
this.reader = new BufferedReader(new InputStreamReader(in));
this.tokenizer = new StringTokenizer("");
}
public String nextTokenizer() throws IOException
{
while (!tokenizer.hasMoreTokens())
{
tokenizer = new StringTokenizer(reader.readLine());
}
return tokenizer.nextToken();
}
public Integer nextInteger() throws IOException
{
return Integer.valueOf(nextTokenizer());
}
private StringTokenizer tokenizer;
private BufferedReader reader;
}
POJ 1182 挑战P89 并查集 食物链 关于new 对象数组
static Animal animal[] = new Animal[50010];
for (int i = 0; i != 50010; ++ i) animal[i] = new Animal(); 必须这样,否则并不能初始化!!!!
并查集还得练!思考不够详细!
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main
{
static int n, m;
static InputReader reader = new InputReader();
static Animal animal[] = new Animal[50010];
public static void main(String args[]) throws IOException
{
initAndDoit();
}
public static void initAndDoit() throws IOException
{
n = reader.nextInt();
m = reader.nextInt();
for (int i = 0; i != 50010; ++ i) animal[i] = new Animal();
int ans = 0;
for (int test = 0; test != m; ++ test)
{
int flag = reader.nextInt();
int a = reader.nextInt(), b = reader.nextInt();
if (a > n || b > n) //满足条件2和条件3,假话
{
++ ans;
continue;
}
int x = getFather(a);
int y = getFather(b);
if (flag == 1) //同类
{
if (x == y)
{
if (animal[a].relationship != animal[b].relationship) ans ++;
continue;
}
animal[x].father = y;
animal[x].relationship = (animal[b].relationship - animal[a].relationship + 3) % 3;
}
if (flag == 2) //a吃b
{
if (x == y)
{
if ((animal[a].relationship ) != (animal[b].relationship + 1) % 3)
{
ans ++;
}
}else
{
animal[x].father = y;
animal[x].relationship = (animal[b].relationship - animal[a].relationship + 4) % 3;
}
}
}
System.out.println(ans);
}
public static int getFather(int arg0)
{
// System.out.println(arg0 + " " + animal[arg0].father);
int index = animal[arg0].father;
if (index == -1) return arg0;
int relationship = animal[arg0].relationship;
//System.out.println(index + " " + arg0);
animal[arg0].father = getFather(index);
animal[arg0].relationship = (relationship + animal[index].relationship) % 3;
return animal[arg0].father;
}
}
class Animal
{
int father;
int relationship;
Animal()
{
this.father = -1;
this.relationship = 0;
}
}
class InputReader
{
InputReader()
{
this.reader = new BufferedReader(new InputStreamReader(System.in));
this.tokenizer = new StringTokenizer("");
}
public String nextTokenizer() throws IOException
{
while (!tokenizer.hasMoreTokens())
{
tokenizer = new StringTokenizer(reader.readLine());
}
return tokenizer.nextToken();
}
public int nextInt() throws IOException
{
return Integer.valueOf(nextTokenizer());
}
private StringTokenizer tokenizer;
private BufferedReader reader;
}