Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
GuoYuKai-SaMuEl committed Sep 25, 2024
1 parent d8cc6e2 commit 89d4d30
Show file tree
Hide file tree
Showing 5 changed files with 254 additions and 35 deletions.
137 changes: 132 additions & 5 deletions pB/gen/data
Original file line number Diff line number Diff line change
@@ -1,8 +1,135 @@
# see https://github.com/ioi-2017/tps/blob/master/docs/README.md#gendata
# TODO
@subtask samples
manual example-1.in
manual example-2.in

@subtask full
gen 20
gen 30
@subtask 1
gen 1 1
gen 1 2
gen 1 3
gen 1 4
gen 1 5
gen 1 6
gen 1 7
gen 1 8
gen 1 9
gen 1 10
gen 1 11
gen 1 12
gen 1 13
gen 1 14
gen 1 15
gen 1 16
gen 1 17
gen 1 18
gen 1 19
gen 1 20

@subtask 2
gen 2 21
gen 2 22
gen 2 23
gen 2 24
gen 2 25
gen 2 26
gen 2 27
gen 2 28
gen 2 29
gen 2 30
gen 2 31
gen 2 32
gen 2 33
gen 2 34
gen 2 35
gen 2 36
gen 2 37
gen 2 38
gen 2 39
gen 2 40

@subtask 3
gen 3 41
gen 3 42
gen 3 43
gen 3 44
gen 3 45
gen 3 46
gen 3 47
gen 3 48
gen 3 49
gen 3 50
gen 3 51
gen 3 52
gen 3 53
gen 3 54
gen 3 55
gen 3 56
gen 3 57
gen 3 58
gen 3 59
gen 3 60

@subtask 4
gen 4 61
gen 4 62
gen 4 63
gen 4 64
gen 4 65
gen 4 66
gen 4 67
gen 4 68
gen 4 69
gen 4 70
gen 4 71
gen 4 72
gen 4 73
gen 4 74
gen 4 75
gen 4 76
gen 4 77
gen 4 78
gen 4 79
gen 4 80

@subtask 5
gen 5 81
gen 5 82
gen 5 83
gen 5 84
gen 5 85
gen 5 86
gen 5 87
gen 5 88
gen 5 89
gen 5 90
gen 5 91
gen 5 92
gen 5 93
gen 5 94
gen 5 95
gen 5 96
gen 5 97
gen 5 98
gen 5 99
gen 5 100

@subtask 6
gen 6 101
gen 6 102
gen 6 103
gen 6 104
gen 6 105
gen 6 106
gen 6 107
gen 6 108
gen 6 109
gen 6 110
gen 6 111
gen 6 112
gen 6 113
gen 6 114
gen 6 115
gen 6 116
gen 6 117
gen 6 118
gen 6 119
gen 6 120
41 changes: 30 additions & 11 deletions pB/gen/gen.cpp
Original file line number Diff line number Diff line change
@@ -1,14 +1,33 @@
#include <bits/stdc++.h>
#include "testlib.h"
#include <bits/stdc++.h>
using namespace std;

