CodeForces:749(div1)750(div2)

前言

750AB是水题.
749A小清新也比较水但有一点细节
749B经典的那种需要稍微想想但不难的图论蓝题
749C是裹着图论的贪心题
749D的预处理是魔法操作之前没有见过(据说还可以暴力FWT?)
749E大式子题我直接弃疗

CF450A Jzzhu and Children

Description\text{Description}Description

nnn 个孩子排成队,每个孩子有一个需求 aia_iai.
每次给队首的孩子 mmm 个糖果,如果还没有满足需求,该孩子就回到队尾,否则就离开.
求最后一个离开的是谁.

Solution\text{Solution}Solution

水题,⌈ain⌉\lceil \dfrac{a_i}{n}\rceilnai 求出每个孩子需要几轮,然后取一个轮数最大即可.
同一轮数取编号最大.

Code\text{Code}Code

#include<bits/stdc++.h>
using namespace std;
#define ll long long
//#define double long double
#define debug(...) fprintf(stderr,__VA_ARGS__)
const int N=1050;
const double eps=1e-10;
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}
int n,m;
int a[105];
int main(){#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);
#endifn=read();m=read();for(int i=1;i<=n;i++) a[i]=read();int mx=0,id=0;for(int i=1;i<=n;i++){int o=(a[i]+m-1)/m;if(o>=mx){mx=o;id=i;}}printf("%d\n",id);return 0;
}
/*
3 3
tsy
*/

CF450B Jzzhu and Sequences

Description\text{Description}Description

有一个数列 fif_ifi,给出 f1,f2f_1,f_2f1,f2,对于 i>2i>2i>2,满足 fi=fi−1+fi+1f_i=f_{i-1}+f_{i+1}fi=fi1+fi+1.
求数列的第 nnn 项.
n≤109n\le10^9n109

Solution\text{Solution}Solution

移项:
fi+1=fi−fi−1f_{i+1}=f_{i}-f_{i-1}fi+1=fifi1.
矩阵乘法即可.

Code\text{Code}Code

#include<bits/stdc++.h>
using namespace std;
#define ll long long
//#define double long double
#define debug(...) fprintf(stderr,__VA_ARGS__)
const int N=1050;
const int mod=1e9+7;
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}
int n,m;
struct matrix{ll a[3][3];int x,y;matrix(int xx,int yy):x(xx),y(yy){memset(a,0,sizeof(a));}matrix() {memset(a,0,sizeof(a));}
};
matrix mul(matrix u,matrix v){matrix res(u.x,v.y);for(int k=1;k<=u.y;k++){for(int i=1;i<=u.x;i++){for(int j=1;j<=v.y;j++) (res.a[i][j]+=u.a[i][k]*v.a[k][j])%=mod;}}return res;
}
matrix ksm(matrix o,int k){matrix res(2,2);res.a[1][1]=res.a[2][2]=1;while(k){if(k&1) res=mul(res,o);o=mul(o,o);k>>=1;}return res;
}
matrix tr,ans;
int main(){#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);
#endifans.a[1][2]=(read()+mod)%mod;ans.a[1][1]=(read()+mod)%mod;ans.x=1;ans.y=2;n=read();if(n<=2){printf("%lld\n",ans.a[1][3-n]);return 0;}tr.x=tr.y=2;tr.a[1][1]=1;tr.a[1][2]=1;tr.a[2][1]=mod-1;tr.a[2][2]=0;ans=mul(ans,ksm(tr,n-2));printf("%lld\n",ans.a[1][1]);return 0;
}
/*
3 3
tsy
*/

CF449A Jzzhu and Chocolate

Description\text{Description}Description

给出一个 N×MN \times MN×M 的矩阵,给 KKK 个操作,每次操作可以横/竖切割矩阵,求 KKK 次切割,最大化最小块的面积.

Solution\text{Solution}Solution

显然要尽可能平均的切.
那么答案就是 ⌊nx⌋×⌊mk+2−x⌋\lfloor \dfrac{n}{x}\rfloor \times \lfloor \dfrac{m}{k+2-x}\rfloorxn×k+2xm.
⌊nx⌋\lfloor \dfrac{n}{x}\rfloorxn 只有 O(n)O(\sqrt n)O(n) 中取值,整除分块枚举这些值,然后贪心的让 xxx 尽可能的大即可.
需要开 longlong.
细节上,当 k+2−x≤0k+2-x\le0k+2x0 时,要当成 111 处理.

