CF1472(div3):总结

文章目录

  • 前言
  • A. Cards for Friends
    • 题意简述
    • 解析
    • 代码
  • B. Fair Division
    • 题意简述
    • 解析
    • 代码
  • C. Long Jumps
    • 题意简述
    • 解析
    • 代码
  • D. Even-Odd Game
    • 题意简述
    • 解析
    • 代码
  • E. Correct Placement
    • 题意简述
    • 解析
    • 代码
  • F. New Year's Puzzle
    • 题意简述
    • 解析
    • 代码
  • G. Moving to the Capital
    • 题意简述
    • 解析
    • 代码

前言

周围的大佬都在切蓝紫黑
只有我在水div3的水题
qwq

A. Cards for Friends

题意简述

给出一个矩形的长和宽,当它的长(或宽)是偶数时,你就可以把它按照长(或宽)的方向平分成相等的两半
求该矩形能否剪出大于等于n个矩形
w,h≤104,n≤109w,h\leq 10^4,n\leq10^9w,h104,n109

解析

显然长和宽是独立的
分别求出两个方向最多能剪多少再乘在一起就行了

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
const int N=105;
const int mod=998244353;
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}int n,m;char s[N];int main(){#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);#endifint T=read();while(T--){scanf(" %s",s+1);n=strlen(s+1);if(s[1]!=s[n]) s[1]=195-s[1];printf(" %s\n",s+1);}return 0;
}

B. Fair Division

题意简述

给出一些价值为1或2的元素,求是否存在一种方案,把元素分成两个集合后两集合价值和相等
n≤100n\leq 100n100

解析

设所有元素价值和为sum
当且仅当sum为奇数,或者sum/2为奇数且没有1的元素时,无解

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
const int N=105;
const int mod=998244353;
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}int n,m;char s[N];
int a,b,sum;
int main(){#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);#endifint T=read();while(T--){n=read();a=0;b=0;sum=0;for(int i=1;i<=n;i++) sum+=read();a=sum-n;b=n-a;if((sum&1)||(b==0&&sum%4)) printf("NO\n");else printf("YES\n");}return 0;
}

C. Long Jumps

题意简述

给出一个数列a1−ana_1-a_na1an,你可以从任何一个位置 i 开始,每次获得aia_iai的分数, 并跳到 i+aii+a_ii+ai 的位置,直到跳出去为止
n≤2×105,1≤ai≤109n\leq 2\times 10^5,1 \leq a_i \leq 10^9n2×105,1ai109

解析

直接按题意模拟dp即可
注意数组越界

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
const int N=2e5+100;
const int mod=998244353;
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}int n,m;int a[N],dp[N];
int main(){#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);#endifint T=read();while(T--){n=read();int mx(0);for(int i=1;i<=n;i++) a[i]=read();for(int i=n;i>=1;i--){if(i+a[i]>n) dp[i]=a[i];else dp[i]=dp[i+a[i]]+a[i];mx=max(mx,dp[i]);}printf("%d\n",mx);}return 0;
}

D. Even-Odd Game

题意简述

alice和bob玩游戏
他们有一个长度为n的数列 aaa,从alice开始,轮流取数
alice得到所有取到的偶数的分数
bob得到所有取到的奇数的分数
求最后谁的分数高
n≤2∗105,1≤ai≤109n \leq 2*10^5,1 \leq a_i \leq 10^9n2105,1ai109

解析

显然两个人会不管奇偶的从大往小取
sort一下后模拟即可

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
const int N=2e5+100;
const int mod=998244353;
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}int n,m;ll sum[2];
int a[N];
int main(){#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);#endifint T=read();while(T--){n=read();sum[1]=sum[0]=0;for(int i=n;i>=1;i--){a[i]=read();sum[a[i]&1]+=a[i];}sort(a+1,a+1+n);for(int i=n;i>=1;i--){if(((n-i+1)&1)==(a[i]&1)) sum[a[i]&1]-=a[i];}if(sum[1]>sum[0]) printf("Bob\n");else if(sum[1]<sum[0]) printf("Alice\n");else printf("Tie\n");}return 0;
}