int main(int argc, char* argv[]) {
registerGen(argc, argv, 1);
// about testlib, see https://codeforces.com/blog/entry/18291

// TODO
int n = atoi(argv[1]);
cout << n << endl;

return 0;
int way[105],t[15],a[105][15],b[105][15],c[105][15],shufa[105],shufb[15];
inline int randomint(double l,double r){
return pow(10.,rnd.next(l,r));
}
int main(int argc, char* argv[]){
registerGen(argc, argv, 1);
int subtask=atoi(argv[1]),idx=atoi(argv[2]);
int n=(idx%2?rnd.next(1,99):100),m=10;
cout<<n<<' '<<m<<'\n';
for(int i=0;i<n;i++)shufa[i]=i+1;
for(int i=0;i<m;i++)shufb[i]=i+1;
for(int i=0;i<n;i++)way[i]=(subtask==5?1:idx%3==1?10:rnd.next(1,10));
for(int i=0;i<n;i++)cout<<way[i]<<" \n"[i==n-1];
for(int i=0;i<m;i++)t[i]=randomint(0,9);
for(int i=0;i<m;i++)cout<<t[i]<<" \n"[i==m-1];
for(int i=0;i<n;i++)for(int j=0;j<way[i];j++){
a[i][j]=(subtask==1||subtask==2?0:subtask==3||subtask==4?1:rnd.next(0,min(n,10)));
cout<<a[i][j]<<' ';
shuffle(shufa,shufa+n);
for(int k=0;k<a[i][j];k++)cout<<shufa[k]<<' '<<rnd.next(1,10)<<" \n"[k==a[i][j]-1];
if(!a[i][j])cout<<'\n';
b[i][j]=(subtask==1||subtask==3?0:rnd.next(0,10));
cout<<b[i][j]<<' ';
shuffle(shufb,shufb+m);
for(int k=0;k<b[i][j];k++)cout<<shufb[k]<<" \n"[k==b[i][j]-1];
if(!b[i][j])cout<<'\n';
c[i][j]=rnd.next(0,100);
cout<<c[i][j]<<'\n';
}
}
51 changes: 43 additions & 8 deletions pB/solution/correct.cpp
Original file line number Diff line number Diff line change
@@ -1,28 +1,63 @@
#include<bits/stdc++.h>
using namespace std;
int way[105],t[15],a[105][15],b[105][15],c[105][15],x[105][15][15],y[105][15][15],z[105][15][15],in[105][15];
long long int dis[105][15];
long long int dis[105][15],now[105],ans[105];
vector<pair<int,int>>out[105];
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>way[i];
for(int i=1;i<=m;i++)cin>>t[i];
for(int i=1;i<=n;i++){
ans[i]=1e15;
for(int j=1;j<=way[i];j++){
cin>>a[i][j];
for(int k=1;k<=a[i][j];k++)cin>>x[i][j][k]>>y[i][j][k];
for(int k=1;k<=a[i][j];k++){
cin>>x[i][j][k]>>y[i][j][k];
out[x[i][j][k]].push_back({i,j});
}
cin>>b[i][j];
for(int k=1;k<=b[i][j];k++)cin>>z[i][j][k];
cin>>c[i][j];
}
}
for(int p=0;p<(1<<m);p++){
for(int i=1;i<=n;i++)for(int j=1;j<=way[i];j++){
dis[i][j]=1e15;
in[i][j]=a[i][j];
for(int k=1;k<=b[i][j];k++)if(~p&(1<<(z[i][j][k]-1)))in[i][j]++;

for(int per=0;per<(1<<m);per++){
cout<<per<<'\n';
for(int i=1;i<=n;i++){
now[i]=1e15;
for(int j=1;j<=way[i];j++){
dis[i][j]=1e15;
in[i][j]=a[i][j];
for(int k=1;k<=b[i][j];k++)if((~per)&(1<<(z[i][j][k]-1)))in[i][j]++;
cout<<i<<' '<<j<<' '<<in[i][j]<<'\n';
}
}
queue<pair<int,int>>qu;//store the (item_id,way_id) which can be maken
set<pair<int,int>>se;//store the (dis,item_id) whose shortest time is determined and can do Dijkstra
for(int i=1;i<=n;i++)for(int j=1;j<=way[i];j++)if(!in[i][j])qu.push({i,j});
while(se.size()||qu.size()){
while(qu.size()){
auto [i,j]=qu.front();
qu.pop();
dis[i][j]=c[i][j];
for(int k=1;k<=a[i][j];k++){
dis[i][j]+=now[x[i][j][k]]*y[i][j][k];
}
if(dis[i][j]>=1e15)dis[i][j]=1e15;
else se.insert({dis[i][j],i});
}
if(se.empty())continue;
auto [temp,i]=*se.begin();
se.erase(se.begin());
if(now[i]!=1e15)continue;
now[i]=temp;
for(auto p:out[i]){
if(--in[p.first][p.second]==0)qu.push(p);
}
}
long long int tsum=0;
for(int i=1;i<=m;i++)if(per&(1<<(i-1)))tsum+=t[i];
for(int i=1;i<=n;i++)ans[i]=min(ans[i],now[i]+tsum);
}
for(int i=1;i<=n;i++)cout<<ans[i]<<'\n';
}
24 changes: 16 additions & 8 deletions pB/statement/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,15 @@
另外功能方塊的取得方法,雖然正常來說也必須透過合成,但為了簡化遊戲,在早期版本直接設定可以花費 $t_i$ 即可取得功能方塊 $i$。

現在,身為speedrunner的你想要挑戰用最快的速度達到遊戲中的里程碑,因此你想知道對於每一種物品,理論上最快可以取得一件該物品的時間為何?\
請注意,如果該物品無論如何都無法合成的話,請輸出 $-1$。另外如果最小取得時間超過 $10^{15}$ 秒的話,由於沒有那麼多時間玩遊戲,因此也視為無法拿到,輸出 $-1$。
請注意,如果該物品無論如何都無法合成的話,請輸出 $-1$。另外如果最小取得時間大於等於 $10^{15}$ 秒的話,由於沒有那麼多時間玩遊戲,因此也視為無法拿到,輸出 $-1$。

\clearpage

## 輸入
輸入的第一行包含兩個正整數 $n,m$,分別代表物品的種類數、功能方塊的種類數。\
第二行包含 $n$ 個正整數 $way_1,way_2,...,way_n$,代表每種物品的合成方法數。\
第三行包含 $m$ 個非負整數 $t_1,t_2,...,t_m$,代表每種功能方塊的取得所需時間。注意由於 $m$ 可能為 $0$,因此該行可能為空。\
接下來對於每種物品 $i$ 有 $way_i$ 種物品的合成方式,每種合成方式包含四行。其中的第一行的開頭有一個非負整數 $a_{i,j}$,接著有 $a_{i,j}$ 組正整數 $x_{i,j,k}$ $y_{i,j,k}$,代表消耗的物品種類編號、數量;其中的第二行的開頭有一個非負整數 $b_{i,j}$,接著有 $b_{i,j}$ 個正整數 $z_{i,j,k}$,代表需要的功能方塊編號;其中的第三行有一個非負整數 $c_{i,j}$,代表此種合成方式需要的時間。\
接下來對於每種物品 $i$ 有 $way_i$ 種物品的合成方式,每種合成方式包含三行。其中的第一行的開頭有一個非負整數 $a_{i,j}$,接著有 $a_{i,j}$ 組正整數 $x_{i,j,k}$ $y_{i,j,k}$,代表消耗的物品種類編號、數量;其中的第二行的開頭有一個非負整數 $b_{i,j}$,接著有 $b_{i,j}$ 個正整數 $z_{i,j,k}$,代表需要的功能方塊編號;其中的第三行有一個非負整數 $c_{i,j}$,代表此種合成方式需要的時間。\

簡而言之,輸入格式如下。\
$n$ $m$\
Expand Down Expand Up @@ -55,26 +55,34 @@ $c_{n,way_n}$
\clearpage

## 輸出
輸出 $n$ 行,每行包含一個非負整數,第 $i$ 行代表對於物品 $i$,取得 $1$ 個所需的最短時間,對於無法合成或所需最短時間超過 $10^{15}$ 的物品輸出 $-1$。
輸出 $n$ 行,每行包含一個非負整數,第 $i$ 行代表對於物品 $i$,取得 $1$ 個所需的最短時間,對於無法合成或所需最短時間大於等於 $10^{15}$ 的物品輸出 $-1$。

## 輸入限制
- $1\le n\le 100$
- $0\le m\le 10$
- $1\le way_i\le 10$
- $0\le t_i\le 10^9$
- $0\le a_{i,j}\le min(n,10)$
- $0\le b_{i,j}\le m$
- $0\le c_{i,j},t_i\le 100$
- $0\le c_{i,j}\le 100$
- $1\le x_{i,j,k}\le n$
- $1\le y_{i,j,k}\le 10$
- $1\le z_{i,j,k}\le m$
- 對於任意 $d\ne e$ 有 $x_{i,j,d}\ne x_{i,j,e}$ 與 $z_{i,j,d}\ne z_{i,j,e}$

<!-- ## 子任務
## 子任務
\subtasks

\clearpage

## 範例輸入
## 範例輸入1
\testfile{0-01.in}

## 範例輸出
\testfile{0-01.out} -->
## 範例輸出1
\testfile{0-01.out}

## 範例輸入2
\testfile{0-02.in}

## 範例輸出2
\testfile{0-02.out}
36 changes: 33 additions & 3 deletions pB/subtasks.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"global_validators": [
"validator.cpp"

],
"subtasks": {
"samples": {
Expand All @@ -9,9 +9,39 @@
"text": "範例輸入輸出",
"validators": []
},
"full": {
"1": {
"index": 1,
"score": 100,
"score": 6,
"text": "所有 $a_{i,j}=b_{i,j}=0$",
"validators": []
},
"2": {
"index": 2,
"score": 10,
"text": "所有 $a_{i,j}=0$",
"validators": []
},
"3": {
"index": 3,
"score": 10,
"text": "所有 $a_{i,j}=1,b_{i,j}=0$",
"validators": []
},
"4": {
"index": 4,
"score": 14,
"text": "所有 $a_{i,j}=1$",
"validators": []
},
"5": {
"index": 5,
"score": 20,
"text": "所有 $way_i=1$",
"validators": []
},
"6": {
"index": 6,
"score": 40,
"text": "無額外限制",
"validators": []
}
Expand Down

0 comments on commit 89d4d30

Please sign in to comment.