Code\text{Code}Code

#include<bits/stdc++.h>
using namespace std;
#define ll long long
//#define double long double
#define debug(...) fprintf(stderr,__VA_ARGS__)
const int N=1050;
const int mod=1e9+7;
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}
int n,m,k;
ll ans;
inline void check(int a){int b=k+2-a;if(b>m) return;if(b<=0) b=1;ans=max(ans,1ll*(n/a)*(m/b));return;
}
int main(){#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);
#endifn=read();m=read();k=read();if(n+m<k+2){printf("-1");return 0;}for(int i=1;i<=n;){check(n/(n/i));i=n/(n/i)+1;}for(int i=1;i*i<=n;i++){if(n%i) continue;check(i);check(n/i);}printf("%lld\n",ans);return 0;
}
/*
3 3
tsy
*/

CF449B Jzzhu and Cities

Description\text{Description}Description

nnn 个点,mmm 条带权边的无向图,另外还有 kkk 条特殊边,每条边连接 111iii 。 问最多可以删除这kkk 条边中的多少条,使得每个点到111 的最短距离不变.

Solution\text{Solution}Solution

我的做法是开两个堆,一个堆是 Dijkstra 正常用的堆,第二个堆存所有特殊边,优先从 dij 的堆转移即可.
题解的方法是直接维护最短路的条数,感觉更加直观.

Solution\text{Solution}Solution

#include<bits/stdc++.h>
using namespace std;
#define ll long long
//#define double long double
#define debug(...) fprintf(stderr,__VA_ARGS__)
const int N=3e5+100;
const int mod=1e9+7;
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}
int n,m,k;
struct node{int to,nxt,w;
}p[N<<1];
int fi[N],cnt;
inline void addline(int x,int y,int w){p[++cnt]=(node){y,fi[x],w};fi[x]=cnt;return;
}
struct edge{int id,val;bool operator < (const edge y)const{return val>y.val;}
};
priority_queue<edge>Q;
#define pr pair<ll,int>
#define mkp make_pair
priority_queue<pr,vector<pr>,greater<pr> >q;
ll dis[N];
bool vis[N];
int ans;
void dij(){memset(dis,0x3f,sizeof(dis));q.push(mkp(0,1));dis[1]=0;while(!q.empty()||!Q.empty()){int now;if(q.empty()||(!Q.empty()&&Q.top().val<q.top().first)){now=Q.top().id;int val=Q.top().val;Q.pop();if(vis[now]) continue;assert(dis[now]>val);dis[now]=val;++ans;}else{now=q.top().second;q.pop();if(vis[now]) continue;}vis[now]=1;for(int i=fi[now];~i;i=p[i].nxt){int to=p[i].to;if(dis[to]>dis[now]+p[i].w){dis[to]=dis[now]+p[i].w;q.push(mkp(dis[to],to));}}    }return;
}
int main(){#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);
#endifmemset(fi,-1,sizeof(fi));n=read();m=read();k=read();for(int i=1;i<=m;i++){int x=read(),y=read(),w=read();addline(x,y,w);addline(y,x,w);}for(int i=1;i<=k;i++){edge o={(int)read(),(int)read()};Q.push(o);}dij();printf("%d\n",k-ans);return 0;
}
/*
3 3
tsy
*/

CF449C Jzzhu and Apples

Description\text{Description}Description

给出正整数 nnn,你要把 1−n1-n1n 之间的正整数分成尽可能多组,使得每一组两个数的最大公约数大于1;输出能分成最多组的个数,并按任意顺序输出每组的两个数.

Solution\text{Solution}Solution

朴素做法可以想到枚举 gcdgcdgcd 把所有的倍数尽可能的配对.
考虑为什么这样随便选会不优.
就是当某次配对落单的最后也没有配对,但是如果选择其他某个元素落单,后面却可以配对.
所以我们应该尽可能的选取后面容易配对的.
那么我们每次就令 2×g2\times g2×g 配对,最后在 g=2g=2g=2 的时候全都配对就行了.
这样如果还有落单的,说明这些待定的是奇数个,那么肯定就会有落单的,不可能更优了.

