A:签到。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int T;
int main()
{
/*#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif*/
T=read();
while (T--)
{
int n=read(),x=read(),y=read(),d=read();
if (abs(y-x)%d==) cout<<abs(y-x)/d<<endl;
else
{
int ans=;
if ((y-)%d==) ans=min(ans,(y-)/d+(x-)/d+);
if ((n-y)%d==) ans=min(ans,(n-y)/d+(n-x-)/d+);
if (ans==) cout<<-<<endl;
else cout<<ans<<endl;
}
}
return ;
}

  B:讨论了好多种情况写的老长交了五发30min的时候才过心态爆炸。随便怎么做都行。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 200010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,a[N],pre[N],suf[N],ans,cnt;
int main()
{
/*#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif*/
n=read();
for (int i=;i<=n;i++) cnt+=(a[i]=getc()=='S');
int x=;
for (int i=;i<=n;i++)
{
pre[i]=x;
if (a[i]) x=i;
}
x=n+;
for (int i=n;i>=;i--)
{
suf[i]=x;
if (a[i]) x=i;
}
int flag=;
for (int i=;i<=n;i++)
if (a[i]==)
{
int t=i;while (t<n&&a[t+]==a[i]) t++;
flag++;
i=t;
}
if (flag==) {cout<<;return ;}
if (flag==)
for (int i=;i<=n;i++)
if (a[i]==)
{
int t=i;while (t<n&&a[t+]==a[i]) t++;
cout<<t-i+;return ;
}
for (int i=;i<=n;i++)
if (pre[i]!=i-&&suf[i]!=i+) ans=max(ans,suf[i]-pre[i]-);
if (flag<=) ans--;
if (flag>=)
for (int i=;i<=n;i++)
{
if (pre[i]==i-) ans=max(ans,suf[i]-i);
if (suf[i]==i+) ans=max(ans,i-pre[i]);
}
if (cnt==) ans=n;
cout<<max(,ans)<<endl;
return ;
}

  C:对于每个科目显然应该从大到小选。枚举各科的学生人数,考虑每个科目,只要能选该科的人数足够且价值>0就应该把这些人选进去。用链表维护哪些科目是应该选的即可,只要人数不够或者价值<=0就将其从中删除。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
#define ll long long
#define N 200010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,m,ans,cnt,tot[N],cho[N],nxt[N],pre[N];
vector<int> a[N];
int main()
{
/*#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif*/
n=read(),m=read();
for (int i=;i<=n;i++)
{
int x=read(),y=read();
a[x].push_back(y);tot[x]++;
}
for (int i=;i<=m;i++) sort(a[i].begin(),a[i].end()),reverse(a[i].begin(),a[i].end());
for (int i=;i<=m;i++) nxt[i]=i+,pre[i+]=i;
for (int j=;j<=n;j++)
{
int x=nxt[];
while (x!=m+)
{
if (tot[x]>=)
{
if (tot[x]==) nxt[pre[x]]=nxt[x],pre[nxt[x]]=pre[x],cnt-=cho[x],tot[x]=-;
else
{
tot[x]--,cnt+=a[x][j-],cho[x]+=a[x][j-];
if (cho[x]<=) nxt[pre[x]]=nxt[x],pre[nxt[x]]=pre[x],cnt-=cho[x],tot[x]=-;
}
}
x=nxt[x];
}
ans=max(ans,cnt);
}
cout<<ans;
return ;
}

  D:显然应该尽量让他形成一条链。只有度数<=1的点会对其造成影响。在链的两端至少各放一个度数<=1的点并将主链连起来然后瞎连即可。讨论一下一些特殊情况。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 510
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,a[N],b[N],cnt,t;
bool flag[N];
struct data{int x,y;
}edge[N];
int main()
{
/*#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif*/
n=read();
for (int i=;i<=n;i++)
{
a[i]=read();
if (a[i]==) b[++cnt]=i;
else flag[i]=;
}
if (cnt==)
{
cout<<"YES"<<' '<<n-<<endl;
cout<<n-<<endl;
for (int i=;i<n;i++) cout<<i<<' '<<i+<<endl;
return ;
}
if (cnt==)
{
if (b[]==)
{
cout<<"YES"<<' '<<n-<<endl;
cout<<n-<<endl;
for (int i=;i<n;i++) cout<<i<<' '<<i+<<endl;
}
else
{
cout<<"YES"<<' '<<n-<<endl;
cout<<n-<<endl;
for (int i=;i<b[]-;i++) cout<<i<<' '<<i+<<endl;
cout<<<<' '<<b[]<<endl;
for (int i=b[];i<n;i++) cout<<i<<' '<<i+<<endl;
}
return ;
}
if (n==&&cnt==) {cout<<"YES"<<' '<<<<endl<<<<endl<<<<' '<<;return ;}
for (int i=;i<=n;i++)
if (a[i]!=) {edge[++t].x=b[],edge[t].y=i;break;}
if (t==) {cout<<"NO";return ;}
for (int i=n;i>=;i--)
if (a[i]!=) {edge[++t].x=b[cnt],edge[t].y=i;break;}
if (t==) {cout<<"NO";return ;}
int x=;cnt--;
for (int i=;i<=n;i++)
while (a[i]>&&x<=cnt) edge[++t].x=b[x++],edge[t].y=i,a[i]--;
for (int i=;i<=n;i++)
if (flag[i])
for (int j=i-;j>=;j--)
if (flag[j]) {edge[++t].x=i,edge[t].y=j;break;}
if (t<n-) cout<<"NO";
else
{
cout<<"YES"<<' '<<n-cnt<<endl;
cout<<n-<<endl;
for (int i=;i<n;i++) cout<<edge[i].x<<' '<<edge[i].y<<endl;
}
return ;
}

  E:先把本来就和C相同的数数出来做个前缀和。显然让所选区间的左右端点变为与C相同是不会更劣的。考虑每一种数。假设固定了左端点,右端点不断向右扩展,那么遇到与左端点相同的数就可以使答案+1,遇到本身就与C相同的数则会使答案-1。于是将对该数每一段的价值取出来,形如1 -a1 1 -a2 1……,做个最大子段和就可以了。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 2000010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,m,a[N],p[N],sum[N],nxt[N],b[N],t,cnt,ans;
