失踪人口回来写题了。。

写了几乎一下午。贴一贴代码以及口糊一下。

 A、

  题意:计算一下这个多项式的和。

  题解:暴力算一算对每一项异或一下。

#include<bits/stdc++.h>
using namespace std;
int b,k;
int kk[100005];
int main()
{
cin>>b>>k;
for(int i=0;i<k;i++)cin>>kk[k-i];
int flag=0;
for(int i=1;i<=k;i++)
{
if(i==1)
{
int tmp=kk[i]%2;
flag^=tmp;
continue;
}
if(b%2==0)
{
int tmp=0;
flag^=tmp;
}
else
{
int tmp=kk[i]%2;
flag^=tmp;
}
}
if(flag)
{
cout<<"odd\n";
}
else cout<<"even\n";
}

 B、

   题意:用k条线段覆盖n个递增的点,求线段总长最短是多少。

   题解:因为有k条线段所以有k-1个间隔,然后自然就是差分一下排个序找一下这些间隔点,然后从前往后在间隔点加一下。

#include<bits/stdc++.h>
#include<complex>
#define db double
#define ll long long
#define mp make_pair
#define fi first
#define pb push_back
#define se second
#define rep(i,a,b)for(int i=a;i<=b;i++)
using namespace std;
const double pi=acos(-1);
const int maxn=1e5+7;
inline ll read()
{
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int n,m,k;
int vs[maxn];
struct node
{
int id,val;
friend bool operator<(node a,node b)
{
return a.val>b.val;
}
}vv[maxn];
int cnt=0;
int vis[maxn];
int main()
{
int i;
n=read();m=read();k=read();
int las=0; for(i=0;i<n;i++)
{
vs[i]=read();
if(i==0)las=vs[i];
vv[i].val=vs[i]-las;
las=vs[i];
vv[i].id=i;
}
sort(vv,vv+n);
for(i=0;i<k-1;i++)
{
if(vv[i].id==0)vis[vv[i].id]=1;
else vis[vv[i].id-1]=1;
//cout<<vv[i].id-1<<"\n";
}
las=vs[0];
ll ans=0;
for(int i=0;i<n;i++)
{
if(vis[i])
{
ans+=vs[i]-las+1;
las=vs[i+1];
}
}
ans+=vs[n-1]-las+1;
cout<<ans<<"\n";
}

  

 C、

  题意:f(a)=maxgcd(a⊕b,a&b) 就是给你一个a然后找一个0<b<a使得这个式子最大。

  题解:随便试一试就发现一些异或和与的性质起到了作用。就如果不是2^x-1那答案就是它。因为可以弄成0和7。如果是2^x-1那ans=max gcd(2^x-1-b,b),

这个东西sqrt(n)枚举一下最大因子,因为可以分成两部分就行。

#include<bits/stdc++.h>
#include<complex>
#define db double
#define ll long long
#define mp make_pair
#define fi first
#define pb push_back
#define se second
#define rep(i,a,b)for(int i=a;i<=b;i++)
using namespace std;
const double pi=acos(-1);
const int maxn=1e5+7;
inline ll read()
{
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int k;
int main()
{
int q=read();
while(q--)
{
k=read();
int st=2;
int flag=1;
for(int i=2;i<=25;i++)
{
st*=2;
if(k==st-1){flag=0;break;}
if(k<st-1){break;}
}
if(flag){cout<<st-1<<"\n";continue;}
for(int i=2;i<=sqrt(k+0.5);i++)
{
if(k%i==0)
{
cout<<k/i<<"\n";
flag=1;
break;
}
}
if(!flag)cout<<1<<"\n";
}
}

  

 D、

  开始不会做的题了。

  题意:就给了一堆数字,问组成三个相邻数或者三个相同数字,这样最多能组成多少个三元组。

  题解:这种题第一眼肯定以为是排个序然后怎么贪心嘛。随便试了试过不了样例,瞄一眼发现是dp。想了好久发现想不清楚,做法也假了。就感觉一维是不够的但好像2维也没什么用,答案是三维。。。其实这个做法挺直觉也挺神的,如果三元组数量多于三个就显然可以退化成三个aaabbbccc这样子。所以可以%3,一个位置有影响的就三个情况,它作为最左,中间,最右,因而dp[n][3][3]。Tutorial的思想就是定义dp[i][t1][t2]。那么就能转移动dp[i+1][t2][t3]。初始值好像怎么设都能过。但是从一些非法转移的角度应该设负无穷?我一直没弄明白很多dp里初始值的问题。。。

  

#include<bits/stdc++.h>
#include<complex>
#define db double
#define ll long long
#define mp make_pair
#define fi first
#define pb push_back
#define se second
#define rep(i,a,b)for(int i=a;i<=b;i++)
using namespace std;
const double pi=acos(-1);
const int maxn=1e5+7;
inline ll read()
{
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int k;
int main()
{
int q=read();
while(q--)
{
k=read();
int st=2;
int flag=1;
for(int i=2;i<=25;i++)
{
st*=2;
if(k==st-1){flag=0;break;}
if(k<st-1){break;}
}
if(flag){cout<<st-1<<"\n";continue;}
for(int i=2;i<=sqrt(k+0.5);i++)
{
if(k%i==0)
{
cout<<k/i<<"\n";
flag=1;
break;
}
}
if(!flag)cout<<1<<"\n";
}
}

  

 E、

  题意:给两个序列,问能否通过a(i)'=a(i+1)+a(i-1)-a(i)这个操作把一个变成另一个。

  题解:考虑差分序列。。。。。然后就猜猜猜,注意要特判原序列的头尾。具体推导当然是看的题解。。话说,这种题以前是看到有人说要去想差分的。

  

#include<bits/stdc++.h>
#include<complex>
#define db double
#define ll long long
#define mp make_pair
#define fi first
#define pb push_back
#define se second
#define rep(i,a,b)for(int i=a;i<=b;i++)
using namespace std;
const double pi=acos(-1);
const int maxn=1e5+7;
inline ll read()
{
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
ll a[maxn],b[maxn],c[maxn],d[maxn];
int n;
int main()
{
n=read();
for(int i=1;i<=n;i++)
{
a[i]=read();
}
for(int i=1;i<=n;i++)b[i]=read();
a[0]=b[0]=0;
for(int i=1;i<=n;i++)c[i]=a[i]-a[i-1],d[i]=b[i]-b[i-1];
sort(c+1,c+1+n);sort(d+1,d+1+n);
int flag=0;
for(int i=1;i<=n;i++)
{
if(c[i]!=d[i]){flag=1;break;}
}
if(!flag&&a[1]==b[1]&&a[n]==b[n])cout<<"Yes\n";
else cout<<"No\n";
}

  

  F、

  题意:给一颗树,然后dfs序就是1~N。Q次询问,每个询问回答一个点到(l,r)区间内中叶子节点距离的最小值。

  题解:离线做法,就如果所询问的区间不在这个子树中就是depth(x)+query(l,r)这样的一个东西。如果是在子树中那就是query(l,r)-depth(x)。像树剖那样子,肯定形成了一个连续的区间,所以考虑用线段树进行处理。第一遍dfs将叶子的值设为深度,非叶子inf。然后第二遍dfs时在dfs一个节点的某个儿子时,将线段树这个子树区间剪掉2*w,w是这条边的权值。此时所有情况都是depth(x)+query(l,r)。因为只有他的子树是被减去的,类似就是depth(x)+query'(l,r),其中query'(l,r)=query(l,r)-2*w。然后dfs完这个子树后再加回去。效果其实就是depth(x)+query(l,r)-2*depth(lca)。所以感觉会树上差分+dfs什么的应该能想到。感觉自己一知半解,只会写代码。

题解:感觉这个lca什么的叙述有问题,还是按照更general的方法写一下,就是当你dfs一个点的某个子节点时,对于该子节点的这颗子树中的所有节点来说,换根后深度都要剪掉w,而到其余点的深度要加上w。所以可以给这个区间剪掉2w,在统计答案时把多剪掉的这部分答案加上,多剪掉的实则是在从1一直dfs到v这条链上每条边的权值,也就是在1为根时v这个点的深度。

  

#include<bits/stdc++.h>
#include<complex>
#define db double
#define ll long long
#define mp make_pair
#define fi first
#define pb push_back
#define se second
#define rep(i,a,b)for(int i=a;i<=b;i++)
#define ls (x<<1)
#define rs (x<<1|1)
using namespace std;
const double pi=acos(-1);
const int maxn=5e5+7;
inline ll read()
{
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
ll val[maxn<<2],laz[maxn<<2];
int fiv[maxn],lav[maxn];
vector<pair<int,ll> >vec[maxn];
vector<int>Q[maxn];
int L[maxn],R[maxn];
ll ans[maxn];
ll depth[maxn];
int cnt;
int n,q;
void push_down(int x)
{
if(laz[x])
{
val[ls]+=laz[x];
laz[ls]+=laz[x];
val[rs]+=laz[x];
laz[rs]+=laz[x];
laz[x]=0;
}
}
void update(int x,int l,int r,int L,int R,ll tt)
{
if(L<=l&&r<=R)
{
val[x]+=tt;laz[x]+=tt;
return;
}
push_down(x);
int mid=(l+r)>>1;
if(L<=mid)update(ls,l,mid,L,R,tt);
if(R>mid)update(rs,mid+1,r,L,R,tt);
val[x]=min(val[ls],val[rs]);
}
ll query(int x,int l,int r,int L,int R)
{
if(L<=l&&r<=R)
{
return val[x];
}
push_down(x);
int mid=(l+r)>>1;
ll res=1e18;
if(L<=mid)res=min(res,query(ls,l,mid,L,R));
if(R>mid)res=min(res,query(rs,mid+1,r,L,R));
return res;
}
void dfs1(int x)
{
fiv[x]=++cnt;
if(!vec[x].size())update(1,1,n,fiv[x],fiv[x],depth[x]);
else update(1,1,n,fiv[x],fiv[x],1e18);
for(int i=0;i<(int)vec[x].size();i++)
{
int tt=vec[x][i].fi;ll w=vec[x][i].se;
depth[tt]=depth[x]+w;dfs1(tt);
}
lav[x]=cnt;
}
void dfs2(int x)
{
for(int i=0;i<(int)Q[x].size();i++)
{
int tt=Q[x][i];
ans[tt]=depth[x]+query(1,1,n,L[tt],R[tt]);
}
for(int i=0;i<(int)vec[x].size();i++)
{
int tt=vec[x][i].fi;ll w=vec[x][i].se;
update(1,1,n,fiv[tt],lav[tt],-2*w);
dfs2(tt);
update(1,1,n,fiv[tt],lav[tt],2*w);
}
}
int main()
{
n=read();q=read();
int pi,wi;
for(int i=2;i<=n;i++)
{
pi=read();wi=read();
vec[pi].pb(mp(i,wi));
}
for(int i=1;i<=q;i++)
{
pi=read();Q[pi].pb(i);
L[i]=read();R[i]=read();
}
dfs1(1);
dfs2(1);
for(int i=1;i<=q;i++)cout<<ans[i]<<"\n";
}

  

  

  

  

Codeforces Global Round 1 A~F的更多相关文章

  1. CodeForces Global Round 1

    CodeForces Global Round 1 CF新的比赛呢(虽然没啥区别)!这种报名的人多的比赛涨分是真的快.... 所以就写下题解吧. A. Parity 太简单了,随便模拟一下就完了. B ...

  2. Codeforces Global Round 2 题解

    Codeforces Global Round 2 题目链接:https://codeforces.com/contest/1119 A. Ilya and a Colorful Walk 题意: 给 ...

  3. Codeforces Global Round 3

    Codeforces Global Round 3 A. Another One Bites The Dust 有若干个a,有若干个b,有若干个ab.你现在要把这些串拼成一个串,使得任意两个相邻的位置 ...

  4. Codeforces Global Round 1 (CF1110) (未完结,只有 A-F)

    Codeforces Global Round 1 (CF1110) 继续补题.因为看见同学打了这场,而且涨分还不错,所以觉得这套题目可能会比较有意思. 因为下午要开学了,所以恐怕暂时不能把这套题目补 ...

  5. Codeforces Global Round 1 - D. Jongmah(动态规划)

    Problem   Codeforces Global Round 1 - D. Jongmah Time Limit: 3000 mSec Problem Description Input Out ...

  6. Codeforces Global Round 1 (A-E题解)

    Codeforces Global Round 1 题目链接:https://codeforces.com/contest/1110 A. Parity 题意: 给出{ak},b,k,判断a1*b^( ...

  7. 【手抖康复训练1 】Codeforces Global Round 6

    [手抖康复训练1 ]Codeforces Global Round 6 总结:不想复习随意打的一场,比赛开始就是熟悉的N分钟进不去时间,2333,太久没写题的后果就是:A 题手抖过不了样例 B题秒出思 ...

  8. Codeforces Global Round 11 个人题解(B题)

    Codeforces Global Round 11 1427A. Avoiding Zero 题目链接:click here 待补 1427B. Chess Cheater 题目链接:click h ...

  9. 树形DP ---- Codeforces Global Round 2 F. Niyaz and Small Degrees引发的一场血案

    Aspirations:没有结果,没有成绩,acm是否有意义?它最大的意义就是让我培养快速理解和应用一个个未知知识点的能力. ————————————————————————————————————— ...

随机推荐

  1. java集合(1)

    java集合类存放于java.util包里,只能存放对象,存放的是对象的引用,可以是不同类型,不限数量的数据类型. 顶层接口:Iterator(迭代器),Map Iterator:核心方法hasNex ...

  2. js 滚轮控制图片缩放大小和拖动

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. (四) Keras Dropout和正则化的使用

    视频学习来源 https://www.bilibili.com/video/av40787141?from=search&seid=17003307842787199553 笔记 使用drop ...

  4. No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android"

    安装完NDK的时候出现了这个错误,网上的办法是下载旧版的NDK,将其中的toolchain复制到新版的NDK中. 但其实不用这么麻烦. 经过对新版NDK的研究,发现NDK的更新记录里有一段话 This ...

  5. JVM内存结构,运行机制

    三月十号,白天出去有事情出去了一天,晚上刚到食堂就接到阿里电话, 紧张到不行,很多基础的问题都不知道从哪里说了orz: 其中关于JVM内存结构,运行机制,自己笔记里面有总结的,可当天还是一下子说不出来 ...

  6. hbase 过滤器 rowfilter

    HBase为筛选数据提供了一组过滤器,通过这个过滤器可以在HBase中的数据的多个维度(行,列,数据版本)上进行对数据的筛选操作,也就是说过滤器最终能够筛选的数据能够细化到具体的一个存储单元格上(由行 ...

  7. c#面试题汇总(1)

    c#面试题汇总 From: https://www.cnblogs.com/suzhiyong1988/p/5069385.html   下面的参考解答只是帮助大家理解,不用背,面试题.笔试题千变万化 ...

  8. 解析SQL Server之任务调度

    在前面两篇文章中( 浅谈SQL Server内部运行机制 and 浅谈SQL Server数据内部表现形式 ),我们交流了一些关于SQL Server的一些术语,SQL Sever引擎 与SSMS抽象 ...

  9. 【学习记录】第一章 数据库设计-《SQL Server数据库设计和开发基础篇视频课程》

    一.课程笔记 1.1  软件开发周期 (1)需求分析阶段 分析客户的业务和数据处理需求. (2)概要设计阶段 设计数据库的E-R模型图,确认需求信息的正确和完整. /* E-R图:实体-关系图(Ent ...

  10. RocketMQ4.3.x 史上配置最全详解,没有之一

    最近整理了RocketMQ的配置参数一部分参考rocketmq技术内幕,一部分自己看源码猜测,有表述不清楚或不正确请广大网友指正 这里应该是最全的配置解析了,搞了2天.以后查询就好办了,仅此贡献给广大 ...