E. Correct Placement

题意简述

给出n个元素,每个元素有两个关键值域aaabbb
我们说元素 u 支配元素 v,当且近当满足下列两个条件之一:
1.au>av且bu>bva_u>a_v且b_u>b_vau>avbu>bv
2.bu>av且au>bvb_u>a_v且a_u>b_vbu>avau>bv
要求对于所有的 1≤i≤n1 \leq i \leq n1in,输出任意一个元素 i 支配的元素 j
如果不存在输出 -1
n≤2×105n \leq 2\times 10^5n2×105

解析

我的做法是树状数组,但是其实并不用…
支配的含义可以简化为:u的最大值大于v的最大值,且u的最小值也大于v的最小值
那么我们按照最小值sort一下,再从前往后扫一遍,沿途记录最大值的最小值w,看是否比当前的最大值小,就行了

代码

然而还是树状数组的码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
const int N=4e5+100;
const int mod=998244353;
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}int n,m;int q[N],a[N],b[N],num;
struct tree{int mn[N],id[N];void init(int x){fill(mn,mn+1+x,1e9);}inline void upd(int p,int v,int nam){for(int i=p;i<=num;i+=i&-i){if(mn[i]>v){mn[i]=v;id[i]=nam;}}return;}int ask(int p,int v){for(;p;p-=p&-p){if(mn[p]<v) return id[p];}return -1;}
}t1;
int main(){#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);#endifint T=read();while(T--){n=read();for(int i=1;i<=n;i++){a[i]=read();b[i]=read();q[++num]=a[i];q[++num]=b[i];}sort(q+1,q+1+num);num=unique(q+1,q+1+num)-q-1;t1.init(num);for(int i=1;i<=n;i++){a[i]=lower_bound(q+1,q+1+num,a[i])-q;b[i]=lower_bound(q+1,q+1+num,b[i])-q;//printf("i=%d a=%d b=%d\n",i,a[i],b[i]);t1.upd(a[i],b[i],i);}for(int i=1;i<=n;i++){int res(0);if((res=t1.ask(a[i]-1,b[i]))!=-1) printf("%d ",res);else if((res=t1.ask(b[i]-1,a[i]))!=-1) printf("%d ",res);else printf("-1 ");}putchar('\n');}return 0;
}

F. New Year’s Puzzle

题意简述

给出一个 2×n2 \times n2×n的矩形,其中有m个格子被挡住了,求是否可以用1*2的长方形覆盖满所有未被挡住的格子
n≤109,m≤2×105n \leq 10^9,m \leq 2\times 10^5n109m2×105

解析

题解似乎是一些分类讨论,但我觉得并不简单,就没仔细看…
n≤2×105n \leq 2\times 10^5n2×105时,显然直接dp即可
但是目前n太大了

注意到挡住的格子非常稀疏
不难发现当前一列的填的状态一定,且后面全没被挡住时,填法以两列为一个单位是循环一定的
我们可以强行把相邻的格子的距离%2缩小到O(1)级别
然后大力dp即可

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
const int N=4e5+100;
const int mod=998244353;
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}int n,m;struct node{int h,pl;bool operator < (const node o){return pl<o.pl;}
}p[N];
bool jd[N][3];
int main(){#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);#endifint T=read();while(T--){n=read();m=read();//int Jd=++tim==377;//if(Jd) printf("%d %d\n",n,m);for(int i=1;i<=m;i++){p[i].h=read();p[i].pl=read();//if(Jd) printf("%d %d\n",p[i].h,p[i].pl);}p[++m]=(node){1,0};p[++m]=(node){2,0};p[++m]=(node){1,n+1};p[++m]=(node){2,n+1};sort(p+1,p+1+m);for(int i=3;i<=m;i++){int flag=p[i].pl==p[i+1].pl;int d=p[i].pl-p[i-1].pl;p[i].pl=p[i-1].pl+1+((d+1)&1);if(flag) p[i+1].pl=p[i].pl,++i;}n=p[m].pl;for(int i=1;i<=n;i++) jd[i][1]=jd[i][2]=0;for(int i=1;i<=m;i++){//printf("i=%d pl=%d h=%d\n",i,p[i].pl,p[i].h);jd[p[i].pl][p[i].h]=1;}int flag(1);for(int i=1;i<=n;i++){if(jd[i-1][1]&&jd[i-1][2]){//printf("  a\n");if(!jd[i][1]&&!jd[i][2]) jd[i][1]=jd[i][2]=1;}else if(!jd[i-1][1]){//printf("  b\n");if(jd[i][1]){flag=0;break;}else jd[i][1]=1;}else{//printf("  c\n");if(jd[i][2]){flag=0;break;}else jd[i][2]=1;}//printf("i=%d jd=%d %d\n",i,jd[i][1],jd[i][2]);}if(!jd[n][1]||!jd[n][2]) flag=0;if(flag) printf("YES\n");else printf("NO\n");}return 0;
}

