BestCoder

已解决题目列表
[xiaoxin juju needs help][1]
[India and China Origins][2]
Read more

BestCoder

已解决题目列表
[King’s Cake][1]
[King’s Phone][2]
[King’s Order][3]
[King’s Game][1]
Read more

BestCoder

已解决题目列表
[Rikka with Chess][1]
[Rikka with Graph][2]
Read more

BestCoder

已解决题目列表
[Clarke and chemistry][1]
[Clarke and points][2]
Read more

BestCoder

已解决题目列表
[KK’s Steel][1]
[KK’s Point][2]
[KK’s Number][3]
Read more

BestCoder

Solved Problems
ZYB’s Biology
ZYB’s Game
ZYB’s Premutation

ZYB’s Biology

平淡无奇的匹配

ZYB’s Game

惊异于“最优策略”的选取,最终结果竟与奇偶性挂钩。

ZYB’s Premutation

常规题型,旧题重演,竟然跑偏了。
半年多前的某基础题的逆向问题。
同样用线段树或树状数组解决,关键是实现查找第k大的数、删除第k大的数并维护。也有基于查询数的更抽象高效的解法。
树状数组:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
/**
* Dec 5, 2015 8:39:53 PM
* PrjName: 1205-03-2
* @semprathlon
*/
import java.io.*;
import java.util.*;
public class Main {
static int[] a,f;
static BIT tr;
static HashSet<Integer> st=new HashSet<Integer>();
static void print(int[] a,PrintWriter out){
int n=a.length-1;
for(int i=1;i<=n;i++)
out.print(a[i]+(i<n?" ":""));
out.println();
}
public static void main(String[] args) throws IOException{
InputReader in=new InputReader(System.in);
PrintWriter out=new PrintWriter(System.out);
int T=in.nextInt();
// tr=new BIT(5);
// out.print(tr.lowbit(2));
while(T-->0){
int n=in.nextInt();
a=new int[n+1];
f=new int[n+1];
tr=new BIT(n);
for(int i=1;i<=n;i++){
f[i]=in.nextInt();
tr.add(i, 1);
}

for(int i=n;i>=1;i--){
f[i]-=f[i-1];
int tmp=tr.find(i-f[i]-1);
// out.println(i+","+f[i]+","+tmp);
a[i]=tmp;
tr.add(tmp, -1);
}
print(a, out);
}
out.flush();
out.close();
}
}
class BIT{
int[] data;
int sz;
BIT(){}
BIT(int _sz){
sz=_sz;
data=new int[sz+1];
}
int lowbit(int x){
return x&(-x);
}
void add(int p,int v){
while(p<=sz){
data[p]+=v;
p+=lowbit(p);
}
}
int sum(int p){
int res=0;
while(p>0){
res+=data[p];
p-=lowbit(p);
}
return res;
}
int find(int p){
int l=1,r=sz;
while(l<r){
int mid=(l+r)>>1;
if (sum(mid)<=p)
l=mid+1;
else
r=mid;
}

return l;
}
}

线段树:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/**
* Dec 6, 2015 4:42:31 PM
* PrjName: 1205-03-3
* @semprathlon
*/
import java.io.*;
import java.util.*;
public class Main {
static int[] a,f;
static ST tr;
static HashSet<Integer> st=new HashSet<Integer>();
static void print(int[] a,PrintWriter out){
int n=a.length-1;
for(int i=1;i<=n;i++)
out.print(a[i]+(i<n?" ":""));
out.println();
}
public static void main(String[] args) throws IOException{
InputReader in=new InputReader(System.in);
PrintWriter out=new PrintWriter(System.out);
int T=in.nextInt();
while(T-->0){
int n=in.nextInt();
a=new int[n+1];
f=new int[n+1];
tr=new ST(n);
tr.build(1, 1, n);
for(int i=1;i<=n;i++)
f[i]=in.nextInt();

for(int i=n;i>=1;i--){
f[i]-=f[i-1];
int tmp=tr.query(1, 1, n, f[i]+1);
// out.println(i+","+f[i]+","+tmp);
a[i]=tmp;

}
print(a, out);
}
out.flush();
out.close();
}
}
class ST{
int[] l,r,m,v;
int sz;
ST(){}
ST(int _sz){
sz=_sz<<2;
l=new int[sz];
r=new int[sz];
m=new int[sz];
v=new int[sz];
}
void build(int k,int x,int y){
l[k]=x;r[k]=y;m[k]=(x+y)>>1;
if (x<y){
build(k<<1,x,m[k]);
build(k<<1|1,m[k]+1,y);
}
v[k]=y-x+1;
}
int query(int k,int x,int y,int q){
if (l[k]==r[k]){
v[k]=0;
return l[k];
}
int res=0;
if (v[k<<1|1]>=q)
res=query(k<<1|1, m[k]+1, y, q);
else
res=query(k<<1,x,m[k],q-v[k<<1|1]);
v[k]=v[k<<1]+v[k<<1|1];
return res;
}

}

