A .DZY Loves Physics

题意:给定带点权和边权的无向图,现在让你选一些点,使得 点权和/被选点对间的边权和 最大。

思路:不难证明,选择边和对应的两点是最优的。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
double a[maxn],ans;
int main()
{
int N,M,u,v; double x;
scanf("%d%d",&N,&M);
rep(i,,N) scanf("%lf",&a[i]);
rep(i,,M){
scanf("%d%d%lf",&u,&v,&x);
ans=max(ans,(a[u]+a[v])/x);
}
printf("%.10lf\n",ans);
return ;
}

B .DZY Loves FFT

题意:给定a数组,范围是1到N;b数组,是0或者1 。a数组和b数组都是随机的。 然后给定规则,ci=max(aj*bk);满足i=j+k。现在让你求c数组。

思路: 如果b的1的个数比较少,比如num=少于100,我们可以直接暴力,复杂度O(num*N); 如果1的个数比较多,那么我们可以大胆猜测,排名在前面的S个可以去更新很多地方的答案,假设S=40。 那么只剩下很少的没有被更新,对于这些,我们去暴力更新即可。 复杂度O(40*N+...)

#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
int N,D,a[maxn],b[maxn],c[maxn],tot;
int pos[maxn],ans[maxn],X;
int getNextX(){
X=(37LL*X+)%;
return X;
}
int initAB() {
rep(i,,N-) a[i]=i+;
rep(i,,N-) swap(a[i],a[getNextX()%(i+)]);
rep(i,,N-){
if(i<D) b[i]=;
else b[i]=;
}
rep(i,,N-) swap(b[i],b[getNextX()%(i+)]);
}
void get(int p)
{
rep(j,,tot){
if(c[j]>p) break;
ans[p]=max(ans[p],a[p-c[j]]);
}
}
int main()
{
scanf("%d%d%d",&N,&D,&X);
initAB();
rep(i,,N-) pos[a[i]]=i;
rep(i,,N-) if(b[i]) c[++tot]=i;
if(D<){
rep(i,,N-)
rep(j,,tot)
ans[i+c[j]]=max(ans[i+c[j]],a[i]);
}
else {
int B=min(N-,);
rep(i,N-B,N){
int p=pos[i];
rep(j,,tot) {
if(c[j]>N-p) break;
ans[p+c[j]]=max(ans[p+c[j]],a[p]);
}
}
rep(i,,N-) if(!ans[i]) get(i);
}
rep(i,,N-) printf("%d\n",ans[i]);
return ;
}

C .DZY Loves Colors

题意:有一排物体,一开始颜色分别是1到N。假如一个物体颜色是col,修改为x,那么他增加的炫丽度=abs(col-x);现在进行Q次操作,1操作是区间修改颜色; 2操作是询问区间炫丽度之和。(N<1e5);

思路:由于要查询区间炫丽度,所以还没法用老司机树,毕竟odt没有历史记录。 所以我们还是用线段树,依然是利用其相同线段的势能关系来解决这个问题。

我们对于颜色相同的区间,可以对其进行lazy操作。  lazy维护一个颜色,和一个加的值。 这样的话,有些中间的变化量就可以不用去考虑了。

