mirror of
https://gitcode.com/Zengtudor/alg2025.git
synced 2025-10-25 17:42:46 +00:00
feat: 添加P7960和P7961题解并优化P5835代码
添加两道新题目的解决方案: 1. P7960.cpp实现数字7相关筛选算法 2. P7961.cpp实现组合数学问题的DFS解法 优化P5835.cpp的逆序对计算: - 修改合并排序的比较条件 - 改进权重分配逻辑 - 增加代码可读性和注释
This commit is contained in:
parent
f85c0df2f1
commit
a339d17df5
@ -4,6 +4,7 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <istream>
|
#include <istream>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
#include <string>
|
||||||
#include <unordered_set>
|
#include <unordered_set>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
using ll = int64_t;
|
using ll = int64_t;
|
||||||
@ -29,7 +30,7 @@ static inline ll merge(std::vector<ll>&num,std::vector<ll>&tmp,ll l,ll mid,ll r)
|
|||||||
ll cnt=0;
|
ll cnt=0;
|
||||||
ll i=l,j=mid+1,k=l;
|
ll i=l,j=mid+1,k=l;
|
||||||
while(i<=mid&&j<=r){
|
while(i<=mid&&j<=r){
|
||||||
if(num[i]<=num[j]){
|
if(num[i]<num[j]){
|
||||||
tmp[k++]=num[i++];
|
tmp[k++]=num[i++];
|
||||||
}else{
|
}else{
|
||||||
cnt+= mid-i+1;
|
cnt+= mid-i+1;
|
||||||
@ -77,9 +78,14 @@ int main(){
|
|||||||
}
|
}
|
||||||
std::sort(dis+1,dis+1+n);
|
std::sort(dis+1,dis+1+n);
|
||||||
ll outweight=0;
|
ll outweight=0;
|
||||||
ll pout=0;
|
ll pout=0,lout=1,rout=n;
|
||||||
for(ll i=1;i<=n;i++){
|
for(ll i=1;i<=n;i++){
|
||||||
outweight+=c[dis[i].idx].w;
|
if(c[dis[i].idx].d==1){
|
||||||
|
outweight+=c[rout--].w;
|
||||||
|
}else{
|
||||||
|
outweight+=c[lout++].w;
|
||||||
|
}
|
||||||
|
// outweight+=c[dis[i].idx].w;
|
||||||
// printf("%lld is out\n",c[dis[i].idx].x);
|
// printf("%lld is out\n",c[dis[i].idx].x);
|
||||||
pout=dis[i].d;
|
pout=dis[i].d;
|
||||||
vis.emplace(dis[i].idx);
|
vis.emplace(dis[i].idx);
|
||||||
@ -95,8 +101,9 @@ int main(){
|
|||||||
// std::cout<<"\n";
|
// std::cout<<"\n";
|
||||||
after.push_back(0);
|
after.push_back(0);
|
||||||
for(ll i=1;i<=n;i++){
|
for(ll i=1;i<=n;i++){
|
||||||
after.push_back(c[i].x+c[i].d*pout);
|
ll na=c[i].x+c[i].d*pout;
|
||||||
|
after.push_back(na);
|
||||||
}
|
}
|
||||||
|
const ll ans = mergesort(after, tmp, 1, n);
|
||||||
std::cout<<mergesort(after, tmp, 1, n)<<"\n";
|
std::cout<<ans<<"\n";
|
||||||
}
|
}
|
||||||
44
src/10/23/P7960.cpp
Normal file
44
src/10/23/P7960.cpp
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
#include <bitset>
|
||||||
|
#include <cstdint>
|
||||||
|
#include <iostream>
|
||||||
|
#include <istream>
|
||||||
|
#include <string>
|
||||||
|
using ll = int64_t;
|
||||||
|
|
||||||
|
const ll maxn = 1e7+7;
|
||||||
|
std::bitset<maxn> isnot;
|
||||||
|
ll nxtpos[maxn];
|
||||||
|
|
||||||
|
int main(){
|
||||||
|
std::iostream::sync_with_stdio(false);
|
||||||
|
std::cin.tie(nullptr);
|
||||||
|
|
||||||
|
for(ll i=1;i<maxn;i++){
|
||||||
|
const std::string str = std::to_string(i);
|
||||||
|
for(char c:str){
|
||||||
|
if(c=='7'){
|
||||||
|
for(ll j=1;j*i<maxn;j++){
|
||||||
|
isnot[i*j]=true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(ll i=maxn-1;i>=1;i--){
|
||||||
|
static ll last = maxn;
|
||||||
|
last = (isnot[i]?last:i);
|
||||||
|
nxtpos[i]=last;
|
||||||
|
}
|
||||||
|
ll t;
|
||||||
|
std::cin>>t;
|
||||||
|
while(t--){
|
||||||
|
ll x;
|
||||||
|
std::cin>>x;
|
||||||
|
if(isnot[x]){
|
||||||
|
std::cout<<"-1\n";
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
x++;
|
||||||
|
std::cout<<nxtpos[x]<<"\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
52
src/10/23/P7961.cpp
Normal file
52
src/10/23/P7961.cpp
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
#include <cstdint>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <iostream>
|
||||||
|
#include <istream>
|
||||||
|
using ll = int64_t;
|
||||||
|
using int128=__int128;
|
||||||
|
const ll maxn = 107,p=998244353;
|
||||||
|
ll n,m,k,v[maxn],sa[maxn],ans;
|
||||||
|
static inline ll popcount(int128 n){
|
||||||
|
ll ans=0;
|
||||||
|
while(n){
|
||||||
|
ans++;
|
||||||
|
n-=(n&-n);
|
||||||
|
}
|
||||||
|
return ans;
|
||||||
|
}
|
||||||
|
static inline void getans(int128 add){
|
||||||
|
// printf("getans %lld popcount=%lld\n",add,popcount(add));
|
||||||
|
if(popcount(add)>k){
|
||||||
|
// printf("popcount >k\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ll nans=1;
|
||||||
|
for(ll i=1;i<=n;i++){
|
||||||
|
nans=nans*v[sa[i]]%p;
|
||||||
|
}
|
||||||
|
ans=(ans+nans)%p;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void dfs(ll idx,int128 add){
|
||||||
|
// printf("dfs %lld %lld\n",idx, add);
|
||||||
|
if(idx>n){
|
||||||
|
getans(add);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for(ll i=0;i<=m;i++){
|
||||||
|
sa[idx]=i;
|
||||||
|
dfs(idx+1,add+(1ll<<i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(){
|
||||||
|
std::iostream::sync_with_stdio(false);
|
||||||
|
std::cin.tie(nullptr);
|
||||||
|
|
||||||
|
std::cin>>n>>m>>k;
|
||||||
|
for(ll i=0;i<=m;i++){
|
||||||
|
std::cin>>v[i];
|
||||||
|
}
|
||||||
|
dfs(1, 0);
|
||||||
|
std::cout<<ans<<"\n";
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user