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. linux常用文本编缉命令(strings/sed/awk/cut)

    一.strings strings--读出文件中的所有字符串 二.sed--文本编缉 类型 命令 命令说明 字符串替换 sed -i 's/str_reg/str_rep/' filename 将文件 ...

  2. cpu占用过高排查

    top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器 内容解释: PID:进程的ID USER:进程所有者 PR:进程的优先级别,越小 ...

  3. 牛客网 PAT 算法历年真题 1011 : 个位数统计 (15)

    个位数统计 (15) 时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小) 题目描述 给定一个k位整数N = dk-1*10k- ...

  4. 把旧系统迁移到.Net Core 2.0 日记(11) -- Authentication 认证 claimsIdentity 对比 之前的FormAuthentication

    实现最简单的认证,类似之前的FormAuthentication 在 Startup 的 ConfigureServices() 方法中添加 Authentication 的配置: 这个CookieA ...

  5. io重定向打开关闭 Eclipse中c开发printf无法输出解决办法

    if(freopen("e:\\lstm-comparec\\lstm\\lstm\\output.txt","a",stdout)==NULL)fprintf ...

  6. POJ 1458 最长公共子序列(dp)

    POJ 1458 最长公共子序列 题目大意:给出两个字符串,求出这样的一 个最长的公共子序列的长度:子序列 中的每个字符都能在两个原串中找到, 而且每个字符的先后顺序和原串中的 先后顺序一致. Sam ...

  7. 获取音、视频时长(NAudio,Shell32,FFmpeg)

    参考网址:https://blog.csdn.net/u013810234/article/details/57471780 以下为本次测试用到的音.视频格式: audio :”.wav;.mp3;. ...

  8. Kafka.net使用编程入门(二)

    1.首先创建一个Topic,命令如下: kafka-topics --create --zookeeper localhost:2181 --replication-factor 1 --partit ...

  9. url 传参数时出现中文乱码该怎么解决

    一般出现乱码都是在js裏面跳转到哪个类 然後得到这个参数的时候中文乱码,有一个非常实用的办法,在js你可以这样写:var url=........;url=encodeURI(url); url=en ...

  10. SpringMVC中文乱码的解决办法

    中文乱码分类: (1)按照请求分类: GET请求乱码 POST请求乱码 (2)按照乱码位置分类 从前台传到后台的数据乱码(存储到数据库中的数据乱码) 从后台传到前台的数据乱码(显示在页面的数据乱码) ...