Code\text{Code}Code

#include<bits/stdc++.h>
using namespace std;
#define ll long long
//#define double long double
#define debug(...) fprintf(stderr,__VA_ARGS__)
const int N=1e5+100;
const int mod=1e9+7;
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}
int n,m,k;
int q[N],st,ed;
bool vis[N],jd[N];
int x[N],y[N],tot;
int main(){#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);
#endifn=read();for(int i=2;i<=n;i++){if(jd[i]) continue;for(int j=i+i;j<=n;j+=i) jd[j]=1;}for(int i=n;i>=2;i--){if(jd[i]) continue;st=1;ed=0;for(int j=i;j<=n;j+=i){if(!vis[j]) q[++ed]=j;}if(ed&1) swap(q[2],q[ed]);while(st<ed){++tot;x[tot]=q[st];vis[q[st++]]=1;y[tot]=q[st];vis[q[st++]]=1;}}printf("%d\n",tot);for(int i=1;i<=tot;i++) printf("%d %d\n",x[i],y[i]);return 0;
}
/*
3 3
tsy
*/

CF449D Jzzhu and Numbers

Description\text{Description}Description

给出一个序列 a1...na_{1...n}a1...n,求元素按位与结果等于 000 的非空子集选取方案个数.
n≤106,ai≤106n\le 10^6,a_i\le 10^6n106,ai106.

Solution\text{Solution}Solution

神奇的题.
容易想到容斥,设 resires_iresi 为与运算后至少有一个 111 的方案数.
那么答案就是:
ans=res0−res1+res2...ans=res_0-res_1+res_2...ans=res0res1+res2...
resxres_xresx 的值不易求解,所以转而考虑求 fxf_xfx 表示与运算后结果 www 满足 w&x=xw\&x=xw&x=x 的方案数.
若有 numxnum_xnumxaia_iai 满足 ai&x=xa_i\&x=xai&x=x ,那么就有
numx=2numx−1num_x=2^{num_x}-1numx=2numx1
也就是只能在这 numxnum_xnumx 个数里选,且不能都不选.
那么关键就是求出 numxnum_xnumx.

首先,对于每个 aia_iai,令 numai++num_{a_i}++numai++.
然后,按位枚举 kkk ,然后若 xxx 的第 kkk 位是 111 ,就令 numx(1<<(k−1))←numxnum_{x^(1<<(k-1))}\gets num_xnumx(1<<(k1))numx.(换句话说就是转移到把第 kkk 位扣掉后的数.
为什么这样是对的?
首先,这样转移的显然都是合法元素,且不会遗漏.
关键就是为什么这样不会算重.
因为对于每个数对 (x,y),x&y=x(x,y),x\&y=x(x,y),x&y=xnumy→numxnum_y\to num_xnumynumx转移路径是唯一的.
比如说 01101→0010001101\to001000110100100,就会且只会在枚举第 111 位时 01101→0110001101\to 011000110101100,再在枚举第 444 位时 01100→0010001100\to 001000110000100.

Code\text{Code}Code

#include<bits/stdc++.h>
using namespace std;
#define ll long long
//#define double long double
#define debug(...) fprintf(stderr,__VA_ARGS__)
const int N=2e6+100;
const int mod=1e9+7;
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}
int n,m,k;
int a[N],mi[25],f[N],bit[N];
ll ksm(ll x,ll k){ll res(1);while(k){if(k&1) res=res*x%mod;x=x*x%mod;k>>=1;}return res;
}
int main(){#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);
#endifn=read();for(int i=1;i<=n;i++) a[i]=read(),f[a[i]]++;mi[0]=1;for(int i=1;i<=20;i++) mi[i]=mi[i-1]<<1;for(int j=20;j>=0;j--){for(int i=0;i<mi[20];i++){if(i&mi[j]) f[i^mi[j]]+=f[i];}}for(int i=1;i<mi[20];i++) bit[i]=bit[i-(i&-i)]+1;ll ans(0);for(int i=0;i<mi[20];i++){f[i]=(ksm(2,f[i])+mod-1)%mod;if(bit[i]&1) ans+=mod-f[i];else ans+=f[i];ans%=mod;}printf("%lld\n",ans);return 0;
}
/*
3 3
tsy
*/

