今天无聊vp了一下
A.省略
B.最优肯定是全部都是1
C.直接统计每个余数下可以填多少个数,然后排序从小到大的排序输出即可
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
using namespace std;
const int N = 2e5+10,M=1e7+10;
int n,m,k;
int a[N];
int sum[N];
void solve()
{
cin>>n;
vector<int> cnt(15,0);
for(int i=1;i<=n;i++)
{
cin>>a[i];
cnt[i%10]++;
}
vector<vector<int>> g(15);
sort(a+1,a+1+n);
int idx=1;
for(int i=0;i<=10;i++)
{
for(int j=1;j<=cnt[i];j++)
{
g[i].push_back(a[idx]);
idx++;
}
}
int now=0;
for(int i=1;i<=n;i++)
{
cout<<g[i%10][now]<<" ";
if(i%10==0) now++;
}
}
signed main()
{
cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
int t=1;
//cin>>t;
while(t--) solve();
}
D:
直接把1e7里面的质数筛出来就行,数组最多20w,大于20w的质数根本用不上
然后用个set维护就行了预处理出答案
E贪心,让每个相邻的ZZ在一起,每个ZZ在一起要除掉中间的z,所以
直接统计中间z的个数,每次取最小即可,贡献是4
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
using namespace std;
const int N = 2e5+10,M=1e7+10;
#define int long long
int n,m,k;
int a[N];
int sum[N];
void solve()
{
string s;
cin>>n>>k>>s;
s="?"+s;
int cnt=0;
long long res=0,mx=1;
for(int i=1;i<=n;i++)
{
if(s[i]=='z'){
a[i]=0;
}
else a[i]=2;
}
int last=-1;
priority_queue<int,vector<int>,greater<int>> q;
for(int i=1;i<=n;i++)
{
if(a[i]==2&&last==-1){
last=i;
continue;
}
if(a[i]==2)
{
q.push(i-last-1);
last=i;
}
}
while(k>0&&q.size())
{
if(k<q.top())
{
break;
}
res+=4;
k-=q.top();
q.pop();
}
cout<<res<<"\n";
}
signed main()
{
cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
int t=1;
//cin>>t;
while(t--) solve();
}
F.
这个题其实是板子题我觉得,首先肯定是用优先队列的因为边权不同
然后分析状态n个点,每个点用没用过魔法,其他点已经受影响的次数
首先用了两次等于没用过,所以状态就是n*2*2
复杂度mlog(n*2*2)
我这里的state代表在这个有没有用过魔法,
staten是其他点有没有受到影响
如果state变成1,那么其他点要全部改变,所以也要变化
判断的时候,t点用魔法是不改变自己的,所以t加上全局影响即可
但是j点是会受到t魔法的,所以不仅要加上全局影响,还要加上t影响
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
using namespace std;
const int N = 2e5+10,M=1e7+10;
#define int long long
typedef pair<int, int> PII;
using node=tuple<int,int,int,int>;
int n,m,k;
int w[N],dist[N][3][3];
int x,y,z;
vector<int> g[N];
int bfs(){
memset(dist,-1,sizeof(dist));
priority_queue<node,vector<node>,greater<node>> q;
q.push({0,1,0,0});
while(q.size())
{
auto [d,t,state,staten]=q.top();
q.pop();
if(t==n) return d;
if(dist[t][state][staten]!=-1) continue;
dist[t][state][staten]=d;
if(dist[t][state^1][staten^1]==-1)
{
q.push({d+z,t,state^1,staten^1});
}
for(auto&j:g[t])
{
if((w[j]^staten^state)==(w[t]^staten))
{
q.push({d+x,j,0,staten});
}
else{
q.push({d+y,j,0,staten});
}
}
}
return 0;
}
void solve()
{
cin>>n>>m;
cin>>x>>y>>z;
for(int i=1;i<=n;i++) cin>>w[i];
for(int i=1;i<=m;i++)
{
int a,b;
cin>>a>>b;
g[a].push_back(b);
g[b].push_back(a);
}
cout<<bfs()<<"\n";
}
signed main()
{
cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
int t=1;
//cin>>t;
while(t--) solve();
}