G. Moving to the Capital

题意简述

有一个由 n 个结点组成的有向图。一些结点由边长为1的有向边相连。
已知一个数组 d1...nd_{1...n}d1...n​,其中 did_idi​ 为从编号为 1 的结点到编号为 i 的结点的最短距离。 你站在第 s 个节点上。你有以下几种选择:

  1. 沿着某条边,从第 i 个结点到第 j 个结点,di<djd_i<d_jdi<dj
  2. 沿着某条边,从第 iii 个结点到第 jjj 个结点,di≥djd_i\geq d_jdidj​;(最多只能走一次)

你的目标是:靠近编号为 1 的点。(准确地说,是找到从任意一个结点出发到第 1 个结点的最短距离)

解析

把dp设计写在脸上的题
直接设计dpx,0/1dp_{x,0/1}dpx,0/1表示x点出发使用/不使用逆行机会的最小距离
递归转移即可
注意:只有在disto>disxdis_{to}>dis_xdisto>disx的时候才递归求dp!否则会循环递归出大问题!!

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
const int N=4e5+100;
const int mod=998244353;
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}int n,m;struct node{int to,nxt;
}p[N<<1];
int fi[N],cnt;
inline void addline(int x,int y){p[++cnt]=(node){y,fi[x]};fi[x]=cnt;return;
}bool vis[N];
int dis[N];int q[N],st,ed;
void bfs(){q[st=ed=1]=1;dis[1]=0;vis[1]=1;while(st<=ed){int now=q[st++];for(int i=fi[now];~i;i=p[i].nxt){int to=p[i].to;if(vis[to]) continue;q[++ed]=to;vis[to]=1;dis[to]=dis[now]+1;}}return;
}int dp[N][2];
void find(int x){if(dp[x][0]!=-1) return;dp[x][0]=dp[x][1]=dis[x];//printf("find:%d\n",x);for(int i=fi[x];~i;i=p[i].nxt){int to=p[i].to;//printf("  x=%d to=%d\n",x,to);if(dis[to]>dis[x]){find(to);dp[x][0]=min(dp[x][0],dp[to][0]);dp[x][1]=min(dp[x][1],dp[to][1]);}else{dp[x][1]=min(dp[x][1],dis[to]);}//printf("  x=%d to=%d dp0=%d dp1=%d\n",x,to,dp[x][0],dp[x][1]);}return;
}int main(){#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);#endifint T=read();while(T--){n=read();m=read();fill(vis,vis+1+n,0);fill(fi,fi+1+n,-1);cnt=-1;for(int i=1;i<=n;i++) dp[i][0]=dp[i][1]=-1;for(int i=1;i<=m;i++){int x=read(),y=read();addline(x,y);}bfs();for(int i=1;i<=n;i++){find(i);//printf("i=%d dis=%d dp0=%d dp1=%d\n",i,dis[i],dp[i][0],dp[i][1]);printf("%d ",min(dp[i][0],dp[i][1]));}putchar('\n');}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317378.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

How Much Memory Your Code Is Using? Gym - 101955J

How Much Memory Your Code Is Using? Gym - 101955J 题意&#xff1a; t组数据&#xff0c;每组数据会有n个定义类型的方式&#xff0c;给你每个类型所占字节&#xff0c;问一共占了多少字节&#xff0c;最终答案按照Kibibyte单位输出&#xff0c;并向上取整 题解&#xf…

P3295 [SCOI2016]萌萌哒(DP+倍增)

P3295 [SCOI2016]萌萌哒 description solution 强制部分区间相同&#xff0c;很容易就想到了并查集&#xff0c;直接暴力并查集合并是O(n2)O(n^2)O(n2)的 只需要考虑那一个数据结构将其转化成O(nlog⁡n)O(n\log n)O(nlogn)的 树之类的就不考虑了&#xff0c;一段一段的区间…

CF1677D-Tokitsukaze and Permutations【结论】

正题 题目链接:https://www.luogu.com.cn/problem/CF1677D 题目大意 对于一个排列pip_ipi​&#xff0c;定义一个序列vF(p)vF(p)vF(p)&#xff0c;其中vi∑j1i−1[pj>pi]v_i\sum_{j1}^{i-1}[p_j>p_i]vi​∑j1i−1​[pj​>pi​]。 一次冒泡排序为依次对1∼n−11\sim…

【恭贺新春】2019年春节放假

2019年放假通知致全体微友&#xff1a; 2019年2月5日&#xff08;正月初一&#xff09;至2月8日&#xff08;正月初四&#xff09;春节放假&#xff0c;共4天&#xff0c;小编停止更新公众号信息。敬请相互转告。值此新春佳节到来之际&#xff0c;“dotNet跨平台”给大家拜个…

模板:圆方树

所谓圆方树&#xff0c;就是又圆又方的树 &#xff08;逃&#xff09; 前言 树有很多良好的性质&#xff0c;也可以上许多算法和数据结构 但我们对于一般图却没有太多办法… 然而&#xff0c;对于有些关注连同性、路径并&交的一般图问题&#xff0c;我们可以用圆方树&…

C - Insertion Sort Gym - 101955C

C - Insertion Sort Gym - 101955C 题意&#xff1a; t组数据&#xff0c;每组数据给你n&#xff0c;k&#xff0c;q&#xff0c;让你求存在多少合法的1~n排列 合法要求&#xff1a; 对排列的前k项进行排序&#xff0c;使得整个序列中最长的递增子序列长度为n-1 题解&#x…

P8330-[ZJOI2022]众数【根号分治】

正题 题目链接:https://www.luogu.com.cn/problem/P8330 题目大意 给出一个长度为nnn的序列aaa&#xff0c;你可以选择其中一个区间将其加上任意整数&#xff0c;要求这个序列的众数出现次数最多。 输出最多次数和可能的众数。 1≤n≤2105,1≤ai≤109,∑n≤51051\leq n\leq …

华为云.NET Core支持情况调查

各大公有云都提供了开发者开发的SDK&#xff0c;今天我们来看看华为云对.NET Core的支持情况怎么样&#xff1f; .NET SDK地址 https://developer.huaweicloud.com/sdk#.NET华为云的.NET SDK相比其他语言少的可伶&#xff0c;而且这几个SDK还不支持.NET Core。SDK的支持实在太差…

[2021-07-19 内测NOIP] 操作(状压DP),异或(字典树),等级(线段树),矩阵(DP)

[2021-07-19 内测] NOIP操作descriptionsolutioncode异或descriptionsolutioncode等级descriptionsolutioncode矩阵descriptionsolutioncode操作 description 有n堆石子&#xff0c;每堆石子都有一定的数量&#xff0c;第i堆石子的数量用Ai表示。 任意两堆石子均可合并&…

codeforces:1361(div1)1362(div2):总结

文章目录前言1362-A. Johnny and Ancient Computer解析1362-B - Johnny and His Hobbies解析1362-C - Johnny and Another Rating Drop解析1361-A Johnny and Contribution解析1361-B - Johnny and Grandmaster解析1361-C - Johnny and Megans Necklace解析1361-D - Johnny and…

2018沈阳区域赛

题目地址 题号题目知识点难度ASockpuppetsBSequences GeneratorCInsertion Sort找规律&#xff0c;推公式DDiameter of a TreeEThe Kouga Ninja ScrollsFCounting Sheep in Ami DongsuoGBest ACMer Solves the Hardest Problem思维暴力HRainbow GraphIDistance Between Sweeth…

.NET和Java之争

这几天连续有多篇文章诋毁.NET&#xff0c;这类文章我十几年前就看得多了&#xff0c;只不过十几年前是C和C之争&#xff0c;C和Java之争。我从来不理这类文章&#xff0c;因为这类口水战并没有什么实际意义。然而接连收到多位粉丝私聊说&#xff0c;主席&#xff0c;你应该写点…

P8329-[ZJOI2022]树【容斥,dp】

正题 题目链接:https://www.luogu.com.cn/problem/P8329 题目大意 有两棵nnn个点的有根树。 第一棵根为111&#xff0c;第iii个点的父亲在[1,i−1][1,i-1][1,i−1]中。第二棵根为nnn&#xff0c;第iii个点的父亲在[i1,n][i1,n][i1,n]中。每个点都恰好在一棵树中作为叶子。 …

线性代数一之矩阵转向量随机化求解——神奇的矩阵(BZOJ)+向量内积

向量随机化神奇的矩阵descriptionsolutioncode[NOI2013]向量内积descriptionsolutioncode矩阵既可以看成是一张数位表&#xff0c;也可以看成是若干个行向量或者若干个列向量的向量表神奇的矩阵 description solution 暴力做A∗BA*BA∗B会达到n3n^3n3的复杂度&#xff0c;难…

G - Best ACMer Solves the Hardest Problem Gym - 101955G

G - Best ACMer Solves the Hardest Problem Gym - 101955G 题意&#xff1a; 我们需要建立一个数据库以支持实时查询和修改。这个数据库中的记录是点坐标 (x,y) 和其权值 w。查询与修改操作可以表示为 1 x y w&#xff0c;在 (x,y) 处插入一个新的点&#xff0c;我们保证在…

模板:Link Cut Tree(LCT)

文章目录前言解析原理rotate(x)splay(x)access(x)findroot(x)makeroot(x)split(x,y)link(x,y)cut(x,y)pushdown(x)完整代码所谓Link Cut Tree&#xff0c;就是林可卡特发明的tree &#xff08;逃&#xff09; 前言 终于走到了这一天… 其实感觉没有预想的那么难&#xff08;单…

P6803-[CEOI2020]星际迷航【博弈论,dp,矩阵乘法】

正题 题目链接:https://www.luogu.com.cn/problem/P6803 题目大意 给出一棵nnn个点的树&#xff0c;把它复制出D1D1D1层&#xff0c;编号为[0,D][0,D][0,D]&#xff0c;然后每一层随机一个点向下一层随机一个点连边。 然后从第000层的111号点出发&#xff0c;两个人轮流操作…

潘淳:国士无双《微软技术俱乐部(苏州)成立大会暨微软技术交流会介绍》附专题视频...

题记&#xff1a;凡我赶不上的&#xff0c;我就在未来等他&#xff0c;随时等待捕捉那个趋势的的到来。2019年立一个FLAG&#xff0c;加入一个成长性组织&#xff0c;一个能让我学习使我成长的平台。2019年你和我都将亲历这个组织的到来&#xff0c;一个属于苏州程序员自己的大…

ASP.NET Core中借助CSRedis实现安全高效的分布式锁

引言最近回头看了看开发的.NET Core 2.1项目的复盘总结&#xff0c;其中在多处用到Redis实现的分布式锁&#xff0c;虽然在OnResultExecuting方法中做了防止死锁的处理&#xff0c;但在某些场景下还是会发生死锁的问题&#xff0c;下面我只展示部分代码&#xff1a;问题&#x…

L Machining Disc Rotors

L Machining Disc Rotors 题意&#xff1a; 圆心为(0,0)半径为R的圆&#xff0c;现在被被n个互不相交的圆切割(圆心和半径会给出)&#xff0c;保证这n个彼此之间不会交叉&#xff0c;保证n个圆中不会有某个包含整个大圆的情况。问切割后大圆剩余部分的直径&#xff08;即两点…