題意
給定乙個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過了,做過這...