Skip to content

Commit b9c6ee4

Browse files
committed
add a few including gcj 2013 first round
1 parent 54c8cc4 commit b9c6ee4

19 files changed

+1846
-0
lines changed

cf/113/E2.cpp

+89
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
#include <iostream>
2+
#include <vector>
3+
#include <cstring>
4+
#include <cstdio>
5+
6+
using namespace std;
7+
8+
typedef long long int ll;
9+
10+
long long int dp[4][4];
11+
long long int bf[4][4];
12+
int N;
13+
14+
long long int MOD = 1000000007;
15+
16+
void multi(ll a[][4], ll b[][4], ll res[][4]){
17+
for(int i=0; i<4; i++){
18+
for(int j=0; j<4; j++){
19+
ll tmp = 0;
20+
for(int k=0; k<4; k++){
21+
tmp += a[i][k]*b[k][j];
22+
}
23+
res[i][j] = tmp%MOD;
24+
}
25+
}
26+
}
27+
28+
29+
void print(ll a[][4]){
30+
for(int i=0; i<4; i++){
31+
for(int j=0; j<4; j++){
32+
cout<<a[i][j]<<" ";
33+
}
34+
cout<<endl;
35+
}
36+
}
37+
38+
void mypow(ll input[][4], ll output[][4], int n){
39+
ll tmp[4][4];
40+
ll tmp2[4][4];
41+
memset(tmp, 0 , sizeof(tmp));
42+
memset(tmp2, 0, sizeof(tmp2));
43+
//cout<<"input is "<<endl;
44+
//print(input);
45+
if(n==1){
46+
for(int i=0; i<4; i++){
47+
for(int j=0; j<4; j++){
48+
output[i][j] = input[i][j];
49+
}
50+
}
51+
return ;
52+
}else if(n%2==1 && n>1){
53+
mypow(input, tmp, n/2);
54+
multi(tmp, tmp, tmp2);
55+
multi(input, tmp2, output);
56+
}else if(n%2==0 && n>0){
57+
mypow(input, tmp, n/2);
58+
multi(tmp, tmp, output);
59+
}
60+
}
61+
62+
63+
void work(){
64+
ll ans[4][4];
65+
memset(ans,0,sizeof(ans));
66+
mypow(dp, ans, N);
67+
//print(ans);
68+
69+
cout<<ans[3][3]<<endl;
70+
71+
}
72+
73+
74+
75+
int main(){
76+
cin>>N;
77+
for(int i=0; i<4; i++){
78+
for(int j=0;j<4; j++){
79+
if(i==j)continue;
80+
dp[i][j] = 1;
81+
}
82+
}
83+
work();
84+
85+
86+
87+
return 0;
88+
}
89+

cf/113/a.out

-3.32 KB
Binary file not shown.

cf/119/A.cpp

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#include <iostream>
2+
#include <set>
3+
#include <vector>
4+
5+
using namespace std;
6+
7+
const int MAXN = 5000;
8+
const int INF = 99999999;
9+
int dp[MAXN];
10+
int N;
11+
12+
13+
int main(){
14+
cin>>N;
15+
16+
set<int> d;
17+
for(int i=0; i<3; i++){
18+
int t;
19+
cin>>t;
20+
d.insert(t);
21+
}
22+
23+
for(int i=0; i<MAXN; i++)dp[i] = -INF;
24+
dp[0] = 0;
25+
26+
for(int i=0; i<=N; i++){
27+
if(dp[i]!=-INF){
28+
vector<int> tmp(d.begin(), d.end());
29+
for(int j=0; j<tmp.size(); j++){
30+
31+
for(int j=0; j<tmp.size(); j++){
32+
if(i+tmp[j]<=N){
33+
dp[i+tmp[j]] = max( dp[i]+1, dp[i+tmp[j]]);
34+
}
35+
}
36+
}
37+
}
38+
39+
}
40+
cout<<dp[N]<<endl;
41+
return 0;
42+
}
43+

cf/119/a.out

43.6 KB
Binary file not shown.

cf/134/B.cpp

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
#include <iostream>
2+
#include <queue>
3+
#include <vector>
4+
5+
using namespace std;
6+
7+
8+
int N, M;
9+
const int MAXN = 10001;
10+
int data[MAXN];
11+
12+
13+
int main(){
14+
cin>>N>>M;
15+
16+
priority_queue<int> max_Q;
17+
priority_queue<int, vector<int> , greater<int> > min_Q;
18+
19+
for(int i=0; i<M; i++){
20+
int t;
21+
cin>>t;
22+
max_Q.push(t);
23+
min_Q.push(t);
24+
}
25+
int cnt = N;
26+
int max_ans = 0;
27+
int min_ans = 0;
28+
while(cnt--){
29+
int cur = max_Q.top();
30+
max_Q.pop();
31+
max_ans += cur;
32+
cur -= 1;
33+
if(cur>0){
34+
max_Q.push(cur);
35+
}
36+
}
37+
38+
cnt = N;
39+
while(cnt--){
40+
int cur = min_Q.top();
41+
min_Q.pop();
42+
min_ans += cur;
43+
cur -= 1;
44+
if(cur>0){
45+
min_Q.push(cur);
46+
}
47+
}
48+
cout<<max_ans<<" "<<min_ans<<endl;
49+
50+
return 0;
51+
}
52+

cf/134/a.out

46.5 KB
Binary file not shown.

cf/169/B.cpp