int main()
{
/*#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif*/
n=read(),m=read();
for (int i=;i<=n;i++)
{
a[i]=read()-m+;
if (a[i]==) cnt++;
}
for (int i=;i<=n;i++) nxt[i]=p[a[i]],p[a[i]]=i;
for (int i=;i<=n;i++) sum[i]=sum[i-]+(a[i]==);
ans=cnt;
for (int i=;i<=;i++)
if (i!=&&p[i])
{
int x=p[i];t=;b[++t]=;
while (nxt[x])
{
b[++t]=sum[nxt[x]]-sum[x];
b[++t]=;
x=nxt[x];
}
int s=;
for (int j=;j<=t;j++)
{
s+=b[j];
if (s<) s=;
ans=max(ans,cnt+s);
}
}
cout<<ans<<endl;
return ;
}

  F:没看

  G:最大权闭合子图裸题。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define int long long
#define N 2010
#define M 10010
#define S 0
#define T 2001
#define inf 10000000000000ll
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,m,p[N],a[N],t=-,d[M],cur[M],q[M],ans;
struct data{int to,nxt,cap,flow;
}edge[M<<];
void addedge(int x,int y,int z)
{
t++;edge[t].to=y,edge[t].nxt=p[x],edge[t].cap=z,edge[t].flow=,p[x]=t;
t++;edge[t].to=x,edge[t].nxt=p[y],edge[t].cap=,edge[t].flow=,p[y]=t;
}
bool bfs()
{
memset(d,,sizeof(d));d[S]=;
int head=,tail=;q[]=S;
do
{
int x=q[++head];
for (int i=p[x];~i;i=edge[i].nxt)
if (d[edge[i].to]==-&&edge[i].flow<edge[i].cap)
{
q[++tail]=edge[i].to;
d[edge[i].to]=d[x]+;
}
}while (head<tail);
return ~d[T];
}
int work(int k,int f)
{
if (k==T) return f;
int used=;
for (int i=cur[k];~i;i=edge[i].nxt)
if (d[k]+==d[edge[i].to])
{
int w=work(edge[i].to,min(f-used,edge[i].cap-edge[i].flow));
edge[i].flow+=w,edge[i^].flow-=w;
if (edge[i].flow<edge[i].cap) cur[k]=i;
used+=w;if (used==f) return f;
}
if (used==) d[k]=-;
return used;
}
void dinic()
{
while (bfs())
{
memcpy(cur,p,sizeof(p));
ans-=work(S,inf);
}
}
signed main()
{
/*#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif*/
n=read(),m=read();
for (int i=;i<=n;i++) a[i]=read();
memset(p,,sizeof(p));
for (int i=;i<=m;i++)
{
int x=read(),y=read(),z=read();
addedge(n+i,x,inf),addedge(n+i,y,inf);
addedge(S,n+i,z);ans+=z;
}
for (int i=;i<=n;i++) addedge(i,T,a[i]);
dinic();
cout<<ans;
return ;
}

  

  小号打的。result: rank 34 rating +158

