【Educationcal Codeforces Round 21】
这场edu我原本以为能清真一点……
后来发现不仅是七题
还有各种奇奇怪怪的骚操作……
A.
随便枚举
#include<bits/stdc++.h>
using namespace std;
int n;
int main(){
scanf("%d",&n);int x=;
for(;n/(x*);x*=);
printf("%d\n",n/x*x+x-n);
}
B.
xjb按照定义分一下就行了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,k,m,a[];
double ans;
int main(){
cin>>n>>k;ll i;
for(i=;i<=n;i++)cin>>a[i];
for(i=;i<=n;i++)ans+=a[i]*min(min(i,n-i+),min(k,n-k+));
ans/=(n-k+);
printf("%16.15f",ans);
}
C.
将茶杯排序,然后从后往前贪心地构造就行了。
#include<bits/stdc++.h>
using namespace std;
int a[],b[],n,w;
inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
int main(){
n=read();w=read();
for(int i=;i<=n;i++)a[i]=read();
for(int i=;i<=n;i++){b[i]=(a[i]+)>>;w-=b[i];}
if(w<){puts("-1");return ;}
while(w){
int minv=;
for(int i=;i<=n;i++)if((!minv||a[i]>=a[minv])&&a[i]>b[i])minv=i;
int x=min(a[minv]-b[minv],w);
b[minv]+=x;w-=x;
}
for(int i=;i<=n;i++)printf("%d ",b[i]);
}
D.
求出前缀和,二分下标。
#include<bits/stdc++.h>
using namespace std;
int a[],b[],n,w;
inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
int main(){
n=read();w=read();
for(int i=;i<=n;i++)a[i]=read();
for(int i=;i<=n;i++){b[i]=(a[i]+)>>;w-=b[i];}
if(w<){puts("-1");return ;}
while(w){
int minv=;
for(int i=;i<=n;i++)if((!minv||a[i]>=a[minv])&&a[i]>b[i])minv=i;
int x=min(a[minv]-b[minv],w);
b[minv]+=x;w-=x;
}
for(int i=;i<=n;i++)printf("%d ",b[i]);
}
E.
大数据版01背包……
不知道正解是啥,我sort一下+鬼畜剪枝玄学过去……
#include<bits/stdc++.h>
#define N 1000005
using namespace std;
typedef long long ll;
int w[N],c[N],rk[N];
int n,m;
ll f[N],p[N];
inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
bool cmp(int x,int y){return p[x]<p[y];}
int main(){
n=read();m=read();
for(int i=;i<=n;i++){
w[i]=read();c[i]=read();p[i]=c[i]*6LL/w[i];rk[i]=i;
}
sort(rk+,rk+n+,cmp);int s=;
for(int i=n;i;i--){
int ww=w[rk[i]],cc=c[rk[i]];
s+=ww;
for(int j=s;j>=max(ww,s-);j--)f[j]=max(f[j],f[j-ww]+cc);
}
for(int i=;i<=m;i++)f[i]=max(f[i],f[i-]);
cout<<f[m]<<endl;
}
F.
本场最恶心的题……
首先线性筛出素数,这个不用说。
其次有个显然的单调性。那么我们可以对等级二分答案。
这类问题很模型化,任取两个数不能为素数,那么我们考虑怎样才一定取不出素数。
问题其实也就是一个二分匹配问题,左集合全部为奇数(我们暂时先不考虑1的问题),右集合全部为偶数,那么只有从左边取一个数或者从右边取一个数才可能构成素数。
那么这里就构成了一个二分图模型。
我们考虑建图:
①建立源点,连入各个奇数,流为各个奇数其本身的价值。
②建立汇点,将各个偶数连入汇点,流为各个偶数其本身的价值。
③对应遍历各个奇数,如果其右边有偶数和其相加能够构成素数,那么将其连入那个点,流为INF.
那么我们跑出的最大流就是最小割,也就是最小花费,同样可以理解为最小抛掉的点的价值总和。
那么我们此时最优选取方案的价值和就是Sum-maxlfow.这里Sum就是能够选择的数的价值总和。
于是就这么恶心的写完了……
#include<bits/stdc++.h>
#define N 200005
#define inf 1000000007
using namespace std;
int n,m,opt[N],e,s,t,vis[N];int prime[N],cnt=;
struct Data{int p,c,l;}a[N];
////////////////////////////////////////////////////////////////////////////////////////////////////////////
inline void calcpri(){
memset(vis,,sizeof(vis));
for(int i=;i<=N;i++){
if(vis[i]){prime[++cnt]=i;}
for(int j=;j<=cnt;j++){
int t=i*prime[j];if(t>N)break;
vis[t]=;
if(i%prime[j]==)break;
}
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////
namespace Maxflow{ struct Edge{int u,v,f,next;}G[N<<];
int head[*N],tot=;
inline void addedge(int u,int v,int f){
G[tot].u=u;G[tot].v=v;G[tot].f=f;G[tot].next=head[u];head[u]=tot++;
G[tot].u=v;G[tot].v=u;G[tot].f=;G[tot].next=head[v];head[v]=tot++;
}
int level[N];
bool bfs(int s,int t){
memset(level,,sizeof(level));
queue<int>q;q.push(s);level[s]=;
while(!q.empty()){
int u=q.front();q.pop();
if(u==t)return ;
for(int i=head[u];~i;i=G[i].next){
int v=G[i].v,f=G[i].f;
if(f&&!level[v])level[v]=level[u]+,q.push(v);
}
}
return ;
}
int dfs(int u,int maxf,int t){
int ret=;if(u==t)return maxf;
for(int i=head[u];~i;i=G[i].next){
int v=G[i].v,f=G[i].f;
if(f&&level[v]==level[u]+){
f=dfs(v,min(maxf-ret,f),t);
ret+=f;G[i].f-=f;G[i^].f+=f;
}
}
if(!ret)level[u]=inf;
return ret;
}
inline void init(){memset(head,-,sizeof(head));tot=;}
inline int dinic(int s,int t){
int ans=;
while(bfs(s,t))ans+=dfs(s,inf,t);
return ans;
} }
///////////////////////////////////////////////////////////////////////////////////////////////////////////
bool check(int x){
int k=;for(int i=;i<=n;i++)if(a[i].l<=x)if(a[i].c==&&a[i].p>a[k].p)k=i;
Maxflow::init();
int s=,t=n+;
int sum=;
for(int i=;i<=n;i++)if(a[i].l<=x){
if(a[i].c==&&i!=k)continue;
sum+=a[i].p;if(a[i].c&)Maxflow::addedge(s,i,a[i].p);
else Maxflow::addedge(i,t,a[i].p);
}
for(int i=;i<=n;i++)for(int j=;j<=n;j++)if(vis[a[i].c+a[j].c]){
if(a[i].c&)Maxflow::addedge(i,j,inf);
else Maxflow::addedge(j,i,inf);
}
return (sum-Maxflow::dinic(s,t)>=m);
} inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
} int main(){
n=read();m=read();calcpri();
for(int i=;i<=n;i++)a[i].p=read(),a[i].c=read(),a[i].l=read();
int l=,r=,ret=;
for(int i=;i<=n;i++)r=max(r,a[i].l);ret--;
while(l<=r){
int mid=(l+r)>>;
if(check(mid))ret=mid,r=mid-;
else l=mid+;
}
printf("%d\n",ret);
}
G.
一个挺妙的dp。
记录dp[i],表示到了位置i最多的出现次数。
cnt[i],表示最后一次出现的 B 以 i 结尾 0-i中最多能出现几次B
首先dp[i]初始为dp[i-1]
接着用kmp,O(m)求出可以从之前的哪个位置转移
求和之后比较即可。
#include<bits/stdc++.h>
#define N 100005
using namespace std;
char s[N],p[N];
int nxt[N],dp[N],cnt[N];
void calcnext(char *s,int len,int *nxt){
int i=,j;nxt[]=j=-;
while(i<len){
while(j!=-&&s[i]!=s[j])j=nxt[j];
nxt[++i]=++j;
}
}
int main(){
scanf("%s",s);scanf("%s",p);
calcnext(p,strlen(p),nxt);int slen=strlen(s),plen=strlen(p);
//for(int i=0;i<plen;i++)printf("%d ",nxt[i]);puts("");
if(plen>slen){puts("");return ;}
else{
memset(cnt,,sizeof(cnt));memset(dp,,sizeof(dp));
for(int i=plen-;i<slen;i++){
bool sqc=;
for(int k=;k<plen;k++)
if(s[i-k]!=p[plen--k]&&s[i-k]!='?'){sqc=;break;}
dp[i]=dp[i-];
if(sqc){
cnt[i]=dp[i-plen];
for(int k=nxt[plen];~k;k=nxt[k])cnt[i]=max(cnt[i],cnt[i-(plen-k)]);
cnt[i]++;
dp[i]=max(dp[i],cnt[i]);
}
}
printf("%d\n",dp[slen-]);
}
}
这场没有DS题好差评……
不过有几道好题真是不错的呀。
【Educationcal Codeforces Round 21】的更多相关文章
- 【Educational Codeforces Round 19】
这场edu蛮简单的…… 连道数据结构题都没有…… A.随便质因数分解凑一下即可. #include<bits/stdc++.h> #define N 100005 using namesp ...
- 【Educational Codeforces Round 22】
又打了一场EDU,感觉这场比23难多了啊…… 艹还是我太弱了. A. 随便贪心一下. #include<bits/stdc++.h> using namespace std; ,ans=- ...
- 【Educational Codeforces Round 38】D. Buy a Ticket 堆优化Dijkstra
题意 给定一张无向图,对每个点$i\in S$求$\min_{j\in S} {2\times d(i,j)+a_j}$ 考虑多源多汇最短路会超时,换个角度考虑每个$j$,如果$j=i$,那么答案为$ ...
- 【Educational Codeforces Round 37】F. SUM and REPLACE 线段树+线性筛
题意 给定序列$a_n$,每次将$[L,R]$区间内的数$a_i$替换为$d(a_i)$,或者询问区间和 这题和区间开方有相同的操作 对于$a_i \in (1,10^6)$,$10$次$d(a_i) ...
- 【Educational Codeforces Round 48】
A:https://www.cnblogs.com/myx12345/p/9843001.html B:https://www.cnblogs.com/myx12345/p/9843021.html ...
- Educational Codeforces Round 21
Educational Codeforces Round 21 A. Lucky Year 个位数直接输出\(1\) 否则,假设\(n\)十进制最高位的值为\(s\),答案就是\(s-(n\mod ...
- 【Codeforces Round 1137】Codeforces #545 (Div. 1)
Codeforces Round 1137 这场比赛做了\(A\).\(B\),排名\(376\). 主要是\(A\)题做的时间又长又交了两次\(wa4\)的. 这两次错误的提交是因为我第一开始想的求 ...
- 【Codeforces Round 1132】Educational Round 61
Codeforces Round 1132 这场比赛做了\(A\).\(B\).\(C\).\(F\)四题,排名\(89\). \(A\)题\(wa\)了一次,少考虑了一种情况 \(D\)题最后做出来 ...
- 【Codeforces Round 1120】Technocup 2019 Final Round (Div. 1)
Codeforces Round 1120 这场比赛做了\(A\).\(C\)两题,排名\(73\). \(A\)题其实过的有点莫名其妙...就是我感觉好像能找到一个反例(现在发现我的算法是对的... ...
随机推荐
- BZOJ4867 Ynoi2017舌尖上的由乃(dfs序+分块)
容易想到用dfs序转化为序列上的问题.考虑分块,对每块排序,修改时对于整块打上标记,边界暴力重构排序数组,询问时二分答案,这样k=sqrt(nlogn)时取最优复杂度nsqrt(nlogn)logn, ...
- BZOJ4237 稻草人(分治+树状数组+单调栈)
如果要询问的某个纵坐标为inf的点左边是否有点能与其构成所要求的矩形,只要用个单调栈就可以了.可以想到用分治来制造单调性. 按横坐标排序,每次考虑跨过分治中心的矩形.考虑右边的每个点能与左边的哪些点构 ...
- bzoj 1934: [Shoi2007]Vote 善意的投票 (最小割)
原来是赞同的连源,原来是反对的连汇,然后是朋友的就连在一起,这样最小割就是割掉违背和谐的吧 type arr=record toward,next,cap:longint; end; const ma ...
- 51nod 1215 数组的宽度&poj 2796 Feel Good(单调栈)
单调栈求每个数在哪些区间是最值的经典操作. 把数一个一个丢进单调栈,弹出的时候[st[top-1]+1,i-1]这段区间就是弹出的数为最值的区间. poj2796 弹出的时候更新答案即可 #inclu ...
- ywy_c_asm题
未知出处 题意: 定义一个无穷长的数列,满足以下性质:$1.X_{2n}=-{X_{n}}$ $2.X_{2n}=(-1)^{(n+1)}*X_{n}$ $3.X_{2n-1}=(-1)^{(n+1) ...
- Redis 的安装配置介绍
redis 是一个高性能的key-value数据库. redis的出现,很大程度补偿了memcached这类keyvalue存储的不足,在部 分场合可以对关系数据库起到很好的补充作用.它提供了Pyth ...
- Linux 第30天: (08月5日) 练习和作业
变量脚本 1.编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小 server_ip=`if ...
- ACE反应器(Reactor)模式(4)
转载于:http://www.cnblogs.com/TianFang/archive/2006/12/18/596012.html 定时器的实现 通过Reactor机制,还可以很容易的实现定时器的功 ...
- STL之二:vector容器用法详解
转载于:http://blog.csdn.net/longshengguoji/article/details/8507394 vector类称作向量类,它实现了动态数组,用于元素数量变化的对象数组. ...
- [解决] User [dr.who] is not authorized to view the logs for application
在hadoop集群启用权限控制后,发现job运行日志的ui访问不了, User [dr.who] is not authorized to view the logs for application ...