+69
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
#include <iostream>
2+
#include <string>
3+
#include <cstring>
4+
5+
using namespace std;
6+
7+
string S;
8+
9+
bool dp[1<<26];
10+
int cnt[26];
11+
const int INF = 99999999;
12+
13+
int get_ans(int state){
14+
if(dp[state]!=INF){
15+
return dp[state];
16+
}
17+
int num = __builtin_popcount(state);
18+
if(num== 0 || num == 1){
19+
return 1;
20+
}
21+
int ok = 0;
22+
for(int i=0; i<26; i++){
23+
if( ((state>>i)&1)==1 ){
24+
int ns = (~(1<<i))&state;
25+
int ans = get_ans(ns);
26+
if(ans==0){
27+
ok = 1;
28+
}
29+
}
30+
}
31+
dp[state] = ok;
32+
return ok;
33+
}
34+
35+
36+
void work(){
37+
memset(cnt,0,sizeof(cnt));
38+
for(int i=0; i<S.size(); i++){
39+
cnt[ S[i]-'a' ] += 1;
40+
}
41+
int start = 0;
42+
for(int i=0; i<26; i++){
43+
if(cnt[i]%2==1){
44+
start |= (1<<i);
45+
}
46+
}
47+
for(int i=0; i<(1<<26); i++){
48+
dp[i] = INF;
49+
}
50+
int ans = get_ans(start);
51+
if(ans==1){
52+
cout<<"First"<<endl;
53+
}
54+
else{
55+
cout<<"Second"<<endl;
56+
}
57+
58+
59+
}
60+
61+
62+
63+
int main(){
64+
cin>>S;
65+
work();
66+
67+
return 0;
68+
}
69+

cf/169/C.cpp

+120
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
#include <iostream>
2+
#include <cstring>
3+
#include <queue>
4+
#include <algorithm>
5+
#include <cstdio>
6+
using namespace std;
7+
8+
9+
const int MAXN = 200001;
10+
11+
int trees[MAXN*8];
12+
int mark[MAXN*8];
13+
int data[MAXN];
14+
15+
int N, Q;
16+
17+
void pushUp(int idx){
18+
trees[idx] = trees[idx<<1] + trees[idx<<1|1];
19+
}
20+
21+
void pushDown(int idx){
22+
if(mark[idx]){
23+
//cout<<"now at "<<idx<<" and i'm pushing down"<<endl;
24+
mark[idx<<1] = mark[idx<<1|1] = mark[idx];
25+
trees[idx<<1] += trees[idx];
26+
trees[idx<<1|1] += trees[idx];
27+
28+
trees[idx] = 0;
29+
30+
mark[idx] = 0;
31+
}
32+
}
33+
34+
void insert(int L, int R, int l, int r, int idx){
35+
//cout<<"try to insert "<<L<<" "<<R<<" "<<l<<" "<<r<<endl;
36+
if(L<=l && R>=r){
37+
//cout<<"insert!"<<endl;
38+
trees[idx] += 1;
39+
//ncout<<" idx = "<<idx<<" cur = "<<trees[idx]<<endl;
40+
mark[idx] = 1;
41+
return ;
42+
}
43+
pushDown(idx);
44+
int m = (l+r)>>1;
45+
if(L<=m){
46+
insert(L, R, l, m, idx<<1);
47+
}
48+
if(R>m){
49+
insert(L, R, m+1, r, idx<<1|1);
50+
}
51+
//pushUp(idx);
52+
}
53+
54+
int query(int L, int R, int l, int r, int idx){
55+
if(L<=l && R>=r){
56+
return trees[idx];
57+
}
58+
pushDown(idx);
59+
int m = (l+r)>>1;
60+
if(L<=m){
61+
return query(L, R, l, m, idx<<1);
62+
}
63+
if(R>m){
64+
return query(L, R, m+1, r, idx<<1|1);
65+
}
66+
}
67+
68+
69+
void build(int l, int r, int idx){
70+
if(l==r){
71+
trees[idx] = 0;
72+
return ;
73+
}
74+
int m = (l+r)>>1;
75+
build(l, m, 2*idx);
76+
build(m+1, r, 2*idx + 1);
77+
pushUp(idx);
78+
}
79+
80+
81+
82+
83+
int main(){
84+
memset(trees,0,sizeof(trees));
85+
memset(mark, 0, sizeof(mark));
86+
scanf("%d %d", &N,&Q);
87+
88+
89+
//build(1, N, 1);
90+
for(int i=0; i<N; i++){
91+
scanf("%d",&data[i]);
92+
}
93+
94+
95+
int left, right;
96+
for(int i=0; i<Q; i++){
97+
//cout<<"inserting -> "<<i<<" tree[1] = "<<trees[1]<<endl;
98+
scanf("%d %d", &left, &right);
99+
insert(left, right, 1, N, 1);
100+
}
101+
long long int qts[MAXN];
102+
//cout<<"query 1 1 "<<query(1,1,1,N,1)<<endl;
103+
for(int i=0; i<N; i++){
104+
qts[i] = query(i+1, i+1, 1, N, 1);
105+
//cout<<"querying "<<i+1<<" res = "<<qts[i]<<endl;
106+
}
107+
sort(qts, qts+N, std::greater<int>());
108+
sort(data, data+N , std::greater<int>());
109+
long long int ans = 0;
110+
for(int i=0; i<N; i++){
111+
ans += (qts[i])*data[i];
112+
//cout<<"qts["<<i<<"] = "<<qts[i]<<" and data["<<i<<"] = "<<data[i]<<endl;
113+
}
114+
115+
116+
cout<<ans<<endl;
117+
118+
return 0;
119+
}
120+

cf/169/a.out

22.3 KB
Binary file not shown.

0 commit comments

Comments
 (0)