#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
int col[maxn]; ll add[maxn],sum[maxn];
void build(int Now,int L,int R)
{
if(L==R){ col[Now]=L;return;}
int Mid=(L+R)>>;
build(Now<<,L,Mid);
build(Now<<|,Mid+,R);
}
void pushdown(int Now,int L,int R)
{
if(col[Now]){
col[Now<<]=col[Now<<|]=col[Now];
}
if(add[Now]) {
int Mid=(L+R)>>;
sum[Now<<]+=1LL*(Mid-L+)*add[Now];
sum[Now<<|]+=1LL*(R-Mid)*add[Now];
add[Now<<]+=add[Now]; add[Now<<|]+=add[Now];
add[Now]=;
}
}
void pushup(int Now)
{
sum[Now]=sum[Now<<]+sum[Now<<|];
if(col[Now<<]==col[Now<<|]) col[Now]=col[Now<<];
else col[Now]=;
}
void update(int Now,int L,int R,int l,int r,int x)
{
if(l<=L&&r>=R&&col[Now]){
add[Now]+=abs(x-col[Now]);
sum[Now]+=1LL*abs(x-col[Now])*(R-L+);
col[Now]=x; return ;
}
pushdown(Now,L,R); int Mid=(L+R)>>;
if(l<=Mid) update(Now<<,L,Mid,l,r,x);
if(r>Mid) update(Now<<|,Mid+,R,l,r,x);
pushup(Now);
}
ll query(int Now,int L,int R,int l,int r)
{
if(l<=L&&r>=R) return sum[Now];
pushdown(Now,L,R); int Mid=(L+R)>>; ll res=;
if(l<=Mid) res+=query(Now<<,L,Mid,l,r);
if(r>Mid) res+=query(Now<<|,Mid+,R,l,r);
pushup(Now); return res;
}
int main()
{
int N,M,opt,L,R,x;
scanf("%d%d",&N,&M);
build(,,N);
rep(i,,M){
scanf("%d%d%d",&opt,&L,&R);
if(opt==){
scanf("%d",&x);
update(,,N,L,R,x);
}
else printf("%lld\n",query(,,N,L,R));
}
return ;
}

D .DZY Loves Strings

题意:给定一个字符串S,然后Q次询问,每次询问给出s和t,|s|,|t|<=4;问包含s和t的最短区间是多长。 |S|<5e4。

思路:我们可以把S的所有长度为1到4的子串都提出来,(由于不长感觉不会出现碰撞,单hash就够了)。

然后对于每次询问,我们可以对含s的部分,和含t的部分找最近的地方。即两个集合,在属于不同集合的最近的点对,这里可以用双指针做到线性,单次的复杂度和较小的集合大小有关。  同时,用map记录一下,避免多次出现极端数据。

#include<bits/stdc++.h>
#define pii pair<int,int>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
map<pii,int>mp;
vector<int>G[maxn];
char c[maxn],a[maxn],b[maxn];
int main()
{
int N,Q;
scanf("%s",c+);
N=strlen(c+);
rep(i,,)
rep(j,,N-i+){
int t=;
rep(k,j,j+i-) t=t*+c[k]-'';
G[t].push_back(j);
}
scanf("%d",&Q);
while(Q--){
scanf("%s%s",a+,b+);
int ta=,tb=,L1,L2,ans=maxn;
L1=strlen(a+); rep(i,,L1) ta=ta*+a[i]-'';
L2=strlen(b+); rep(i,,L2) tb=tb*+b[i]-'';
if(mp.find(pii(ta,tb))!=mp.end()){
printf("%d\n",mp[pii(ta,tb)]);
continue;
}
int sz1=G[ta].size(),sz2=G[tb].size();
int p1=,p2=;
while(p1<sz1&&p2<sz2){
while(G[tb][p2]<G[ta][p1]){
p2++; if(p2>=sz2) break;
}
if(p2<sz2)ans=min(ans,max(G[tb][p2]+L2,G[ta][p1]+L1)-G[ta][p1]);
p1++;
}
p1=p2=;
while(p1<sz1&&p2<sz2){
while(G[ta][p1]<G[tb][p2]){
p1++; if(p1>=sz1) break;
}
if(p1<sz1)ans=min(ans,max(G[ta][p1]+L1,G[tb][p2]+L2)-G[tb][p2]);
p2++;
}
if(ans==maxn) ans=-;
mp[pii(ta,tb)]=ans;
printf("%d\n",ans);
}
return ;
}

