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解题报告的更多相关文章

  1. CH Round #56 - 国庆节欢乐赛解题报告

    最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...

  2. 二模13day1解题报告

    二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...

  3. BZOJ 1051 最受欢迎的牛 解题报告

    题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4438  Solved: 2353[S ...

  4. 习题:codevs 2822 爱在心中 解题报告

    这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...

  5. 习题:codevs 1035 火车停留解题报告

    本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...

  6. 习题: codevs 2492 上帝造题的七分钟2 解题报告

    这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...

  7. 习题:codevs 1519 过路费 解题报告

    今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...

  8. NOIP2016提高组解题报告

    NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合

  9. LeetCode 解题报告索引

    最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中......                        ...

随机推荐

  1. QualNet/EXata的发展贯穿在美军网络中心战演进的始终

    QualNet/EXata的发展贯穿在美军网络中心战演进的始终 赵玉亭 1.   QualNet/EXata的前身GloMoSim是美国防部高级计划研究局(DARPA)在1994年启动的全球移动信息系 ...

  2. windows 8 update to windows 8.1

    可以参考以下几个链接: http://blogs.windows.com/windows/b/appbuilder/archive/2013/07/24/windows-8-to-windows-8- ...

  3. 日志审计系统、事件日志审计、syslog审计

    日志审计系统.事件日志审计.syslog审计 任何IT机构中的Windows机器每天都会生成巨量日志数据.这些日志包含可帮助您的有用信息: · 获取位于各个Windows事件日志严重性级别的所有网络活 ...

  4. Oracle启动两个监听

    接上篇:Oracle服务器修改IP后 Oracle服务器更换IP后,办公网络里面可以正常访问了,外地的同事,连了vpn 也可以访问,以为可以收工回家,突然又有同事过来说,机房的服务器ping不通新的i ...

  5. floor函数

    C++中 可以用floor函数来截断小数部分 floor(x)返回一个不大于x的整数,有点像取整函数

  6. nginx 502 Bad Gateway 错误解决办法

    nginx出现502有很多原因,但大部分原因可以归结为资源数量不够用,也就是说后端PHP-fpm处理有问题,nginx将正确的客户端请求发给了后端的php-fpm进程,但是因为php-fpm进程的问题 ...

  7. 2018.11.08 NOIP模拟 水管(简单构造)

    传送门 仔细读题会发现只要所有点点权之和等于0一定有解. 如何构造? 直接当做树来构造就行了,非树边都赋值成0就行. 代码

  8. 负载均衡下 tomcat session 共享

    概述 在分布式部署的情况下,每台tomcat 都会有自己的session ,这样如果 用户A 在tomcat1 下登录,在tomcat2 下并没有session信息.如果 tomcat1宕机,tomc ...

  9. Codeforces Round #538 (Div. 2) E 随机数生成

    https://codeforces.com/contest/1114/problem/E 题意 交互题,需要去猜一个乱序的等差数列的首项和公差,你能问两种问题 1. 数列中有没有数比x大 2. 数列 ...

  10. ibatis注意要点

    一.ibatis的关键字like查询 select * from t_student where s_name '%张%'; 这种like语句在ibatis中怎么写,他们现在的项目是用ibatis作为 ...