CF546
CF546A
暴力模拟。
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inl inline
#define endl '\n'
#define int ll
#define gc cin.get
#define pc cout.put
const int N=1e7+5;
const int M=3e7+5;
const int inf=0x3f3f3f3f;
const int mod=998244353;
inl ll read(){
ll x=0,f=1;char c=gc();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=gc();}
return x*f;
}
inl void write(int x){
if(x<0){pc('-');x=-x;}
if(x>9)write(x/10);
pc(x%10+'0');
}
inl void writei(int x){write(x);pc(' ');}
inl void writel(int x){write(x);pc('\n');}
int t,n,k,w;
signed main(){
k=read(),n=read(),w=read();
cout<<max(0ll,k*w*(w+1)/2-n)<<endl;
return 0;
}
CF546B
显然的贪心做法:排序后对每个数不停加 加到刚好比前一个大一
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inl inline
#define endl '\n'
#define int ll
#define gc cin.get
#define pc cout.put
const int N=1e7+5;
const int M=3e7+5;
const int inf=0x3f3f3f3f;
const int mod=998244353;
inl ll read(){
ll x=0,f=1;char c=gc();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=gc();}
return x*f;
}
inl void write(int x){
if(x<0){pc('-');x=-x;}
if(x>9)write(x/10);
pc(x%10+'0');
}
inl void writei(int x){write(x);pc(' ');}
inl void writel(int x){write(x);pc('\n');}
int t,n,k,w,a[N],ans;
signed main(){
n=read();
for(int i=1;i<=n;i++)a[i]=read();
sort(a+1,a+n+1);
for(int i=1;i<=n;i++)
while(a[i]<=a[i-1])a[i]++,ans++;
cout<<ans<<endl;
return 0;
}
CF546C
注意到 \(n\) 很小,开两个队列暴力模拟。
当次数 \(\le 10^6\) 退出 判定无解即可
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inl inline
#define endl '\n'
#define int ll
#define gc cin.get
#define pc cout.put
const int N=1e7+5;
const int M=3e7+5;
const int inf=0x3f3f3f3f;
const int mod=998244353;
inl ll read(){
ll x=0,f=1;char c=gc();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=gc();}
return x*f;
}
inl void write(int x){
if(x<0){pc('-');x=-x;}
if(x>9)write(x/10);
pc(x%10+'0');
}
inl void writei(int x){write(x);pc(' ');}
inl void writel(int x){write(x);pc('\n');}
int n,k1,k2,cnt;
queue<int>q1,q2;
signed main(){
n=read();
k1=read();for(int i=1;i<=k1;i++)q1.push(read());
k2=read();for(int i=1;i<=k2;i++)q2.push(read());
while(++cnt<1e6){
int x=q1.front(),y=q2.front();
q1.pop();q2.pop();
if(x<y)q2.push(x),q2.push(y);
else q1.push(y),q1.push(x);
if(q1.empty()){cout<<cnt<<' '<<2<<endl;return 0;}
if(q2.empty()){cout<<cnt<<' '<<1<<endl;return 0;}
}
cout<<-1<<endl;
return 0;
}
CF546D
曾尝试过分块打表 因CF代码大小限制不超过10KB而告终
注意到要求的是 \(\prod\limits_{i=a_i+1}^{b_i}i\) 分解出的质因数的数量之和
显然 可以线性筛+前缀和预处理 \(O(1)\) 求出
对于每个数的答案
- 如果是质数 那么答案为 \(1\)
- 否则线性筛时 \(f[i*primes[j]]=f[i]+f[primes[j]]\)
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inl inline
#define endl '\n'
#define int ll
#define gc cin.get
#define pc cout.put
const int N=1e7+5;
const int M=3e7+5;
const int inf=0x3f3f3f3f;
const int mod=998244353;
inl ll read(){
ll x=0,f=1;char c=gc();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=gc();}
return x*f;
}
inl void write(int x){
if(x<0){pc('-');x=-x;}
if(x>9)write(x/10);
pc(x%10+'0');
}
inl void writei(int x){write(x);pc(' ');}
inl void writel(int x){write(x);pc('\n');}
int t,a,b,res[N],primes[N],cnt,vis[N];
inl void init(){
for(int i=2;i<=5e6;i++){
if(!vis[i])res[i]=1,primes[++cnt]=i;
for(int j=1;j<=cnt&&i*primes[j]<=5e6;j++){
vis[i*primes[j]]=1;
res[i*primes[j]]=res[i]+res[primes[j]];
if(!(i%primes[j]))break;
}
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
t=read();init();
for(int i=2;i<=5e6;i++)res[i]+=res[i-1];
while(t--){
b=read();a=read();
cout<<res[b]-res[a]<<endl;
}
return 0;
}
CF546E
最先想到模拟费用流那题 是不是美酒了
显然的网络流:从源点连容量为 \(a_i\) 的边 向汇点连 \(b_i\) 的边
对于不好操作的只能流到附近的点 可以经典操作拆点
很坑的点:只有 \(\sum\limits a_i = \sum\limits b_i\) 才有解
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inl inline
#define endl '\n'
#define gc cin.get
#define pc cout.put
const int N=2e2+5;
const int M=1e5+5;
const int inf=0x3f3f3f3f;
const int mod=998244353;
inl ll read(){
ll x=0,f=1;char c=gc();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=gc();}
return x*f;
}
inl void write(int x){
if(x<0){pc('-');x=-x;}
if(x>9)write(x/10);
pc(x%10+'0');
}
inl void writei(int x){write(x);pc(' ');}
inl void writel(int x){write(x);pc('\n');}
int n,m,s,t,dis[N],cur[N],maxflow,sum,ans[N][N];
int head[N],nxt[M],to[M],w[M],cnt=1;
inl void add(int u,int v,int wi){
nxt[++cnt]=head[u];to[cnt]=v;w[cnt]=wi;head[u]=cnt;
nxt[++cnt]=head[v];to[cnt]=u;w[cnt]=0;head[v]=cnt;
}
queue<int>q;
inl bool bfs(){
memset(dis,0,sizeof dis);
memcpy(cur,head,sizeof cur);
dis[s]=1;q.push(s);
while(!q.empty()){
int x=q.front();q.pop();
for(int i=head[x];i;i=nxt[i]){
int y=to[i],wi=w[i];
if(wi&&!dis[y]){
dis[y]=dis[x]+1;
q.push(y);
}
}
}
return dis[t];
}
inl int dfs(int x,int flow){
if(x==t)return maxflow+=flow,flow;
int used=0;
for(int &i=cur[x];i;i=nxt[i]){
int y=to[i],wi=w[i];
if(wi&&dis[y]==dis[x]+1){
if(int rlow=dfs(y,min(wi,flow-used))){
w[i]-=rlow;w[i^1]+=rlow;
used+=rlow;
if(used==flow)break;
}
}
}
return used;
}
inl void dinic(){while(bfs())dfs(s,inf);}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
n=read();m=read();s=(n<<1)+1,t=s+1;
int tot=0;
for(int i=1;i<=n;i++){
int wi=read();tot+=wi;
add(s,i,wi);
}
for(int i=1;i<=n;i++)add(i,i+n,inf);
for(int i=1;i<=n;i++){
int wi=read();sum+=wi;
add(i+n,t,wi);
}
if(tot^sum){cout<<"NO"<<endl;return 0;}
for(int i=1;i<=m;i++){
int u=read(),v=read();
add(u,v+n,inf);add(v,u+n,inf);
}
dinic();
if(maxflow^sum){cout<<"NO"<<endl;return 0;}
cout<<"YES"<<endl;
for(int x=1;x<=n;x++){
for(int i=head[x];i;i=nxt[i]){
int y=to[i],wi=w[i];
if(i&1)continue;
ans[x][y-n]=inf-wi;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
cout<<ans[i][j]<<' ';
cout<<endl;
}
return 0;
}