BestCoder

Solved Problems To be solved
Numbers Array
Sum

Numbers

没话可说。

Sum

基础一维DP的变异

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/**
* Nov 28, 2015 8:04:23 PM
* PrjName: Bc64-02
* @semprathlon
*/
import java.io.*;
import java.util.*;
public class Main {
static int[] a,s,f;
static int fn(int x){
return (1890*x+143)%10007;
}
public static void main(String[] args) throws IOException{
InputReader in=new InputReader(System.in);
PrintWriter out=new PrintWriter(System.out);
while(in.nextLine()!=null){
int n=in.nextInt();
a=new int[n+1];
s=new int[n+1];
f=new int[n+1];
for(int i=1;i<=n;i++){
a[i]=in.nextInt();
s[i]=s[i-1]+a[i];
}
int ans=s[n];
for(int i=1;i<=n;i++){
f[i]=Math.max(f[i-1]+fn(a[i]), s[i]);
ans=Math.max(ans, f[i]+s[n]-s[i]);
}
out.println(ans);
}
out.flush();
out.close();
}

}

Bestcoder

Solved Problems
Clarke and food
Clarke and five-pointed star

Clarke and food

非常轻易地完成填充。

Clarke and five-pointed star

辛辛苦苦地敲完了又挂了。。。

我这里独立思考得到的结论是:
以五角星的一个顶点为参考点,则该点必在其他四点所构成的四边形之外,且其他四点相对于该点所成的张角之和是确定的;尽管随着所取的四个点的顺序不同会有不同的值,但也仅有三种情况。
可是测样例数据时不知怎的多加了一个待判值,结果WA了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/**
* Nov 14, 2015 7:35:56 PM
* PrjName: Bc62-02
* @semprathlon
*/
import java.io.*;
import java.util.*;
public class Main {
static Point[] pt=new Point[5];
static PrintWriter out=new PrintWriter(System.out);
static boolean check1(){
return !Point.isPointInRect(pt[0], pt[1], pt[2], pt[3], pt[4])&&
!Point.isPointInRect(pt[1], pt[2], pt[3], pt[4], pt[0])&&
!Point.isPointInRect(pt[2], pt[3], pt[4], pt[0], pt[1])&&
!Point.isPointInRect(pt[3], pt[4], pt[0], pt[1], pt[2])&&
!Point.isPointInRect(pt[4], pt[0], pt[1], pt[2], pt[3]);
}
static boolean check0(Point p,Point a,Point b,Point c,Point d){
double v1=Math.acos(-1.0)/5.0,v2=v1*2.0,v3=v1*3.0;
double angle=Vector.angle2(p, a, b)+Vector.angle2(p, b, c)+Vector.angle2(p, c, d);
angle=Math.abs(angle);
// out.println(v1+","+v2+","+v3+","+angle);
return Point.dcmp(angle-v1)==0||Point.dcmp(angle-v2)==0||Point.dcmp(angle-v3)==0;
}
static boolean check2(){
return check0(pt[0], pt[1], pt[2], pt[3], pt[4])&&
check0(pt[1], pt[2], pt[3], pt[4], pt[0])&&
check0(pt[2], pt[3], pt[4], pt[0], pt[1])&&
check0(pt[3], pt[4], pt[0], pt[1], pt[2])&&
check0(pt[4], pt[0], pt[1], pt[2], pt[3]);
}
public static void main(String[] args) throws IOException{
InputReader in=new InputReader(System.in);

int T=in.nextInt();
while(T-->0){
for(int i=0;i<5;i++)
pt[i]=new Point(in.nextDouble(), in.nextDouble());
if (pt[0].equals(pt[1])&&pt[1].equals(pt[2])&&pt[2].equals(pt[3])&&pt[3].equals(pt[4])&&pt[4].equals(pt[0])){
out.println("Yes");continue;
}
out.println(check2()?"Yes":"No");
}
out.flush();
out.close();
}
}