A-XOR SUM

通过简单观察得知连续四个数的异或值就是等于0,暴力找出左区间和右区间就可以了,最多跑四个单位

0^1^2^3==0   4^5^6^7=0

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=(b);++i)
#define mem(a,x) memset(a,x,sizeof(a))
#define pb push_back
#define pi pair<int, int>
#define mk make_pair
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}ll l,r;
int main()
{// printf("%lld\n",(1ll*133)^(1ll*134));int _;cin>>_;while(_--){scanf("%lld%lld",&l,&r);if(r-l+1<=10){ll res=0;for(ll i=l;i<=r;++i) res^=i;printf("%lld\n",res);continue;}ll ql=l,qr=r;while(ql%4!=0){++ql;}while(qr%4!=0) --qr;//printf("l:%lld r:%lld ql:%lld qr:%lld\n",l,r,ql,qr);ll ans=0;for(ll i=l;i<ql;++i) ans^=i;for(ll i=r;i>=qr;--i) ans^=i;printf("%lld\n",ans);}
}

B-Codeforces

从小到大排序,每三个分在一个组即可。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=(b);++i)
#define mem(a,x) memset(a,x,sizeof(a))
#define pb push_back
#define pi pair<int, int>
#define mk make_pair
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
const int N=1e6+10;
int a[N];
const int inf=0x3f3f3f3f;
int main()
{int n;cin>>n;n=3*n;for(int i=1;i<=n;++i)scanf("%d",&a[i]);sort(a+1,a+1+n);int ans=0;for(int i=1;i<=n;i=i+3){ans=max(ans,a[i+2]-a[i]);}cout<<ans<<endl;
}

C-求和公式

题意是求这个:

那么化简一下:

左边

就可以用整除分块做法了

同理右边:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll powmod(ll a,ll b)
{ll res=1;for(;b;b>>=1){if(b&1) res=res*a%mod;a=a*a%mod;}return res;
}
ll inv(ll x)
{return powmod(x,mod-2);
}
ll getn2(ll n)
{return n*(n+1)%mod*(2*n+1)%mod*inv(6)%mod;
}
ll getn3(ll n)
{return ((n+1)*n%mod*(2+(n-1)*(n+2)%mod)%mod)%mod*powmod(4,mod-2)%mod;
}
ll caly(ll n)
{ll ans=0;for(int l=1,r;l<=n;l=r+1){r=n/(n/l);ll tmp=(getn2(r)-getn2(l-1)+mod)%mod;ans=(ans+tmp*(n/l)%mod)%mod;}return (n*n%mod*(n+1)%mod*inv(2)%mod-ans+mod)%mod;
}ll calx(ll n)
{ll ans=0;for(int l=1,r;l<=n;l=r+1){r=n/(n/l);ll tmp=(getn3(r)-getn3(l-1)+mod)%mod;ans=(ans+tmp*(n/l)%mod)%mod;}return (n*getn2(n)%mod-ans+mod)%mod;
}
int main()
{ll n,m;cin>>n>>m;ll ans1=calx(n);ll ans2=caly(m);printf("%lld\n",ans1*ans2%mod);return 0;
}

D 签到题。。

E-XOR 这题可能难了点。。

题解来自:https://www.jianshu.com/p/d0a873046b37

嗯!很妙的做法

#include <bits/stdc++.h>using namespace std;typedef long long ll;
int a[100];
int res[100];
ll f[100];int main()
{f[0] = 1;for(int i = 1;i<55;i++)f[i] = f[i-1] * 2;ll m;int n;cin >> n >> m;for(int i = 0 ; i < n ;i ++){ll num;scanf("%lld",&num);int id = 0;while(num){if(num%2)   a[id] ++;id++;num /= 2;}}int maxv =  51;for(int i = 0 ; i < maxv ; i++){int now = min(a[i] , n - a[i]);m -= 1ll * f[i] * now;if(now == n - a[i]){res[i] = 1;}}if(m < 0){printf("-1\n");return 0;}for(int i =maxv - 1 ;i >= 0 ; i--){if(res[i])  continue;int now = n - a[i];if(1ll * now * f[i] - 1ll * a[i] * f[i] <= m){res[i] = 1;m -= 1ll * now * f[i] - 1ll * a[i] * f[i];}}ll ans = 0;for(int i = 0 ; i < maxv ; i++){if(res[i]) ans += f[i];}printf("%lld\n",ans);return 0;
}

F-二分背包容量暴力bfs 更新每个点最大车票数量即可,注意这里不需要dij 也就是不需要套一个优先队列,不然会超时,优先队列的话时间复杂度就高了一个log

