Educational Codeforces Round 55 Div. 2 翻车记
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 翻车记的更多相关文章
- Educational Codeforces Round 56 Div. 2 翻车记
A:签到. B:仅当只有一种字符时无法构成非回文串. #include<iostream> #include<cstdio> #include<cmath> #in ...
- Educational Codeforces Round 53 Div. 2翻车记
A:差点开场懵逼.只要有相邻两位不同就可以作为答案. #include<iostream> #include<cstdio> #include<cmath> #in ...
- Codeforces Round#500 Div.2 翻车记
A:签到 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...
- Codeforces Round#509 Div.2翻车记
A:签到 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...
- Codeforces Round#514 Div.2 翻车记
A:签到 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...
- Codeforces Round #524 Div. 2 翻车记
A:签到.room里有一个用for写的,hack了一发1e8 1,结果用了大概600+ms跑过去了.惨绝人寰. #include<iostream> #include<cstdio& ...
- Codeforces Round#516 Div.1 翻车记
A:开场懵逼.然后发现有人1min过,于是就sort了一下,于是就过了.正经证明的话,考虑回文串两端点一定是相同的,所以最多有Σcnti*(cnti+1)/2个,cnti为第i种字母出现次数.而sor ...
- Codeforces Round #517 Div. 1翻车记
A:真的懵逼了.冷静了半天之后决定二分一下答案,然后先a安排上尽量小的再贪心地一个个扩大.40min才过.这个做法非常怂的以代码复杂度和时间复杂度为代价换取了比较稳的正确性,事实上由于1~n可以组合出 ...
- Educational Codeforces Round 84 (Div. 2)
Educational Codeforces Round 84 (Div. 2) 读题读题读题+脑筋急转弯 = =. A. Sum of Odd Integers 奇奇为奇,奇偶为偶,所以n,k奇偶性 ...
随机推荐
- 北京Uber优步司机奖励政策(4月11日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 【BZOJ4803】逆欧拉函数
[BZOJ4803]逆欧拉函数 题面 bzoj 题解 题目是给定你\(\varphi(n)\)要求前\(k\)小的\(n\). 设\(n=\prod_{i=1}^k{p_i}^{c_i}\) 则\(\ ...
- 1245 最小的N个和
1245 最小的N个和 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 有两个长度为 N 的序列 A 和 B, ...
- PowerDesigner 15学习笔记:十大模型及五大分类
个人认为PowerDesigner 最大的特点和优势就是1)提供了一整套的解决方案,面向了不同的人员提供不同的模型工具,比如有针对企业架构师的模型,有针对需求分析师的模型,有针对系统分析师和软件架构师 ...
- Android Studio 3.1.2 Device File Explorer nothing to show
Android Studio 3.1.2 Device File Explorer nothing to show 不显示 目录 ,空白 手持终端设备: Android 4.2.2 ,API1 ...
- 强化学习读书笔记 - 13 - 策略梯度方法(Policy Gradient Methods)
强化学习读书笔记 - 13 - 策略梯度方法(Policy Gradient Methods) 学习笔记: Reinforcement Learning: An Introduction, Richa ...
- Mac系统STF自动化环境搭建及部署踩坑记录
因为公司需要寻找一个免root的自动化测试方案,所以以前做的老方案需要被替代.一阵搜寻找到了这个框架,但是部署起来很是折腾,搞了一下午终于搞定,顺便记录一下过程,有需要的自取. 转载请注明出处:htt ...
- Pycharm主菜单学习
“工欲善其事,必先利其器”,这话我一直是这么坚信的! 找到一款顺手称心的工具,拥有它,熟练地使用它! Pycharm据说就是使用Python的一款最好的工具—— 于是,开始了第一步的学习----先从熟 ...
- docker部署war包到阿里云
最近买了个阿里云服务器,配置1核2g内存,学习够了.记录下过程. 1,服务器相关,请看下图,云服务器主要配置是安全组和密钥,前者是开放端口,后者可以用于远程连接(比如我windows系统通过putty ...
- redis主从配置+sentinel哨兵
redis主从配置+sentinel哨兵 1:编译环境准备 1.1环境确认 Redis是一个开源.支持网络.基于内存.键值对存储数据库,使用ANSI C编写.所以在搭建Redis服务器时需要C语言的编 ...