CF749E Inversions After Shuffle 题解

数学并不会但可以去看看这个

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317303.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Steins;Game Gym - 102798J(未解决)

Steins;Game Gym - 102798J 题意&#xff1a; 给定n堆石子a&#xff0c;每堆石子被染成了黑色或者白色&#xff0c;现在两个人轮流进行以下的其中一个操作&#xff1a; 1、从石子数量最少的一个黑色石堆中拿走若干石子 2、从任意一个白色石堆中拿走若干石子 两个人都采取最优…

ML.NET 0.10特性简介

IDataView被单独作为一个类库包IDataView组件为表格式数据提供了非常高效的处理方式&#xff0c;尤其是用于机器学习和高级分析应用。它被设计为可以高效地处理高维数据和大型数据集。并且也适合处理属于更大的分布式数据集中的单个数据区块结点。在ML.NET 0.10中&#xff0c;I…

模板:模拟退火

文章目录前言解析流程示例代码trick所谓模拟退火&#xff0c;就是通过代码模拟退火 &#xff08;逃&#xff09; 前言 终于学了这个神奇的骗分算法 几次在大赛中都发现这算法是真的有学的必要 FFC可能真的要想想自己的题目对OI界的导向作用了 但学完以后还是感觉挺有意思的&a…

讨“动态规划“檄

我一直遵循着人不犯我我不犯人的原则&#xff0c;但是鉴于动态规划(dp)三番两次的挑衅&#xff0c;我忍无可忍决定发起反击&#xff0c;特写本文记录一下。 (本文整理一下以前做过的dp问题&#xff0c;并且把之前囤的大量dp都做做) acwing提高组 第一章 动态规划 背包模型题目集…

数论五之容斥——硬币购物,Gerald and Giant Chess,幸运数字,Sky Full of Stars,已经没有什么好害怕的了

容斥的神[HAOI2008]硬币购物problemsolutioncodeCF559C Gerald and Giant Chessproblemsolutioncode[SCOI2010]幸运数字problemsolutioncodeCF997C Sky Full of Starsproblemsolutioncode已经没有什么好害怕的了problemsolutioncode[JLOI2015]骗我呢problemsolutioncode容斥要么…

P4769-[NOI2018]冒泡排序【组合数学,树状数组】

正题 题目链接:https://www.luogu.com.cn/problem/P4769 题目大意 有一个冒泡排序的算法 输入&#xff1a;一个长度为 n 的排列 p[1...n] 输出&#xff1a;p 排序后的结果。 for i 1 to n dofor j 1 to n - 1 doif(p[j] > p[j 1])交换 p[j] 与 p[j 1] 的值然后给出一…

NET Core微服务之路:基于Ocelot的API网关Relay实现--RPC篇

前言我们都知道&#xff0c;API网关是工作在应用层上网关程序&#xff0c;为何要这样设计呢&#xff0c;而不是将网关程序直接工作在传输层、或者网络层等等更底层的环境呢&#xff1f;让我们先来简单的了解一下TCP/IP的五层模型。&#xff08;图片出自http://www.cnblogs.com/…

模板:长链剖分

所谓长链剖分&#xff0c;就是对长链进行剖分 &#xff08;逃&#xff09; 前言 很优雅的算法 利用对指针进行魔法操作将 n2n^2n2 的 dp 优化成线性 线性啊&#xff01;&#xff01;&#xff01; 解析 CF1009F Dominant Indices 给定一棵以 111 为根&#xff0c;nnn 个节点…

acwing 327. 玉米田

327. 玉米田 题意&#xff1a; m * n的土地&#xff0c;有的土地不育&#xff0c;有的可以种植&#xff0c;要求相邻的土地不能同时种植玉米&#xff0c;问有多少种种植方式 题解&#xff1a; 状压dp&#xff0c;先存每一行可能的状态&#xff0c;然后状态转移&#xff0c;…

Windows 10《描图》应用现已开源

点击上方蓝字关注“汪宇杰博客”《描图》是我最早的Windows 10应用&#xff0c;发布至今已3年多&#xff0c;积累了全球数百万用户&#xff0c;广受好评。现已开源。这款应用为不少小朋友带去了欢乐&#xff0c;体验绘画的乐趣&#xff0c;也帮助过专业用户复刻数百幅古代绘画。…

