2017年2月に四国に行きました。そのとき撮った写真のうち、見せたいものをただひたすら張り続けます。
番号が汚い
ラスボスがいそう
高松からは離島行きフェリーがたくさんある
セルフの醍醐味
さぬきうどん駅
徳島。駅の隣に山がある
サラダ
阿波池田。寂しすぎる
大歩危峡
ゆるして
日本一駅間が短い
はりまや橋
土佐湾
大都会予土線
四万十川
半家 はげ
四国一箇所巡り
願い事
ごはん
おまけ
B: flagpoles
差を取ると本当に簡単。
long long p[11000000];
long long lf[210];
long long lv[210];
long long rf[210];
long long rv[210];
long long sv[210];
int main(){
int T=NumberOfNodes();
int I=MyNodeId();
int N=GetNumFlagpoles();
if(N<=2){
if(I==0){
printf("%d\n",N);
}
return 0;
}
N--;
if(N<T){
T=N;
if(I>=T)return 0;
}
int L=(long long)N*I/T;
int R=(long long)N*(I+1)/T;
int n=R-L;
long long now=GetHeight(L);
for(int i=0;i<n;i++){
long long tmp=GetHeight(i+1+L);
p[i]=tmp-now;
now=tmp;
}
long long left=0;
long long right=0;
for(int i=0;i<n;i++){
if(p[i]==p[0])left++;
else break;
}
for(int i=0;i<n;i++){
if(p[n-1-i]==p[n-1])right++;
else break;
}
long long ma=0;
long long val=0;
for(int i=0;i<n;i++){
if(i==0||p[i]==p[i-1]){
val++;
}else{
val=1;
}
ma=max(ma,val);
}
if(I==0){
lf[0]=p[0];
lv[0]=left;
rf[0]=p[n-1];
rv[0]=right;
sv[0]=ma;
for(int i=1;i<T;i++){
Receive(i);
lv[i]=GetLL(i);
lf[i]=GetLL(i);
rv[i]=GetLL(i);
rf[i]=GetLL(i);
sv[i]=GetLL(i);
}
long long ret=0;
long long nc=0;
long long nl=0;
for(int i=0;i<T;i++){
ret=max(ret,sv[i]);
if(nc==lf[i]){
ret=max(ret,nl+lv[i]);
}else{
nl=0;
nc=rf[i];
}
long long TL=(long long)N*i/T;
long long TR=(long long)N*(i+1)/T;
if(TR-TL==lv[i]){
nl+=lv[i];
}else{
nl=rv[i];
nc=rf[i];
}
ret=max(ret,nl);
}
printf("%lld\n",ret+1);
}else{
PutLL(0,left);
PutLL(0,p[0]);
PutLL(0,right);
PutLL(0,p[n-1]);
PutLL(0,ma);
Send(0);
}
}
C: number_bases
事前にくり上がりがある場合ない場合どっちも用意しておく。
int X[1100000];
int Y[1100000];
int Z[1100000];
int LL[210][2];
int RR[210][2];
int DD[210][2];
int KK[210][2];
int main(){
int T=NumberOfNodes();
int I=MyNodeId();
int N=GetLength();
if(N<T){
T=N;
if(I>=T)return 0;
}
int L=(long long)N*I/T;
int R=(long long)N*(I+1)/T;
int n=R-L;
for(int i=0;i<n;i++){
X[i]=GetDigitX(i+L);
Y[i]=GetDigitY(i+L);
Z[i]=GetDigitZ(i+L);
}
int DL=0;
int DR=-1;
int dame=0;
int KR=0;
for(int i=0;i<n;i++){
DL=max(max(DL,Z[i]+1),max(X[i]+1,Y[i]+1));
if(KR+X[i]+Y[i]>Z[i]){
int nr=KR+X[i]+Y[i]-Z[i];
if(DR==-1||DR==nr){
DR=nr;
}else{
dame=1;
}
KR=1;
}else if(KR+X[i]+Y[i]==Z[i]){
KR=0;
}else{
dame=1;
}
}
if(DR!=-1&&DR<DL)dame=1;
LL[I][0]=DL;
RR[I][0]=DR;
DD[I][0]=dame;
KK[I][0]=KR;
DL=0;
DR=-1;
dame=0;
KR=1;
for(int i=0;i<n;i++){
DL=max(max(DL,Z[i]+1),max(X[i]+1,Y[i]+1));
if(KR+X[i]+Y[i]>Z[i]){
int nr=KR+X[i]+Y[i]-Z[i];
if(DR==-1||DR==nr){
DR=nr;
}else{
dame=1;
}
KR=1;
}else if(KR+X[i]+Y[i]==Z[i]){
KR=0;
}else{
dame=1;
}
}
if(DR!=-1&&DR<DL)dame=1;
LL[I][1]=DL;
RR[I][1]=DR;
DD[I][1]=dame;
KK[I][1]=KR;
if(I==0){
for(int i=1;i<T;i++){
Receive(i);
for(int j=0;j<2;j++){
LL[i][j]=GetInt(i);
RR[i][j]=GetInt(i);
DD[i][j]=GetInt(i);
KK[i][j]=GetInt(i);
}
}
bool ok=true;
int dl=0;
int dr=-1;
int kr=0;
for(int i=0;i<T;i++){
if(DD[i][kr]){
ok=false;break;
}
dl=max(dl,LL[i][kr]);
if(dr!=-1&&dr!=RR[i][kr]&&RR[i][kr]!=-1){
ok=false;
}else if(RR[i][kr]!=-1)dr=RR[i][kr];
kr=KK[i][kr];
}
if(kr)ok=false;
if(dr!=-1&&dl>dr)ok=false;
if(!ok){
printf("IMPOSSIBLE\n");
}else{
if(dr==-1)printf("NON-UNIQUE\n");
else printf("%d\n",dr);
}
}else{
for(int i=0;i<2;i++){
PutInt(0,LL[I][i]);
PutInt(0,RR[I][i]);
PutInt(0,DD[I][i]);
PutInt(0,KK[I][i]);
}
Send(0);
}
}
D: broken_memory
落ちた。不必要にデータを送りすぎた。(700回ですむところを調子に乗って送りまくってしまった)
E: nanobots
smallは分割統治であることは有名。largeはたくさんスライスしてランダムに割り振ってsmallと同じことをする。
const long long mod=1000000007;
long long ret=0;
void count(long long L,long long R,long long lm,long long rm){
if(L>=R)return;
if(lm>rm)return;
if(Experiment(R-1,rm)=='T'){
ret=(ret+((R-L)%mod)*((rm)%mod))%mod;
return;
}
if(Experiment(L,lm)=='E')return;
long long M=(L+R)/2;
long long left=lm-1;
long long right=rm+1;
while(left+1<right){
long long mid=(left+right)/2;
if(Experiment(M,mid)=='T'){
left=mid;
}else right=mid;
}
ret=(ret+left)%mod;
count(L,M,max(1LL,left),rm);
count(M+1,R,lm,left);
}
int main(){
int T=NumberOfNodes();
int I=MyNodeId();
int N=GetNumNanobots();
long long R=GetRange();
int BK=min((long long)R,2000000LL);
srand(1145141919);
for(int i=0;i<BK;i++){
int tmp=rand();
long long left=R*i/BK+1;
long long right=R*(i+1)/BK+1;
if(tmp%T==I){
count(left,right,1,R);
}
}
if(I==0){
for(int i=1;i<T;i++){
Receive(i);
long long tmp=GetLL(i);
ret=(ret+tmp)%mod;
}
printf("%lld\n",ret);
}else{
PutLL(0,ret);
Send(0);
}
}
21位。なんで通ったんだろう。アイルランドでも頑張ります。