CF1082解题报告
CF1082A Vasya and Book
模拟一下即可
\(Code\ Below:\)
#include <bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
int n,x,y,d,ans;
int main()
{
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d%d%d",&n,&x,&y,&d);
if((x-y)%d==0) printf("%d\n",abs(x-y)/d);
else {
ans=inf;
if(y%d==1) ans=min(ans,(x-1)/d+y/d+1);
if((n-y)%d==0) ans=min(ans,(n-x-1)/d+(n-y)/d+1);
printf("%d\n",(ans==inf)?-1:ans);
}
}
return 0;
}
CF1082B Vova and Trophies
\(WA\) 了一次。。。
把所有的连续金牌都预处理出来,然后特判一下即可
\(Code\ Below:\)
#include <bits/stdc++.h>
using namespace std;
const int maxn=100000+10;
int n,st[maxn],ed[maxn],cnt,ans;
char a[maxn];
int main()
{
scanf("%d%s",&n,a+1);
int now=0;
for(int i=1;i<=n+1;i++){
if(a[i]=='G'){
if(now==0) st[++cnt]=i;
now++;
}
else if(now) ed[cnt]=st[cnt]+now-1,now=0;
}
if(cnt==0) ans=0;
else if(cnt==1) ans=ed[1]-st[1]+1;
else {
for(int i=1;i<=cnt;i++){
ans=max(ans,ed[i]-st[i]+2);
if(i>1&&ed[i-1]+2==st[i]){
if(cnt==2) ans=max(ans,ed[i]-st[i-1]);
else ans=max(ans,ed[i]-st[i-1]+1);
}
}
}
printf("%d\n",ans);
return 0;
}
CF1082C Multi-Subject Competition
贪心,若 \(>0\) 便算进前缀和中
\(Code\ Below:\)
#include <bits/stdc++.h>
using namespace std;
const int maxn=100000+10;
int n,m,s[maxn],r[maxn],sum[maxn],ans;
vector<int> v[maxn];
bool cmp(int a,int b){
return a>b;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d%d",&s[i],&r[i]);
v[s[i]].push_back(r[i]);
}
for(int i=1;i<=m;i++)
sort(v[i].begin(),v[i].end(),cmp);
int now;
for(int i=1;i<=m;i++){
now=0;
for(int j=0;j<v[i].size();j++){
now+=v[i][j];
if(now>0) sum[j+1]+=now;
else break;
}
}
for(int i=1;i<=n;i++)
ans=max(ans,sum[i]);
printf("%d\n",ans);
return 0;
}
CF1082D Maximum Diameter Graph
\(CF\) 考构造题。。。
先按度数排序,然后从后往前扫,贪心找最长的直径
\(Code\ Below:\)
#include <bits/stdc++.h>
using namespace std;
const int maxn=1000+10;
int n,m,x[maxn],y[maxn],tot;
struct Element{
int val,id;
}e[maxn];
bool cmp(Element a,Element b){
return a.val<b.val;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&e[i].val);
e[i].id=i;
}
sort(e+1,e+n+1,cmp);
int st=-1,pos,id;
for(int i=1;i<=n;i++){
if(e[i+1].val>1){
st=i;
break;
}
}
if(st==-1){
printf("NO\n");
return 0;
}
for(int i=st;i<=n-1;i++){
x[++tot]=e[i].id;
y[tot]=e[i+1].id;
e[i].val--;e[i+1].val--;
}
pos=st-1;
for(int i=n;i>=st;i--){
id=e[i].id;
while(e[i].val&&pos){
x[++tot]=e[i].id;
y[tot]=e[pos].id;
e[i].val--;e[pos].val--;
pos--;
}
if(pos==0) break;
}
if(pos>0||tot!=n-1) printf("NO\n");
else {
printf("YES %d\n%d\n",min(n-1,n-st+1),tot);
for(int i=1;i<=tot;i++)
printf("%d %d\n",x[i],y[i]);
}
return 0;
}
CF1082E Increasing Frequency
想了半天数据结构,结果居然是 \(O(n)\) 的解法。。。
问题等价于找一个区间 \([l,r]\),使整个序列 \(c\) 出现的次数+区间 \([l,r]\) 中出现最多的数的出现次数-区间 \([l,r]\) 中 \(c\) 出现的次数,然后 \(c\) 出现的次数可以直接前缀和 \(O(1)\) 算出,剩下的用最大子段和的思路 \(O(n)\) 扫一遍即可
\(Code\ Below:\)
#include <bits/stdc++.h>
using namespace std;
const int maxn=500000+10;
int n,m,c,a[maxn],sum[maxn],last[maxn],ans;
vector<int> v[maxn];
int main()
{
scanf("%d%d",&n,&c);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
m=max(m,a[i]);
sum[i]=sum[i-1]+(a[i]==c);
if(!last[a[i]]) v[a[i]].push_back(1);
else v[a[i]].push_back(1-(sum[i]-sum[last[a[i]]]));
last[a[i]]=i;
}
ans=sum[n];
int now=0,num=0;
for(int i=1;i<=m;i++){
if(i==c) continue;
now=0;
for(int j=0;j<v[i].size();j++){
now+=v[i][j];
num=max(num,now);
if(now<=0) now=1;
}
}
printf("%d\n",ans+num);
return 0;
}
CF1082F Speed Dial
占坑中
CF1082G Petya and Graph
最大权闭合子图,同 \([NOI2006]\) 最大获利。
因为选了边权一定会选点权,满足最大权闭合子图的性质。我们建一个超级源和超级汇,左边 \(m\) 个数表示 \(m\) 条边,超级源向其连容量为边权的边;右边 \(n\) 个数表示 \(n\) 个点,其向超级汇连容量为点权的边.然后原图中每条边向其两个端点连 \(inf\) 的边,表示选了边权必须选点权,最小割不可能将其割掉。又因为最小割等于最大流,所以最后的答案为 \(\sum_{i=1}^{m} val_i-maxflow\)
\(Code\ Below:\)
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=400000+10;
const int inf=0x3f3f3f3f;
int n,m,s,t,head[maxn],tot=1;
int dep[maxn],cur[maxn];
struct node{
int to,next,val;
}e[maxn];
inline void add(int x,int y,int w){
e[++tot].to=y;e[tot].val=w;
e[tot].next=head[x];head[x]=tot;
e[++tot].to=x;e[tot].val=0;
e[tot].next=head[y];head[y]=tot;
}
int bfs(int s,int t){
queue<int> q;
for(int i=0;i<=t;i++)
cur[i]=head[i];
memset(dep,0x7f,sizeof(dep));
dep[s]=0;q.push(s);
int u,v;
while(!q.empty()){
u=q.front(),q.pop();
for(int i=head[u];i;i=e[i].next){
v=e[i].to;
if(dep[v]>inf&&e[i].val){
dep[v]=dep[u]+1;
q.push(v);
}
}
}
return dep[t]<inf;
}
int dfs(int now,int t,int limit){
if(!limit||now==t) return limit;
int flow=0,f,v;
for(int i=cur[now];i;i=e[i].next){
cur[now]=i;v=e[i].to;
if(dep[v]==dep[now]+1&&(f=dfs(v,t,min(limit,e[i].val)))){
flow+=f;
limit-=f;
e[i].val-=f;
e[i^1].val+=f;
if(!limit) break;
}
}
return flow;
}
int Dinic(){
int maxflow=0;
while(bfs(s,t))
maxflow+=dfs(s,t,inf);
return maxflow;
}
signed main()
{
scanf("%I64d%I64d",&n,&m);
s=0;t=n+m+1;
int p,a,b,c,sum=0;
for(int i=1;i<=n;i++){
scanf("%I64d",&p);
add(i+m,t,p);
}
for(int i=1;i<=m;i++){
scanf("%I64d%I64d%I64d",&a,&b,&c);
sum+=c;add(s,i,c);
add(i,a+m,inf);add(i,b+m,inf);
}
printf("%I64d\n",sum-Dinic());
return 0;
}
CF1082解题报告的更多相关文章
- CH Round #56 - 国庆节欢乐赛解题报告
最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...
- 二模13day1解题报告
二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...
- BZOJ 1051 最受欢迎的牛 解题报告
题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4438 Solved: 2353[S ...
- 习题:codevs 2822 爱在心中 解题报告
这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...
- 习题:codevs 1035 火车停留解题报告
本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...
- 习题: codevs 2492 上帝造题的七分钟2 解题报告
这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...
- 习题:codevs 1519 过路费 解题报告
今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...
- NOIP2016提高组解题报告
NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合
- LeetCode 解题报告索引
最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中...... ...
随机推荐
- [vb.net]控制台进度条的示例
Private Sub ConsoleProcessBar() Dim isBreak As Boolean = False Dim colorBack As ConsoleColor = Conso ...
- 取消IDEA中代码重复的检测
- P3834 【模板】可持久化线段树 1(主席树)
#include <bits/stdc++.h> #define read read() #define up(i,l,r) for(int i = (l);i <= (r);i++ ...
- from __future__ import
读代码的过程中看到的,好奇搜索了一下,其实当在我们调试别人Python代码的过程中经常会遇到一些问题,比如版本不同,代码也会有所改变,比如print函数 Python 2.7版本为 print “ ” ...
- 2019.01.26 codeforces 632E. Thief in a Shop(生成函数)
传送门 题意简述:给nnn个物件,物件iii有一个权值aia_iai,可以选任意多个.现在要求选出kkk个物件出来(允许重复)问最后得到的权值和的种类数. n,k,ai≤1000n,k,a_i\le ...
- function类型(c++11)
1.c++五大可调用的对象 可调用的对象常常作为泛型算法的实参 1)函数 2)函数指针 函数名其实也是函数指针,只不过函数名是一个常量指针,它的值不能改变,只能指向该函数,不能改变它的值让它指向别的函 ...
- dj 中间件
中间件的概念 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用不好会影响到 ...
- idea在相应的包下右键创建servlet,找不到servlet选项
开始pom.xml文件里面我是只引进了个servlet包,但是右键依旧没有servlet选项 <dependency> <groupId>javax.servlet</g ...
- IntelliJ IDEA 2017版 使用笔记(五) 模板 live template自定义设置(二) ;postfix使用;IDE快捷键使用
一.live template 活模板 就像这个单词的含义一样,live template就是一个高效的提高代码,书写速度的方式,(live template位置File-----settin ...
- IntelliJ IDEA 2017版 spring-boot2.0.2 自动配置Condition
描述: 编译器修改参数 -Dfile.encoding=GBK -Dstr.encoding=GBK Condition位置: 某一个类或注解存在的时候,装配,否则不装配 相关代码: ...