数论六之计算几何干货——计算几何模板解释全集 及 模板检验训练场

文章目录点和向量及运算直线和线段求解点到直线的距离/点在直线上求解点到线段的距离/点在线段上求解两条线段是否相交求解两直线的交点多边形求解多边形面积求解多边形重心求解判断定点与多边形的位置关系凸包graham扫描法graham扫描法加强版圆求解圆与直线的交点求解圆与圆的…

P7740-[NOI2021]机器人游戏【dp,bitset】

正题 题目链接:https://www.luogu.com.cn/problem/P7740 题目描述 题目大意摸了 小 R 有 mmm&#xff08;1≤m≤10001 \le m \le 10001≤m≤1000&#xff09;个机器人和 mmm 张纸带&#xff0c;第 iii&#xff08;1≤i≤m1 \le i \le m1≤i≤m&#xff09;个机器人负责对第 …

CodeForces:54

文章目录前言CF54A PresentsDescription\text{Description}DescriptionSolution\text{Solution}SolutionCF54B Cutting Jigsaw PuzzleDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}CodeCF54C First Digit LawDescription\text{Desc…

[NOIP2016 提高组] 愤怒的小鸟

[NOIP2016 提高组] 愤怒的小鸟 题意&#xff1a; 有n只猪&#xff0c;给出猪的坐标(xi,yi),问最少用几个形如 yax^2bx 的曲线可以保证所有猪在曲线上&#xff0c;满足a<0,a,b为实数 n<18, 题解&#xff1a; 两个方法&#xff1a;爆搜或者状压dp 状压dp 看n<18也…

P5208-[WC2019] I 君的商店【交互,二分】

正题 题目链接:https://www.luogu.com.cn/problem/P5208 题目大意 有一个长度为nnn的010101序列aaa&#xff0c;你知道里面有奇数个111还是偶数个111。你每次可以选择两个下标集合S/TS/TS/T询问集合SSS和集合TTT位置的数字和哪个更大。 交互库只会告诉你S≤TS\leq TS≤T或者…

模板:后缀数组(SA)

文章目录前言解析后缀排序优化1&#xff1a;基数排序优化2&#xff1a;简化第一次排序优化3&#xff1a;提前break完整代码LCP与height所谓后缀数组&#xff0c;就是存储后缀的数组 &#xff08;逃&#xff09; 前言 为什么一个算法&#xff0c;如此难以理解却依然是成为一个…

P3959 [NOIP2017 提高组] 宝藏

P3959 [NOIP2017 提高组] 宝藏 题意: 额题意不好说&#xff0c;就是n个点m个边&#xff0c;选定一个点为根节点&#xff0c;构造一个最小生成树&#xff0c;边的权值为该该边起点到根节点之间的点的数量K&#xff08;不含根节点&#xff09; * 道路长度 1<n<12 0<m&…

如何在ASP.NET Core程序启动时运行异步任务(3)

原文&#xff1a;Running async tasks on app startup in ASP.NET Core (Part 3)作者&#xff1a;Andrew Lock译者&#xff1a;Lamond Lu之前我写了两篇有关在ASP.NET Core中运行异步任务的博文&#xff0c;本篇博文是对之前两篇博文中演示示例和实现方法的简短跟进。你可以通过…

CF1140G-Double Tree【最短路,矩阵乘法,树上倍增】

正题 题目链接:https://www.luogu.com.cn/problem/CF1140G 题目大意 给出一个nnn个点的树TTT&#xff0c;然后复制一份T′TT′&#xff0c;每个TTT中的点iii向T′TT′中的点iii都有连边构成一张图。 图上所有权值各不相同&#xff0c;现在qqq次询问图上两点的最短路。 1≤n≤…

数论六之计算几何——An Easy Problem,Ancient Berland Circus,Open-air shopping malls

可检验模板正确度An Easy Problem?!Ancient Berland CircusOpen-air shopping mallsAn Easy Problem?! problem 就是大讨论 #include <cmath> #include <cstdio> #include <iostream> using namespace std; #define eps 1e-6struct vec {double x, y;ve…