其实很水,无奈自己很久没写图论题的代码了,生疏了,wa了很多发。。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=(b);++i)
#define mem(a,x) memset(a,x,sizeof(a))
#define pb push_back
#define pi pair<int, int>
#define mk make_pair
using namespace std;
typedef long long ll;
const int N=8e5+10,M=8e5+10;
bool vis[N];
int n,m,k,s,t,u,v,w;
int input(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();return s*w;
}
struct node
{int u,k;bool operator <(const node &o)const {k<o.k;}
};
struct edge
{int to,next,w;
}e[M];
int head[N],cnt;
void add_edge(int u,int v,int w)
{e[++cnt]={v,head[u],w};head[u]=cnt;
}
int dis[N];
int bfs(int mid)
{for(int i=1;i<=n;++i)dis[i]=-1;queue<node>que;que.push({s,k});dis[s]=k;while(que.size()){node now=que.front();que.pop();if(now.u==t) return 1;for(int i=head[now.u];i;i=e[i].next){int v=e[i].to,w=e[i].w;if(w>mid){if(now.k>0&&dis[v]<now.k-1){dis[v]=now.k-1;que.push({v,dis[v]});}}else{if(dis[v]<now.k)que.push({v,now.k}),dis[v]=now.k;}}}if(dis[t]>-1) return 1;return 0;
}
int main()
{scanf("%d%d%d%d%d",&n,&m,&k,&s,&t);int mx=0;for(int i=1;i<=m;++i){scanf("%d%d%d",&u,&v,&w);mx=max(mx,w);add_edge(u,v,w);add_edge(v,u,w);}int l=0,r=mx;int ans=-1;while(l<=r){int mid=l+r>>1;if(bfs(mid)) ans=mid,r=mid-1;else l=mid+1;}printf("%d\n",ans);
}
/*
7 8 1
1 6
1 2 100
2 3 100
2 4 99
4 5 99
5 3 99
3 6 100
4 7 88
7 6 88
*/

H-简单树上操作

很明显换根dp,设mx[u] 为u子树内离u节点最远的长度,s[u]为离u节点长度为mx[u]的数量。。

