# 111北二區桃竹苗資訊學科能力複賽 Java Solution Code
[<<回主頁](https://hackmd.io/@r1cky/Sk2hKzga6)
## J242 111北二1a.自然數的平方根
解法:窮舉所有開方是否整除,複雜度為$O(\sqrt N)$。
code:
```java=
/*
* Author: rickytsung
* Date: 2023/2/2
* Problem: ZJ
*/
import java.util.*;
import java.time.*;
import java.io.*;
import java.math.*;
public class Main{
public static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
public static BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
public static long ret,cnt;
public static int reti,rd,n,m,ans;
public static boolean neg,b1,b2,b3;
public static final int mod=998244353,mox=998244352,mod2=1_000_000_007,ma=200005;
public static Useful us=new Useful(mod);
public static int[] A=new int[ma];
public static int[] B=new int[ma];
public static long[] Al=new long[ma];
public static long[] Bl=new long[ma];
public static ArrayList<ArrayList<Integer>> E=new ArrayList<>();
public static void main(String[] args) throws Exception{
long n=readint();
final long max=(long)Math.pow(10,5);
long a=1,b=n;
for(long i=1;i<=max;i++) {
if(n%(i*i)==0) {
a=i;
b=n/(i*i);
}
}
if(a!=1) {
out(a+" ");
}
if(b!=1) {
out("sqrt("+b+")");
}
if(a==1&&b==1)out(1);
outn();
}
/*
*/
public static int readint() throws Exception{
reti=0;
neg=false;
while(rd<48||rd>57) {
rd=br.read();
if(rd=='-') {
neg=true;
}
}
while(rd>47&&rd<58) {
reti*=10;
reti+=(rd&15);
rd=br.read();
}
if(neg)reti*=-1;
return reti;
}
public static long readlong() throws Exception{
ret=0;
neg=false;
while(rd<48||rd>57) {
rd=br.read();
if(rd=='-') {
neg=true;
}
}
while(rd>47&&rd<58) {
ret*=10;
ret+=(rd&15);
rd=br.read();
}
if(neg)ret*=-1;
return ret;
}
public static int pint(String in) {
return Integer.parseInt(in);
}
public static long plong(String in) {
return Long.parseLong(in);
}
public static void outn() {
System.out.println();
}
public static void outn(long in) {
System.out.println(in);
}
public static void outn(boolean in) {
System.out.println(in);
}
public static void outn(String in) {
System.out.println(in);
}
public static void out(long in) {
System.out.print(in);
}
public static void out(boolean in) {
System.out.print(in);
}
public static void out(String in) {
System.out.print(in);
}
}
/*
*/
/*
*/
```
## J243 111北二2a.資料分組問題
解法:窮舉所有距離,找到最小重複距離,接著對此距離以下的做$dsu$,時間複雜度為$O(N^2\cdot(D+logN))$。
```java=
/*
* Author: rickytsung
* Date: 2023/2/2
* Problem: ZJ
*/
import java.util.*;
import java.time.*;
import java.io.*;
import java.math.*;
public class Main{
public static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
public static BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
public static long ret,cnt;
public static int reti,rd,n,m,ans;
public static boolean neg,b1,b2,b3;
public static final int mod=998244353,mox=998244352,mod2=1_000_000_007,ma=200005;
public static Useful us=new Useful(mod);
public static int[] A=new int[ma];
public static int[] B=new int[ma];
public static long[] Al=new long[ma];
public static long[] Bl=new long[ma];
public static ArrayList<ArrayList<Integer>> E=new ArrayList<>();
public static void main(String[] args) throws Exception{
final int d=readint();
final int n=readint();
long[][] xy=new long[n][d];
for(int i=0;i<n;i++) {
for(int j=0;j<d;j++) {
xy[i][j]=readint();
}
}
HashSet<Long> hs=new HashSet<>();
HashSet<Integer> s=new HashSet<>();
long cnt=0,min=(long)Math.pow(10, 18),ans=0;
for(int i=0;i<n;i++) {
A[i]=i;
for(int j=i+1;j<n;j++) {
cnt=0;
for(int k=0;k<d;k++) {
cnt+=Math.abs(xy[i][k]-xy[j][k]);
}
if(cnt<min) {
if(hs.contains(cnt)) {
min=cnt;
}
else {
hs.add(cnt);
}
}
}
}
for(int i=0;i<n;i++) {
for(int j=i+1;j<n;j++) {
cnt=0;
for(int k=0;k<d;k++) {
cnt+=Math.abs(xy[i][k]-xy[j][k]);
}
if(cnt<min) {
join(i,j);
}
}
}
for(int i=0;i<n;i++) {
s.add(find(i));
}
outn(s.size());
}
public static void join(int x,int y) {
if(find(x)!=find(y));
A[find(x)]=A[(find(y))];
return;
}
public static int find(int x) {
if(A[x]==x)return x;
return A[x]=find(A[x]);
}
/*
*/
public static int readint() throws Exception{
reti=0;
neg=false;
while(rd<48||rd>57) {
rd=br.read();
if(rd=='-') {
neg=true;
}
}
while(rd>47&&rd<58) {
reti*=10;
reti+=(rd&15);
rd=br.read();
}
if(neg)reti*=-1;
return reti;
}
public static long readlong() throws Exception{
ret=0;
neg=false;
while(rd<48||rd>57) {
rd=br.read();
if(rd=='-') {
neg=true;
}
}
while(rd>47&&rd<58) {
ret*=10;
ret+=(rd&15);
rd=br.read();
}
if(neg)ret*=-1;
return ret;
}
public static int pint(String in) {
return Integer.parseInt(in);
}
public static long plong(String in) {
return Long.parseLong(in);
}
public static void outn() {
System.out.println();
}
public static void outn(long in) {
System.out.println(in);
}
public static void outn(boolean in) {
System.out.println(in);
}
public static void outn(String in) {
System.out.println(in);
}
public static void out(long in) {
System.out.print(in);
}
public static void out(boolean in) {
System.out.print(in);
}
public static void out(String in) {
System.out.print(in);
}
}
/*
*/
/*
*/
```
## J244. 111北二3a.兌獎問題
解法:照題目實作就好。
```java=
/*
* Author: rickytsung
* Date: 2023/2/2
* Problem: ZJ
*/
import java.util.*;
import java.time.*;
import java.io.*;
import java.math.*;
public class Main{
public static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
public static BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
public static long ret,cnt;
public static int reti,rd,n,m,ans;
public static boolean neg,b1,b2,b3;
public static final int mod=998244353,mox=998244352,mod2=1_000_000_007,ma=200005;
public static Useful us=new Useful(mod);
public static int[] A=new int[ma];
public static int[] B=new int[ma];
public static long[] Al=new long[ma];
public static long[] Bl=new long[ma];
public static ArrayList<ArrayList<Integer>> E=new ArrayList<>();
public static void main(String[] args) throws Exception{
String[] inp=br.readLine().split(" ");
String[] lu=new String[3];
String in;
final int k=pint(inp[0]);
final int n=pint(inp[1]);
for(int i=0;i<3;i++) {
lu[i]=br.readLine().split(" ")[0];
}
long cnt=0,ans=0,max=0;
for(int i=0;i<n;i++) {
in=br.readLine().split(" ")[0];
max=0;
for(int j=0;j<3;j++) {
if(in.substring(0).equals(lu[j].substring(0))) {
ans=500000;
}
else if(in.substring(2).equals(lu[j].substring(2))) {
ans=10000;
}
else if(in.substring(4).equals(lu[j].substring(4))) {
ans=1000;
}
else if(in.substring(k-3).equals(lu[j].substring(k-3))) {
ans=300;
}
else {
ans=0;
}
max=Math.max(ans,max);
}
cnt+=max;
}
outn(cnt);
}
/*
*/
public static int readint() throws Exception{
reti=0;
neg=false;
while(rd<48||rd>57) {
rd=br.read();
if(rd=='-') {
neg=true;
}
}
while(rd>47&&rd<58) {
reti*=10;
reti+=(rd&15);
rd=br.read();
}
if(neg)reti*=-1;
return reti;
}
public static long readlong() throws Exception{
ret=0;
neg=false;
while(rd<48||rd>57) {
rd=br.read();
if(rd=='-') {
neg=true;
}
}
while(rd>47&&rd<58) {
ret*=10;
ret+=(rd&15);
rd=br.read();
}
if(neg)ret*=-1;
return ret;
}
public static int pint(String in) {
return Integer.parseInt(in);
}
public static long plong(String in) {
return Long.parseLong(in);
}
public static void outn() {
System.out.println();
}
public static void outn(long in) {
System.out.println(in);
}
public static void outn(boolean in) {
System.out.println(in);
}
public static void outn(String in) {
System.out.println(in);
}
public static void out(long in) {
System.out.print(in);
}
public static void out(boolean in) {
System.out.print(in);
}
public static void out(String in) {
System.out.print(in);
}
}
/*
*/
/*
*/
```
## J245. 111北二4a.加密密文
解法:待補
```java=
```
## J246. 111北二5a.程式排程模擬
解法:用queue模擬,複雜度為$O(\sum T)$
```java=
/*
* Author: rickytsung
* Date: 2023/2/2
* Problem: ZJ
*/
import java.util.*;
import java.time.*;
import java.io.*;
import java.math.*;
public class Main{
public static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
public static BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
public static long ret,cnt;
public static int reti,rd,n,m,ans;
public static boolean neg,b1,b2,b3;
public static final int mod=998244353,mox=998244352,mod2=1_000_000_007,ma=200005;
public static Useful us=new Useful(mod);
public static int[] A=new int[ma];
public static int[] B=new int[ma];
public static long[] Al=new long[ma];
public static long[] Bl=new long[ma];
public static ArrayList<ArrayList<Integer>> E=new ArrayList<>();
public static void main(String[] args) throws Exception{
final int n=readint();
final int k=readint();
final int x=readint();
int o=-1,ans=0,nxt=0;
for(int i=1;i<=n;i++) {
B[i]=readint();
A[i]=readint();
}
Queue<Integer> q=new LinkedList<>();
Pii[] s=new Pii[n];
for(int i=0;i<n;i++) {
s[i]=new Pii(i+1,B[i+1]);
}
Arrays.sort(s,new Comparator<Pii>() {
public int compare(Pii f,Pii s) {
if(f.y==s.y)return f.x-s.x;
return f.y-s.y;
}
});
while(A[x]!=0) {
if(q.isEmpty()) {
ans++;
}
else {
o=q.poll();
ans+=Math.min(A[o],k);
A[o]=Math.max(0,A[o]-k);
}
while(nxt<n&&s[nxt].y<ans) {
q.offer(s[nxt].x);
nxt++;
}
if(o!=-1&&A[o]>0) {
q.offer(o);
}
while(nxt<n&&s[nxt].y<=ans) {
q.offer(s[nxt].x);
nxt++;
}
}
outn(ans-B[x]);
}
/*
*/
public static int readint() throws Exception{
reti=0;
neg=false;
while(rd<48||rd>57) {
rd=br.read();
if(rd=='-') {
neg=true;
}
}
while(rd>47&&rd<58) {
reti*=10;
reti+=(rd&15);
rd=br.read();
}
if(neg)reti*=-1;
return reti;
}
public static long readlong() throws Exception{
ret=0;
neg=false;
while(rd<48||rd>57) {
rd=br.read();
if(rd=='-') {
neg=true;
}
}
while(rd>47&&rd<58) {
ret*=10;
ret+=(rd&15);
rd=br.read();
}
if(neg)ret*=-1;
return ret;
}
public static int pint(String in) {
return Integer.parseInt(in);
}
public static long plong(String in) {
return Long.parseLong(in);
}
public static void outn() {
System.out.println();
}
public static void outn(long in) {
System.out.println(in);
}
public static void outn(boolean in) {
System.out.println(in);
}
public static void outn(String in) {
System.out.println(in);
}
public static void out(long in) {
System.out.print(in);
}
public static void out(boolean in) {
System.out.print(in);
}
public static void out(String in) {
System.out.print(in);
}
}
/*
*/
/*
*/
class Pii{
int x,y;
Pii(int a,int b){
x=a;
y=b;
}
@Override
public boolean equals(Object o) {
if (this==o) return true;
if (!(o instanceof Pii)) return false;
Pii key = (Pii) o;
return x==key.x&&y==key.y;
}
@Override
public int hashCode() {
long result=x;
result=31*result+y;
return (int)(result%998244353);
}
}
```
## J247. 111北二6a.不平衡配對數
解法:利用$BIT$維護前綴和,時間複雜度為$O(NlogC)$
```java=
/*
* Author: rickytsung
* Date: 2023/2/3
* Problem: ZJ
*/
import java.util.*;
import java.time.*;
import java.io.*;
import java.math.*;
public class Main{
public static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
public static BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
public static long ret,cnt;
public static int reti,rd,n,m,ans;
public static boolean neg,b1,b2,b3;
public static final int mod=998244353,mox=998244352,mod2=1_000_000_007,ma=200005;
public static Useful us=new Useful(mod);
public static int[] A=new int[ma];
public static int[] B=new int[ma];
public static long[] Al=new long[ma];
public static long[] Bl=new long[ma];
public static ArrayList<ArrayList<Integer>> E=new ArrayList<>();
public static void main(String[] args) throws Exception{
final int n=readint();
final int k=readint();
int in;
long ans=0;
for(int i=1;i<=n;i++) {
in=readint();
ans+=query(ma-1)-query(in*k);
update(in);
}
outn(ans);
}
public static void update(int x) {
for(int i=x;i<ma;i+=(i&(-i))) {
A[i]++;
}
}
public static int query(int r) {
int ret=0;
for(int i=r;i>0;i-=(i&(-i))) {
ret+=A[i];
}
return ret;
}
/*
*/
public static int readint() throws Exception{
reti=0;
neg=false;
while(rd<48||rd>57) {
rd=br.read();
if(rd=='-') {
neg=true;
}
}
while(rd>47&&rd<58) {
reti*=10;
reti+=(rd&15);
rd=br.read();
}
if(neg)reti*=-1;
return reti;
}
public static long readlong() throws Exception{
ret=0;
neg=false;
while(rd<48||rd>57) {
rd=br.read();
if(rd=='-') {
neg=true;
}
}
while(rd>47&&rd<58) {
ret*=10;
ret+=(rd&15);
rd=br.read();
}
if(neg)ret*=-1;
return ret;
}
public static int pint(String in) {
return Integer.parseInt(in);
}
public static long plong(String in) {
return Long.parseLong(in);
}
public static void outn() {
System.out.println();
}
public static void outn(long in) {
System.out.println(in);
}
public static void outn(boolean in) {
System.out.println(in);
}
public static void outn(String in) {
System.out.println(in);
}
public static void out(long in) {
System.out.print(in);
}
public static void out(boolean in) {
System.out.print(in);
}
public static void out(String in) {
System.out.print(in);
}
}
/*
*/
/*
*/
```
## J248. 111北二7a.驛站換馬、郵政系統
解法:待補
```java=
```
## J249.
解法:待補
```java=
```
## J250.
解法:待補
```java=
```