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,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中...... ...
随机推荐
- JVM新生代到老年代基础了解
JVM区域总体分两类,heap区和非heap区. heap区又分为: - Eden Space(伊甸园). - Survivor Space(幸存者区). - Old Gen(老年代). 1个Eden ...
- 关于Windows 8 合约
浅谈win8合约: http://www.devdiv.com/Windows_Metro-windows_metro_app_windows_contracts_-thread-131717-1-1 ...
- 比较完整的HIS系统解释(转载记录)
HIS系统即医院信息系统(全称为Hospital Information System).在国际学术界,它已被公认为是新兴的医学信息学的重要分支.HIS系统的有效运行,将提高医院各项工作的效率和质量, ...
- 绩效沟通-BEST原则
BEST原则指在进行绩效/IDP面谈的时候按照以下步骤进行: 案例:小赵经常在制作标书时候犯错误 Behavior description 描述行为 小赵,8月6日,你制作的标书,报价又出现了错误,单 ...
- Codeforces Round #542(Div. 2) CDE 思维场
C https://codeforces.com/contest/1130/problem/C 题意 给你一个\(n*m\)(n,m<=50)的矩阵,每个格子代表海或者陆地,给出在陆地上的起点终 ...
- Codeforces Round #524 (Div. 2) F. Katya and Segments Sets(主席树)
https://codeforces.com/contest/1080/problem/F 题意 有k个区间,区间的种类有n种,有m个询问(n,m<=1e5,k<=3e5),每次询问a,b ...
- OEM-ODM-OBM
Original Equipment ManufacturerOriginal Design ManufacturerOwn Branding & Manufacturing OEM,即“原始 ...
- Java之spilt()函数,trim()函数
一.单个符号作为分隔符 package com.regix; public class FuncSpilt { public static void main(String[] args) { // ...
- js 上传文件
<input id="file_Up" name="file_Up" type="file" onchange="getFi ...
- Java Applet小应用
开发和部署方式 嵌入到HTML网页中,用<Applet></Applet>标签识别.java环境用浏览器的,在第一次打开时下载,可开发成以后打开,默认不必再次下载.也可 ...