2023年杭電暑期多校(第四場)

2021-09-25 18:38:56 字數 4474 閱讀 3223

題意

給定乙個4*4的矩陣,按照8數碼一樣的移動方式,問能否在120步內移動到目標狀態。

思路

雖然我不知道怎麼證明,反正如果兩個狀態能夠互相到達,那麼所需步數最多只需要46步。那麼只需要求兩個狀態能否互相到達就好了。

n*m的數碼問題有乙個結論:

1.假如m是奇數,那麼上下交換會改變(m-1)也就是偶數次逆序數,左右交換(空格和左右交換)不改變逆序數,因此逆序數的奇偶性不變,此時兩狀態的奇偶性一致即有解

2.假如m是偶數,上下交換會改變奇數次逆序數,左右交換不改變逆序數,因此逆序數奇偶性會因上下交換而改變,此時逆序數之差和兩個局面下空格所在行數之差

的奇偶性相同即有解。

但是,這裡所指的逆序數是不計算0的!!!!

也就是除空格外,剩下數的逆序數之差才是我們要求的東西,網上沒有一篇部落格講到這個,還有很多部落格講的結論根本就是錯的。

#include

#include

#include

#include

#include

#include

#define lson node<<1

#define rson node<<1|1

using namespace std;

typedef

long

long ll;

const

int maxn =20;

const

int mod =

1e9+7;

const ll inf=

1e18-1

;int a[maxn]

,temp[maxn]

;long

long sum=0;

void

merge

(int l,

int r,

int m)

else

}while

(i<=m)

temp[k++

]= a[i++];

while

(j<=r)

temp[k++

]= a[j++];

for(i = l;i<=r;i++

) a[i]

= temp[i];}

void

mergesort

(int l,

int r)

}int

main()

} sum=0;

mergesort(1

,15);

if(st%

2==sum%2)

printf

("yes\n");

else

printf

("no\n");

}}

題意

求[ l,

r]

[l,r]

[l,r]內∣p−

a[i]

∣|p-a[i]|

∣p−a[i

]∣的第k小

題解

第k小肯定是主席樹了,但是這裡的絕對值很麻煩,看完題解才明白是個很巧妙的方法。我們二分答案ans,對於[p−

ans,

p+an

s]

[p-ans,p+ans]

[p−ans

,p+a

ns]的值區間求區間和,如果數量大於等於k說明第k小一定在這個區間內,然後可以縮小ans繼續查詢就能得到答案。

主席樹的板子錯了改了一天bug,真的沒想到錯掉的板子還能過洛谷的模板題。

#include

using namespace std;

typedef

long

long ll;

const

int maxn =

1e5+20;

int lson[maxn *30]

, rson[maxn *30]

, tree[maxn *30]

;int a[maxn]

, ha[maxn]

;int t[maxn]

;int n, q, len, tot;

void

init()

intgethash

(int x)

intbuild

(int l,

int r)

return rt;

}int

update

(int rt,

int pos,

int val)

else

tree[newroot]

= tree[rt]

+ val;

}return temp;

}int

query

(int rt,

int l,

int r,

int ql,

int qr)

int mid =

(l + r)

>>1;

int ans =0;

if(ql<=mid)

if(qr>mid)

return ans;

}bool check

(int st,

int end,

int temp,

int p,

int k)

else

}int

main()

init()

; t[0]

=build(1

, len)

;for

(int i=

1;i<=n;i++

)// for (int i = 1; i <= n; i++)

// int x=

0,l,r,p,k;

for(

int i =

1; i <= q;i++

)else

}printf

("%d\n"

,x);}}

}

題意

求1e18以內的n的質因子分解的最小次冪

思路

看到這題就懵了啊,1e18的大小,還有5e4的t,結果才知道原來沒那麼複雜,先預處理出1e4內的素數(大概1e3個),然後對n先進行質因子分解,記錄一下最小值,然後如果n還是大於1,那麼就意味著,這個數還可以被大於1e4的質數分解,而這個質數的冪次最多是4,因為1e4的5次方已經超過1e18了。

設p,q為大於1e4的質數

則n =p

4,p3

,p2,

p2∗q

2n=p^4,p^3,p^2,p^2*q^2

n=p4,p

3,p2

,p2∗

q2除了這幾種情況當然還有別的,但是那些情況的答案都為1了。

所以只需要對n求4,3,2次方根,看看是否存在正整數解,這樣就可以推出是否是上面那幾種情況了。對於開三次方根,用pow有精度損失,所以要用二分。

#include

#include

#include

#include

#include

#include

#define lson node<<1

#define rson node<<1|1

using namespace std;

typedef

long

long ll;

const

int maxn =

1e4;

const ll inf=

(ll)

(2e5)*

(ll)

(1e9)+

900;

inline

intmin

(int a,

int b)

int prime[maxn+10]

;void

getprime()

}}intfind

(ll n)

//求是否是某個數的三次方

return0;

}int

slove

(ll n)

ans=

min(ans,t);}

}int u1=

sqrt

(n);

int u2=

sqrt

(u1);if

(n==1)

elseif(

1ll*u2*u2*u2*u2==n)

elseif(

find

(n))

elseif(

1ll*u1*u1==n)

else

}int

main()

}

20190731杭電多校第四場

貪心。對於每個數,找二進位制形式下末尾連續1的數量,若為i,則可連到數字2 i 1 若2 i 1 不存在,則連到1最優。ac using namespace std includeint t,n,i,x int a 200001 long long sum,ans int main if sum n...

杭電多校第四場1002

給定n種 每種 有傷害值和冷卻時間。a,b兩人需要在遊戲開始前選擇一種 一直使用直至遊戲結束。a可以自行挑選,b隨機選擇。a,b初始都有100hp 兩人中任意一人死亡遊戲結束,如果同時死亡則各有一半的勝率。問 在最優選擇下,a的獲勝期望是多少?預處理出所有 擊殺對方需要的時間。a選擇其中一種,那麼b...

2019湖南多校第四場

開場lfw過a,然後shl過c,然後把b題丟給做苦力勞動悲悲傷傷的lfw寫,lfw過b,d題lfw開始字串hash,一開始直接用結構體裡面存陣列丟set裡面然後mle,之後改成long long丟進set,還是mle,然後lfw開始上頭,隨便亂改一下就交上去mle。然後shl吧防ak題k過了,做過這...