CF444(Div. 1简单题解)的更多相关文章

  1. CF449 (Div. 1简单题解)

    A .Jzzhu and Chocolate pro:现在给定一个大小为N*M的巧克力,让你横着或者竖着切K刀,都是切的整数大小,而且不能切在相同的地方,求最大化其中最小的块. (N,M,K<1 ...

  2. CF446 (Div. 1)简单题解

    A .DZY Loves Sequences pro:给定长度为N的序列,你最多可以改变一个数的值,问最长严格上升子序列长度. N<1e5. sol:分几种情况,一种的不改变: 一种是改变,然后 ...

  3. # Codeforces Round #529(Div.3)个人题解

    Codeforces Round #529(Div.3)个人题解 前言: 闲来无事补了前天的cf,想着最近刷题有点点怠惰,就直接一场cf一场cf的刷算了,以后的题解也都会以每场的形式写出来 A. Re ...

  4. Codeforces Round #557 (Div. 1) 简要题解

    Codeforces Round #557 (Div. 1) 简要题解 codeforces A. Hide and Seek 枚举起始位置\(a\),如果\(a\)未在序列中出现,则对答案有\(2\ ...

  5. Codeforces Round #538 (Div. 2) (A-E题解)

    Codeforces Round #538 (Div. 2) 题目链接:https://codeforces.com/contest/1114 A. Got Any Grapes? 题意: 有三个人, ...

  6. Codeforces Round #531 (Div. 3) ABCDEF题解

    Codeforces Round #531 (Div. 3) 题目总链接:https://codeforces.com/contest/1102 A. Integer Sequence Dividin ...

  7. Codeforces Round #499 (Div. 1)部分题解(B,C,D)

    Codeforces Round #499 (Div. 1) 这场本来想和同学一起打\(\rm virtual\ contest\)的,结果有事耽搁了,之后又陆陆续续写了些,就综合起来发一篇题解. B ...

  8. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  9. Codeforces Beta Round #83 (Div. 1 Only)题解【ABCD】

    Codeforces Beta Round #83 (Div. 1 Only) A. Dorm Water Supply 题意 给你一个n点m边的图,保证每个点的入度和出度最多为1 如果这个点入度为0 ...

随机推荐

  1. 把旧系统迁移到.Net Core 2.0 日记 (18) --JWT 认证(Json Web Token)

    我们最常用的认证系统是Cookie认证,通常用一般需要人工登录的系统,用户访问授权范围的url时,会自动Redirect到Account/Login,登录后把认证结果存在cookie里. 系统只要找到 ...

  2. web前端开发面试题(答案)

    1.xhtml和html有什么区别? HTML是一种基本的WEB网页设计语言,XHTML是一个基于XML的置标语言最主要的不同:XHTML 元素必须被正确地嵌套.XHTML 元素必须被关闭.标签名必须 ...

  3. linux下crontab的原理和用法

    linux 系统则是由 cron (crond) 这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的.另 外, 由于使用者自己也可以设置计划任务,所以, ...

  4. MySQL(二) MySQL基本操作

    数据库的基本操作 启动关闭 MySQL 服务 MySQL 安装好后,默认是当 Windows 启动.停止时,MySQL 也自动.停止.不过,用户可以使用 Windows 下的服务管理器或从命令行使用 ...

  5. learning at commad AT+CPSI

    [Purpose] Learning how to get mobile network info [Eevironment] Shell terminal, base on gcom command ...

  6. Java冒泡排序与选择排序

    Java排序: 一.冒泡排序算法的运作如下: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. ...

  7. day27-python阶段性复习-基础

    一.基础资料,安装python Python 跨平台的,(Linux,Windows,mac) 网站www.python.org 解释器交互方式 Ipython Python shell https: ...

  8. 5.10 C++内存管理操作符重载

    参考:http://www.weixueyuan.net/view/6388.html 注意: 内存管理操作符new.new[].delete和delete[]同样也可以进行操作符重载,其重载形式既可 ...

  9. div 内 图片 垂直居中

    vertical-align属性适用于 line-block: <div class="title"> <img src="img_p1_title.p ...

  10. Jmeter响应中中文乱码怎么解决

    在jmeter的bin目录下有一个jmeter.properties的文件,打开它,搜索sampleresult.default.encoding,把它的注释打开,也就是把最前面的#去掉,改成samp ...