Codeforces Round #407 (Div. 2)解题报告
来源:互联网 发布:淘宝有百度云盘吗 编辑:程序博客网 时间:2024/06/16 05:07
A:Anastasia and pebbles
水题。。直接按题意搞一下就行了
B:Masha and geometric depression
同样是一个模拟题,map记录bad数,特判q=-1和q=1的情况即可
C:Functions again
……好像说是最大子段和?
看别人题解代码很长的样子 我是记录前缀和的最大最小值,贪心一下就行了,因为正负对最大最小值的影响其实是没有的,所以不需要考虑太多
然后……要注意最小值如果大于0可以认为不取更优
#include <iostream>#include <cstdio>#include <cmath>#include <algorithm>#include <queue>#include <string>#include <map>#include <cstring>#include <ctime>#include <vector>#define inf 1e9#define ll long long#define For(i,j,k) for(int i=j;i<=k;i++)#define Dow(i,j,k) for(int i=k;i>=j;i--)using namespace std;ll n,ma,mi,s[500001],a[500001];int main(){scanf("%I64d",&n);For(i,1,n)scanf("%I64d",&a[i]);For(i,2,n){s[i]=s[i-1]+abs(a[i]-a[i-1])*(i&1?-1:1);ma=max(ma,s[i]);mi=min(mi,s[i]);}printf("%I64d",ma-min(0LL,mi));}D:Weird journey
拿到题一点思路都没有,开始在草稿纸上乱画……
但是发现,不论怎么画,两条只走一次的边一定有一个公共点
然后考虑自环这个特殊情况,唯一有可能没有公共点的情况
嗯……这个结论是瞎猜的,但是过了 不会证啊OTZ
然后记录自环数量为cnt2,显然,选两个自环可行。对答案贡献为cnt2*(cnt2-1)/2
一个自环,一条正常的边,也可行,记录正常边条数为cnt1,对答案贡献cnt2*cnt1
接下来是考虑公共点,我们输入边的时候记录num[i]表示与i相连的边的数量,那么i这个点对于答案的贡献为num[i]*(num[i]-1)/2
累加即可
但是上面所有的想法,都要在图联通的情况下才可以,因此先bfs判断一下图的连通性
#include <iostream>#include <cstdio>#include <cmath>#include <algorithm>#include <queue>#include <string>#include <map>#include <cstring>#include <ctime>#include <vector>#define inf 1e9#define maxn 2000050#define ll long long#define For(i,j,k) for(ll i=j;i<=k;i++)#define Dow(i,j,k) for(ll i=k;i>=j;i--)using namespace std;ll cnt,ans,cnt1,cnt2,poi[maxn],vis[maxn],q[maxn],nxt[maxn],f[maxn],n,m,x,y,num[maxn];bool bj[maxn];inline void add(ll x,ll y){poi[++cnt]=y;nxt[cnt]=f[x];f[x]=cnt;}inline void BFS(int x){ll l=1,r=1;q[1]=x;vis[x]=1;while(l<=r){ll x=q[l];for(ll i=f[x];i;i=nxt[i])if(!vis[poi[i]])vis[poi[i]]=1,q[++r]=poi[i];l++;}For(i,1,n)if(!vis[i]&&bj[i]){puts("0");exit(0);}}int main(){scanf("%lld%lld",&n,&m);ll s;For(i,1,m){scanf("%lld%lld",&x,&y);bj[x]=bj[y]=1;s=x;if(x==y)cnt1++;else{cnt2++;add(x,y);add(y,x);num[x]++;num[y]++;}}BFS(s);For(i,1,n)if(!vis[i]&&bj[i]){puts("0");return 0;}ans=cnt1*cnt2+(cnt1*cnt1-cnt1)/2;For(i,1,n)ans+=num[i]*(num[i]-1)/2;printf("%I64d",ans);}E:The Great Mixing
个人认为……比D题简单一些
题意可知,我们每多取一个浓度为x/1000的药水,则分母+1000,分子+x
所以显然可以得到,如果我们选了t瓶药水,则其sigma(x)需要达到t*k,k为目标浓度的分子
因此我们可以认为,一瓶药水的分母为答案贡献了-k,分子为答案贡献了x
则这瓶药水总贡献为x-k
我们只需要选出一些药水让sigma(x-k)等于0就行了
题目中n<=1e6,但是……a[i]<=1000,所以很显然的是最多只有1001种不同的药,可以无限取,所以多出来的完全没有贡献
即本题中,对答案有贡献的物品至多1001个
然后因为药品浓度不小于0,不大于1,所以很显然的又得到了我们可行的状态范围……-1000~1000
这种范围。。。
BFS直接上啊
#include <iostream>#include <cstdio>#include <cmath>#include <algorithm>#include <queue>#include <string>#include <map>#include <cstring>#include <ctime>#include <vector>#define inf 1e9#define ll long long#define For(i,j,k) for(int i=j;i<=k;i++)#define Dow(i,j,k) for(int i=k;i>=j;i--)using namespace std;int n,k,a[10001],f[10001],l=1,r=0,q[100001],vis[10001],N;map<int,int>bj;inline void bfs(){while(l<=r){int t=q[l];if(t==4001){printf("%d",f[4001]);exit(0);}For(i,1,n){int tmp=t+a[i];if(f[tmp])continue;if(tmp<2000||tmp>6002)continue;f[tmp]=f[t]+1;q[++r]=tmp;}l++;}puts("-1");}int main(){scanf("%d%d",&k,&n);For(i,0,10000)f[i]=0;For(i,1,n){int x;scanf("%d",&x);x-=k;if(bj[x+4001])continue;bj[x+4001]=1;a[++N]=x;q[++r]=x+4001;f[x+4001]=1;}n=N;bfs();}
- Codeforces Round #407 (Div. 2)解题报告
- Codeforces Round #149 (Div. 2)解题报告
- Codeforces Round #180 (Div. 2) 解题报告
- Codeforces Round #190 (Div. 2) 解题报告
- Codeforces Round #191 (Div. 2) 解题报告
- Codeforces Round #189 (Div. 2) 解题报告
- Codeforces Round #142 (Div. 2) 解题报告
- Codeforces Round #229 (Div. 2) 解题报告
- Codeforces Round #241 (Div. 2) 解题报告
- Codeforces Round #262 (Div. 2)解题报告
- Codeforces Round #267 (Div. 2) 解题报告
- Codeforces Round #266 (Div. 2)解题报告
- Codeforces Round #268 (Div. 2) 解题报告
- Codeforces Round #271 (Div. 2) 解题报告
- Codeforces Round #274 (Div. 2) 解题报告
- Codeforces Round #276 (Div. 2) 解题报告
- Codeforces Round #277 (Div. 2) 解题报告
- Codeforces Round #224 (Div. 2)解题报告
- CSS并不简单--带你认识不一样的margin
- Handler消息处理机制
- 多线程学习(三)
- Netty使用LineBasedFrameDecoder解决粘包问题
- submit与button的区别
- Codeforces Round #407 (Div. 2)解题报告
- 在linux命令行下批量删除文件或文件夹
- 剑指offer 面试题40 数组中只出现一次的数字
- Kafka知识整理
- opencv---FileStorage
- 【Java学习笔记】23.网络编程--Socket
- Linux centos7 安装Hadoop单结点
- POJ 1278 BOAT 笔记
- 【React Native系列教程】构建React Native官方Examples