然后O(n) 换根统计s[u]即可。。。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3e5+10;
vector<int>G[N];int n,st1;
ll d[N],diameter;
ll mx[N],s[N];void bfs1(int id,int fa)
{if(d[id]>diameter) st1=id,diameter=d[id];for(int v:G[id]){if(v==fa) continue;d[v]+=d[id];bfs1(v,id);}
}void dfs1(int u,int fa)
{for(int v:G[u]){if(v==fa) continue;dfs1(v,u);if(mx[u]<mx[v]+1){mx[u]=mx[v]+1;s[u]=s[v];}else if(mx[u]==mx[v]+1){s[u]+=s[v];}}
}
ll ans=0;
vector<pair<int,int> >pre[N];
void dfs2(int u,int fa)
{mx[u]=1;s[u]=1;for(int v:G[u]){//printf("v:%d\n",v);if(mx[u]<mx[v]+1){mx[u]=mx[v]+1;s[u]=s[v];}else if(mx[u]==mx[v]+1){s[u]+=s[v];}//printf("v:%d mx:%lld s:%lld\n",v,mx[u],s[u]);pre[u].push_back(make_pair(mx[u],s[u]));}if(mx[u]==diameter){ans+=s[u];}//printf("u:%d mx:%lld s:%lld\n",u,mx[u],s[u]);pair<int,int>tmp=make_pair(1,1);for(int i=G[u].size()-1;i>=0;--i){int v=G[u][i];mx[u]=tmp.first;s[u]=tmp.second;if(i!=0){if(tmp.first==pre[u][i-1].first){mx[u]=tmp.first;s[u]=tmp.second+pre[u][i-1].second;}else if(tmp.first>pre[u][i-1].first){mx[u]=tmp.first;s[u]=tmp.second;}else{mx[u]=pre[u][i-1].first;s[u]=pre[u][i-1].second;}}if(mx[v]+1>tmp.first){tmp.first=mx[v]+1;tmp.second=s[v];}else if(mx[v]+1==tmp.first){tmp.second+=s[v];}if(v!=fa) dfs2(v,u);}
}int main()
{scanf("%d",&n);for(int i=1;i<n;++i){int u,v;scanf("%d%d",&u,&v);G[u].push_back(v);G[v].push_back(u);}for(int i=1;i<=n;++i) d[i]=1;bfs1(1,0);diameter=0;for(int i=1;i<=n;++i) d[i]=1;bfs1(st1,0);//printf("st1:%d 直径:%d\n",st1,diameter);for(int i=1;i<=n;++i) {mx[i]=s[i]=1;}dfs1(1,0);dfs2(1,0);printf("%lld\n",ans);}

I-简单区间操作 经典的线段树操作了。。。

不为零就暴力更新,为零标记一下为1,每次更新发现标志为1,则不再继续更新

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
typedef long long ll;
int mi[4*N];
ll a[4*N];
int n,q;
void build(int id,int l,int r)
{if(l==r){scanf("%lld",&a[id]);return ;}int mid=l+r>>1;build(id<<1,l,mid);build(id<<1|1,mid+1,r);a[id]=a[id<<1]+a[id<<1|1];
}
ll qu(int id,int l,int r,int ql,int qr)
{if(ql<=l&&r<=qr){return a[id];}ll res=0;int mid=l+r>>1;if(ql<=mid) res+=qu(id<<1,l,mid,ql,qr);if(qr>mid) res+=qu(id<<1|1,mid+1,r,ql,qr);return res;
}
void up(int id,int l,int r,int ql,int qr)
{if(l==r){a[id]=a[id]/2;if(a[id]==0) mi[id]=1;return ;}if(mi[id]) return ;int mid=l+r>>1;if(ql<=mid) up(id<<1,l,mid,ql,qr);if(qr>mid) up(id<<1|1,mid+1,r,ql,qr);a[id]=a[id<<1]+a[id<<1|1];if(mi[id<<1]&&mi[id<<1|1]) mi[id]=1;
}
int main()
{scanf("%d%d",&n,&q);build(1,1,n);while(q--){int ty,l,r;scanf("%d%d%d",&ty,&l,&r);if(ty==1){up(1,1,n,l,r);}else{printf("%lld\n",qu(1,1,n,l,r));}}
}

J-The center of tree

题解:

总结:

dp+倍增+lca

代码:

/*lca + dp */
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
vector<ll>G[N];
int n;
ll dep[N],fa[N][32];
ll ff[30];
struct node
{ll x,y;ll mx;
}a[N];void dfs(ll u,ll f,ll d)
{fa[u][0]=f;dep[u]=d;for(ll v:G[u]){if(v==f) continue;dfs(v,u,d+1);}
}
void init()
{for(int k=1;k<=21;++k){for(int i=1;i<=n;++i){fa[i][k]=fa[fa[i][k-1]][k-1];}}
}
int lca(int u,int v)
{if(dep[u]<dep[v]) swap(u,v);for(int k=21;k>=0;--k)if(dep[fa[u][k]]>=dep[v])u=fa[u][k];if(u==v) return v;for(int k=21;k>=0;--k){if(fa[v][k]!=fa[u][k]) v=fa[v][k],u=fa[u][k];}return fa[v][0];
}
ll qulen(int u,int v)
{return dep[u]+dep[v]-2*dep[lca(u,v)]+1;
}
void dfs1(int u,int fa)
{for(int v:G[u]){if(v==fa) continue;dfs1(v,u);int x=a[u].x,y=a[u].y;int x1=a[v].x,y1=a[v].y;ll l1=qulen(x,x1);ll l2=qulen(x,y1);ll l3=qulen(x1,y);ll l4=qulen(y1,y);if(a[v].mx>a[u].mx){a[u].mx=a[v].mx;a[u].x=a[v].x;a[u].y=a[v].y;}if(l1>a[u].mx){a[u].mx=l1;a[u].x=x;a[u].y=x1;}if(l2>a[u].mx){a[u].mx=l2;a[u].x=x;a[u].y=y1;}if(l3>a[u].mx){a[u].mx=l3;a[u].x=x1;a[u].y=y;}if(l4>a[u].mx){a[u].mx=l4;a[u].x=y1;a[u].y=y;}}
}
ll quans(ll u,ll d)
{if(d<0) return u;for(int k=21;k>=0&&d;--k){if(ff[k]<=d){d-=ff[k];u=fa[u][k];}}return u;
}
int main()
{ff[0]=1ll;for(int i=1;i<=21;++i) ff[i]=2ll*ff[i-1];cin>>n;for(int i=1;i<n;++i){int u,v;scanf("%d%d",&u,&v);G[u].push_back(v);G[v].push_back(u);}dfs(1,0,1);init();for(int i=1;i<=n;++i){a[i].x=a[i].y=i;a[i].mx=1;}dfs1(1,0);ll ans=0;for(int i=1;i<=n;++i){if(a[i].mx%2==1){ll d=a[i].mx/2+1;int dian=dep[a[i].x]>dep[a[i].y]?a[i].x:a[i].y;int t=quans(dian,d-1);ans+=t;}else{ll d=a[i].mx/2;ll dian=dep[a[i].x]> dep[a[i].y] ? a[i].x : a[i].y;ll t=quans(dian,d-1);ans+=t;t=quans(dian,d);ans+=t;}}printf("%lld\n",ans);
}

2019长沙学院新生赛(A水,B水,C(整除分块),D水,E(巧数学),F(二分+bfs),H(换根dp),I(线段树)J(dp+倍增+lca))相关推荐

  1. 小乐乐与二段数(2019哈理工新生赛第20题)

    链接:2019哈理工新生赛题解 2019哈理工新生赛第20题 T题: 链接:https://ac.nowcoder.com/acm/contest/1877/T 来源:牛客网 题目描述 小乐乐从老师口 ...

  2. 2019燕山大学程序设计新生赛(二)

    2019燕山大学程序设计新生赛(二) 绝地武士 参考代码 织梦岛 参考代码 谍战风云 参考代码 绝地武士 天赋异禀的绝地武士安纳金·天行者受西斯大帝达斯·西迪厄斯蛊惑,堕入原力黑暗面,随后被派去绝地圣 ...

  3. [极客大挑战 2019]Havefun[ACTF2020 新生赛]Include

    [极客大挑战 2019]Havefun 打开题目,看到一个确实 Havefun 的页面,于是直接 F12 查看源代码. 根据所给出的 PHP 代码在当前页面 URL 尝试传入参数,最终竟直接得出 fl ...

  4. 2022 浙大城市学院 新生赛 补题

    题目 K 题意: 给定n次位运算,包括&.|.^.给定q次询问,每次可以选择[0,r]中的任意整数x,令x经过这n次位运算最大,输出选择的x. 思路: 贪心.比较套路的题,这n次位运算是独立的 ...

  5. 2019燕山大学程序设计新生赛(二) 谍战风云

    在网上搜到一个 ## 但是采用的二进制法,本人文化有限,实在研究不透, 我就尝试着用最笨的方法把他们一个一个算出来 思路: 把所有结果算出来挨个比对 欢迎大家私信交流,共同进步! 7-7 谍战风云 多 ...

  6. New Year and Old Subsequence CodeForces - 750E(线段树+矩阵dp)2019南昌icpc网络赛Hello 2019

    A string t is called nice if a string "2017" occurs in t as a subsequence but a string &qu ...

  7. 【2019牛客暑期多校训练营(第二场)- E】MAZE(线段树优化dp,dp转矩阵乘法,线段树维护矩阵乘法)

    题干: 链接:https://ac.nowcoder.com/acm/contest/882/E?&headNav=acm 来源:牛客网 Given a maze with N rows an ...

  8. 埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛H题小Y与多米诺骨牌(线段树优化dp)

    题意 题目链接:https://www.nowcoder.com/acm/contest/91/H 来源:牛客网 题解 设l[i]l[i]l[i]为向左推第iii个骨牌最远能影响到的骨牌的编号,r[i ...

  9. 逆向迷宫题总结(持续更新) 2020华南师大CTF新生赛maze,攻防世界新手区:NJUPT CTF 2017,BUUCTF:不一样的flag

    CTF逆向入门:迷宫题学习记录(持续更新) ** 目录 **CTF逆向入门:迷宫题学习记录(持续更新)** (前言) 一. 逆向迷宫题概述 二. 具体题目分析 1. 2019华南师大CTF新生赛maz ...

最新文章

  1. android.util.AndroidRuntimeException: requestFeature() must be called before adding content
  2. [bzoj 2456]mode
  3. 在java中方法重载的要求,Java方法的重载
  4. android开发年总结
  5. java反射三种_Java反射
  6. 对象在JVM中的表示: OOP-Klass模型
  7. [云炬创业基础笔记]第四章测试19
  8. RxJava 和 RxAndroid 二(操作符的使用)
  9. 新手学linux之-----------memroy.c
  10. 国内外知名光端机品牌大全
  11. “四方定理”--蓝桥杯
  12. vue升级之路(四)-- Vuex
  13. 1018. 锤子剪刀布 (20)-PAT乙级真题
  14. Android 中流量、电量、弱网环境怎么测?
  15. 补全Windows10中的emoji 替换系统emoji字体
  16. 搭建服务器处理系统(基于netty),基于Netty的农业物联网服务器系统设计.PDF
  17. KTV点歌系统数字点歌功能
  18. 拒绝反爬虫!教你搞定爬虫验证码
  19. safari看html5卡顿,MacOS下Safari 10浏览器卡顿解决方案整理 - YangJunwei
  20. 数据仓库系列4-维度表

热门文章

  1. 使用Appium爬取淘宝App数据
  2. org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actua
  3. 华为设备流量抑制及风暴控制配置命令
  4. BI到底是什么,是否所有企业都适合上BI?
  5. “第四届中国云计算大会”最新重磅嘉宾抢先报!
  6. opencv mat 类型转换 CV_32FC1--CV_8U
  7. Anaconda3 导入外部环境报错
  8. 【AUTOSAR-CanTp】-2.10-复用UDS/OBD诊断物理/功能寻址/响应CAN_ID--Extended addressing扩展寻址
  9. matlab模拟n维谐振子,n维耦合谐振子的能量谱条件数理论研究
  10. 物联网周刊(第 1 期):电动汽车的未来