Educational Codeforces Round 55 Div. 2 翻车记的更多相关文章

  1. Educational Codeforces Round 56 Div. 2 翻车记

    A:签到. B:仅当只有一种字符时无法构成非回文串. #include<iostream> #include<cstdio> #include<cmath> #in ...

  2. Educational Codeforces Round 53 Div. 2翻车记

    A:差点开场懵逼.只要有相邻两位不同就可以作为答案. #include<iostream> #include<cstdio> #include<cmath> #in ...

  3. Codeforces Round#500 Div.2 翻车记

    A:签到 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...

  4. Codeforces Round#509 Div.2翻车记

    A:签到 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...

  5. Codeforces Round#514 Div.2 翻车记

    A:签到 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...

  6. Codeforces Round #524 Div. 2 翻车记

    A:签到.room里有一个用for写的,hack了一发1e8 1,结果用了大概600+ms跑过去了.惨绝人寰. #include<iostream> #include<cstdio& ...

  7. Codeforces Round#516 Div.1 翻车记

    A:开场懵逼.然后发现有人1min过,于是就sort了一下,于是就过了.正经证明的话,考虑回文串两端点一定是相同的,所以最多有Σcnti*(cnti+1)/2个,cnti为第i种字母出现次数.而sor ...

  8. Codeforces Round #517 Div. 1翻车记

    A:真的懵逼了.冷静了半天之后决定二分一下答案,然后先a安排上尽量小的再贪心地一个个扩大.40min才过.这个做法非常怂的以代码复杂度和时间复杂度为代价换取了比较稳的正确性,事实上由于1~n可以组合出 ...

  9. Educational Codeforces Round 84 (Div. 2)

    Educational Codeforces Round 84 (Div. 2) 读题读题读题+脑筋急转弯 = =. A. Sum of Odd Integers 奇奇为奇,奇偶为偶,所以n,k奇偶性 ...

随机推荐

  1. day6 RHCE

    17.创建一个脚本 在server0上创建一个名为/root/foo.sh的脚本,让其提供下列特性: 当运行/root/foo.sh redhat,输出fedora 当运行/root/foo.sh f ...

  2. Pomelo.AspNetCore.TimedJob 允许依赖注入

    public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStar ...

  3. 16、Java并发编程:Timer和TimerTask

    Java并发编程:Timer和TimerTask(转载) 下面内容转载自: http://blog.csdn.net/xieyuooo/article/details/8607220 其实就Timer ...

  4. Nginx之一:Nginx的编译安装

    一.Nginx简介 官方网址:http://nginx.org/ Nginx是由1994年毕业于俄罗斯国立莫斯科鲍曼科技大学的同学为俄罗斯rambler.ru公司开发的,开发工作最早从2002年开始, ...

  5. 树形dp入门两题

    题目描述 小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在课后留在教室向老师请教一些问题.一天他早晨骑车去上课,路上见到一个老伯正在修剪花花草草,顿时想到了一个有关修剪花卉的问题.于是当日课后,小明 ...

  6. 生成dataset的几种方式

    1.常用的方式通过sparksession读取外部文件或者数据生成dataset(这里就不讲了)  注: 生成Row对象的方法提一下:RowFactory.create(x,y,z),取Row中的数据 ...

  7. 程序员必备神器--vps主机

    今天推荐一个功能强大.居家必备的神器给刚入行或还不了解它的同学们.且不说它有什么功能,它有多好用,先说先你有没有碰到过这些问题吧. 用百度查技术问题,发现都是互相抄袭和广告,大佬都说google好,但 ...

  8. Numpy入门笔记第一天

    # 导入包 import numpy as np # 创建一维数组 a = np.arange(5) print "一维numpy数组", a print "数组的类型& ...

  9. 华为笔试——C++的int型数字位排序

    题目:int型数字位排序 题目介绍:输入int 型整数,按照从右至左的顺序,返回不含重复数字的新整数. 例: 输入: 99824270 输出: 072489 分析:乍一看很简单,但是很容易忽略int ...

  10. Python学习小目录汇总

    python其他知识目录 python基础知识-1 1.typora软件使用 2.python解释器安装 3.Python解释器环境变量添加 4.计算机编码知识: 5.输出print(): 6.变量 ...