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,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中...... ...
随机推荐
- 【51NOD】1006 最长公共子序列Lcs(动态规划)
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abca是这两个 ...
- [C#]“正在终止线程”的问题
在C#中启用线程后,如果试图使用Abort方法来终止线程,那么必定会抛出“正在终止线程”的异常,一开始我也想过如何来避免这种异常出现,花了不少气力,但最后发现全是徒劳. 原因是一个正在运行的线程被终止 ...
- JS高级-Date- Error-***Function:
1. Date: API: 1. 8个单位: FullYear Month Date Day Hours Minutes Seconds Milliseconds 2. 每 ...
- POJ-3252 Avenger
题意:在区间中,他们化成2进制的数的0的个数大于等于1的数有多少个. 思路:我们需要记录上一次0和1的个数,此外我们还要特别注意一下前导0. 如果前面全是0的时候我们就要注意下一位是不是还是0,如果一 ...
- unity3DGI
Realtime GI,实时全局光照, 1.构成 : 可实时更新的lightmap + 可实时更新的光照探头(light probe)+ 可实时更新的cubemap(Reflection probe) ...
- websocket项目电子签字使用场景
场景描述:进入页面时,如果设置强制签字,发送签字webSocket连接,同时页面有个重新签字按钮,这个按钮会多次调用 第一步:先建立一个websocket的js文件,名叫signSocket.js内容 ...
- springboot Thymeleaf 整合
Thymeleaf是一个Java模板引擎开发库,可以处理和生成HTML.XML.JavaScript.CSS和文本,在Web和非Web环境下都可以正常工作. Thymeleaf可以跟Spring bo ...
- SVN被锁定的几种解决方法
用SVN经常出现被锁定而无法提交的问题,选择解锁又提示没有文件被锁定,很是头疼.这里整理了一下SVN被锁定的几种解决方法: 1.出现这个问题后使用“清理”即"Clean up"功能 ...
- Altera PLL应用中注意的问题
无论是差分转单端信号还是单端信号转差分信号,都要都要用到altiobuf.而且在pin planner中要设置管脚的标准为差分的 而且要注意管脚的正负极性. 今天用FPGA做测试:把专门用于PLL的输 ...
- python基础回顾
1.第二个缺点就是代码不能加密.如果要发布你的Python程序,实际上就是发布源代码,这一点跟C语言不同,C语言不用发布源代码,只需要把编译后的机器码(也就是你在Windows 上常见的xxx.exe ...