Educational Codeforces Round 58 (Rated for Div. 2)
水
#include<bits/stdc++.h>
#define clr(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=1e3+;
struct node{
ll num,mag;
friend bool operator <(const node &a,const node &b){
return a.mag>b.mag;
}
}a[maxn];
int n;
ll p[];
ll add(ll x,ll val){
for(int i=;i>=;i--)
{
if(x&(<<i))
{
if(!p[i]){
p[i]=x;
break;
}else{
x=x^p[i];
}
}
}
if(x>)return val;
return ;
}
int main(){
while(cin>>n)
{
ll l,r,d;
while(n--)
{
cin>>l>>r>>d;
if(d<l)printf("%lld\n",d);
else{
printf("%lld\n",(r/d+)*d); }
}
}
}
小模拟,从前往后扫到第一个 [: ,从后往前扫到第一个 :] ,然后数中间的 “|” 就可以了。
#include<bits/stdc++.h>
#define clr(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=5e5+;
char s[maxn];
int main(){
while(scanf("%s",s+)!=EOF)
{
int flag=,p1=-,p2=-,len=strlen(s+);
for(int i=;i<=len;i++)
{
if(flag==)
{
if(s[i]=='[')flag=;
}else{
if(s[i]==':'){
p1=i;
break;
}
}
}
flag=;
for(int i=len;i>p1&&i>;i--)
{
if(flag==)
{
if(s[i]==']')flag=;
}else{
if(s[i]==':'){
p2=i;
break;
}
}
}
if(p1==-||p2==-){
printf("-1\n");
continue;
}
int tot=;
for(int i=p1+;i<p2;i++)
{
if(s[i]=='|')tot++;
}
printf("%d\n",tot+);
}
}
题意:把给出的区间分成两部分,使不同部分的区间,不会有交点。
按 l 排序一遍,如果 l 小于前面最大的 r ,则必须和前面分在同一个群,否则就到第二个群。
#include<bits/stdc++.h>
#define clr(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=2e5+;
int T,n;
struct node{
int l,r;
int id;
friend bool operator <(const node &a,const node &b)
{
return a.l<b.l;
}
}a[maxn];
int ans[maxn];
int main(){
cin>>T;
while(T--)
{
cin>>n;
for(int i=;i<=n;i++)
{
scanf("%d%d",&a[i].l,&a[i].r);
a[i].id=i;
}
sort(a+,a++n);
int maxx=a[].r,tep=,flag=;
ans[a[].id]=;
for(int i=;i<=n;i++)
{
if(a[i].l<=maxx){
ans[a[i].id]=+tep;
}else{
ans[a[i].id]=+-tep;
tep=-tep;
flag=;
}
maxx=max(maxx,a[i].r); }
if(flag==)puts("-1");
else{
for(int i=;i<=n;i++)
{
printf("%d%c",ans[i]," \n"[i==n]);
}
}
}
}
题意:给出一颗点带权的数,求任意两点简单路径上的点gcd大于1的长度最大是多少。
题解:
gcd大于1即不互质,若一条路径是合法路径,则必定有一个大于1的公共质因子。所以我们可以对每个小于2e5的质数重新建树,然后再求树的直径。
建图是怎么建的呢,其实只要把边读入的时候,就把边塞到各自的质因子背包里面去,最后把每个背包的边都建立出来,跑树上直径。
但是有一个问题是,小于2e5的质数有一万多个,树的直径又是O(n)的,这样看上去会超时,我也困扰了好久。其实,两个点之间的公共gcd的质因子个数最多就十个左右,(再多就爆了)也就意味着每个点最多被建图十次,所以如果跑树的直径最后的总计算次数也就是10*O(n)左右,不会超时,这类问题以后要注意,明明很快就想到标算的,但迟迟不敢动手。
#include<bits/stdc++.h>
#define clr(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=2e5+;
int prim[maxn],n,u,v,a[maxn];
int gcd(int a,int b){
return b==?a:gcd(b,a%b);
}
void initPrim(){
for(int i=;i<=2e5/;i++)
{
for(int j=;i*j<=2e5;j++)
{
prim[i*j]=;
}
}
}
struct edge{
int u,v;
};
vector<edge>ve[maxn];
vector<int >e[maxn];
vector<int >jont;
bool vis[maxn];
int ans=;
int dfs(int u,int fa,int dep){
vis[u]=;
int f=;
int flink=,slink=;
for(int i=;i<e[u].size();i++)
{
int v=e[u][i];
if(v==fa)continue;
f=;
int tep=dfs(v,u,dep+);
if(tep>flink)slink=flink,flink=tep;
else if(tep>slink)slink=tep;
}
ans=max(ans,max(dep+flink,flink++slink));
return flink+; }
int main(){
initPrim();
while(cin>>n)
{
ans=;
int fff=;
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]>)fff=;
}
for(int i=;i<=2e5;i++)ve[i].clear();
for(int i=;i<n;i++)
{
scanf("%d%d",&u,&v);
int k=gcd(a[u],a[v]);
if(k>){
for(int j=;j*j<=k;j++)
{
if(k%j==)
{
if(j!=&&prim[j]==) ve[j].push_back({u,v});
if(j*j!=k&&prim[k/j]==) ve[k/j].push_back({u,v});
}
}
}
}
if(fff==){
puts("");
continue;
}
clr(vis,);
for(int i=;i<=2e5;i++)
{
if(!prim[i])
{
for(int j=;j<ve[i].size();j++)
{
if(vis[ve[i][j].u]==)
{
jont.push_back(ve[i][j].u);
}
if(vis[ve[i][j].v]==)
{
jont.push_back(ve[i][j].v);
}
vis[ve[i][j].u]=;
vis[ve[i][j].v]=;
e[ve[i][j].u].push_back(ve[i][j].v);
e[ve[i][j].v].push_back(ve[i][j].u);
}
for(int j=;j<jont.size();j++)
{
vis[jont[j]]=;
}
for(int j=;j<jont.size();j++)
{
int u=jont[j];
if(!vis[u]){
dfs(u,,);
}
}
for(int j=;j<jont.size();j++)
{
e[jont[j]].clear();
}
jont.clear();
}
}
cout<<ans<<endl;
}
}
为什么这会是E题,一开始我以为是求有几张钞票能被塞进去,看了样例才发现我想太多了。
反正就钞票放进去的时候,固定格式,短的一边在下面,钱包也是这样,分别记录长边和短边的最大值,比一下即可。
#include<bits/stdc++.h>
#define clr(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=2e5+;
int T,n;
struct node{
int l,r;
int id;
friend bool operator <(const node &a,const node &b)
{
return a.l<b.l;
}
}a[maxn];
int ans[maxn];
int main(){
cin>>T;
int maxl=,maxr=,l,r;
char op[];
while(T--)
{
scanf("%s%d%d",op,&l,&r);
if(op[]=='+'){
if(l>r)swap(l,r);
maxl=max(maxl,l),maxr=max(maxr,r);
}else{
if(l>r)swap(l,r);
if(l>=maxl&&r>=maxr)printf("YES\n");
else puts("NO");
}
}
}
好题,题解移步我的另外一篇博客 点这里
#include<bits/stdc++.h>
#define clr(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=;
ll ans;
int dp[maxn][maxn][maxn],a[maxn];
int n,m;
int main(){
while(cin>>n>>m)
{
ans=;
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(int i=;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
dp[i][j][]=a[j]-a[i];
}
}
for(int k=;k<=n;k++)
{
for(int i=;i<=n;i++)
{
int w=i;
for(int j=i;j<=n;j++)
{
while(w<j&&max(dp[i][w][k-],a[j]-a[w])>max(dp[i][w+][k-],a[j]-a[w+]))w++;
dp[i][j][k]=max(dp[i][w][k-],a[j]-a[w]);
}
}
}
int s,f,r;
ll c;
while(m--)
{
scanf("%d%d%lld%d",&s,&f,&c,&r);
ans=max(ans,dp[s][f][r]*c);
}
cout<<ans<<endl;
}
}
题意:给出一个序列,试将其划分为尽可能多的非空子段,满足每一个元素出现且仅出现在其中一个子段中,且在这些子段中任取若干子段,它们包含的所有数的异或和不能为0.
思路:先处理出前缀异或,这样选择更多的区间其实就相当于选择更多的前缀异或,并且这些前缀异或不能异或出0,这就变成了线性基的基础题了。贪心的放,能放就放。不能放就意味着线性基的add函数里面的val最后变成了0,也就是当前已经插入的线性基已经可以异或出正在插入的数了,所以不能放。
#include<bits/stdc++.h>
#define clr(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=2e5+;
ll a[maxn],p[],s[maxn];
int n;
int add(ll val){
for(int i=;i>=;i--)
{
if(val&(<<i)){
if(!p[i]){
p[i]=val;
return ;
}
val^=p[i];
}
}
return ;
}
int main(){
while(cin>>n)
{
clr(p,);
for(int i=;i<=n;i++)
{
scanf("%lld",&a[i]);
s[i]=s[i-]^a[i];
}
if(s[n]==){
puts("-1");
continue;
}
int ans=;
for(int i=n;i>;i--)
{
ans+=add(a[i]);
}
cout<<ans<<endl;
}
}
Educational Codeforces Round 58 (Rated for Div. 2)的更多相关文章
- Educational Codeforces Round 58 (Rated for Div. 2) 题解
Educational Codeforces Round 58 (Rated for Div. 2) 题目总链接:https://codeforces.com/contest/1101 A. Min ...
- Educational Codeforces Round 58 (Rated for Div. 2) F dp + 优化(新坑) + 离线处理
https://codeforces.com/contest/1101/problem/F 题意 有n个城市,m辆卡车,每辆卡车有起点\(s_i\),终点\(f_i\),每公里油耗\(c_i\),可加 ...
- Educational Codeforces Round 58 (Rated for Div. 2) D 树形dp + 数学
https://codeforces.com/contest/1101/problem/D 题意 一颗n个点的树,找出一条gcd>1的最长链,输出长度 题解 容易想到从自底向长转移 因为只需要g ...
- Educational Codeforces Round 58 (Rated for Div. 2) G 线性基
https://codeforces.com/contest/1101/problem/G 题意 一个有n个数字的数组a[],将区间分成尽可能多段,使得段之间的相互组合异或和不等于零 题解 根据线性基 ...
- Educational Codeforces Round 58 (Rated for Div. 2) (前两题题解)
感慨 这次比较昏迷最近算法有点飘,都在玩pygame...做出第一题让人hack了,第二题还昏迷想错了 A Minimum Integer(数学) 水题,上来就能做出来但是让人hack成了tle,所以 ...
- Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship
Problem Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship Time Limit: 2000 mSec P ...
- Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems(动态规划+矩阵快速幂)
Problem Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems Time Limit: 3000 mSec P ...
- Educational Codeforces Round 43 (Rated for Div. 2)
Educational Codeforces Round 43 (Rated for Div. 2) https://codeforces.com/contest/976 A #include< ...
- Educational Codeforces Round 35 (Rated for Div. 2)
Educational Codeforces Round 35 (Rated for Div. 2) https://codeforces.com/contest/911 A 模拟 #include& ...
随机推荐
- meshconverters
https://github.com/RobotLocomotion/meshConverters meshconverters $ mkdir build && cd build $ ...
- 1.spring.net Look-up Method 查找方法的注入(方法是抽象的需要spring.net注入)
.为什么需要查找方法的注入 当Object依赖另一个生命周期不同的Object,尤其是当singleton依赖一个non-singleton时,常会遇到不少问题,Lookup Method Injec ...
- 【转】ACM各种WA的说明及可能的原因
转载地址:http://blog.csdn.net/qq_15015129/article/details/52738184 1.答案错误 —— wrong answer 就是最常见的.这个没办法,基 ...
- mysql 数学操作函数
-- 绝对值,圆周率 SELECT ABS(-1),3*PI() -- 平方根,求余 SELECT SQRT(9),MOD(9,5) -- 获取整数的函数 SELECT CEIL(12.145),CE ...
- command >/dev/null 2>&1 解说
0:表示键盘输入(stdin)1:表示标准输出(stdout),系统默认是1 2:表示错误输出(stderr) command >/dev/null 2>&1 & == ...
- 大前端涉猎之前后端交互总结3:使用PHP进行表单数据删除与查询
1 首先:获取用户 id,根据id 删除指定的数据. 在链接完数据库之后,通过$_GET 超全局变量,获取删除的书内容 $id = $_GET['id']; 2 准备delete SQL语句: $sq ...
- 编写高质量代码改善C#程序的157个建议——建议62:避免嵌套异常
建议62:避免嵌套异常 应该允许异常在调用堆栈上往上传,不要过多的使用catch,然后再throw.过多的使用catch会带来两个问题: 1)代码更多了.这看上去好像你根本不知道怎么处理异常,所以你总 ...
- JavaScript中两种类型的全局对象/函数【转】
Snandy Stop, thinking is the essence of progress. JavaScript中两种类型的全局对象/函数 这里所说的JavaScript指浏览器环境中的包括宿 ...
- 深入理解java虚拟机(七)类加载的时机
Class 文件中描述的各种信息都必须加载到虚拟机中才能运行和使用.而虚拟机怎么加载这些Class 文件呢?Class 文件进入到虚拟机中会发生什么变化呢? 虚拟机类加载机制是指 虚拟机把描述类的数据 ...
- delphi android 录像
delphi xe系列自带的控件都无法保存录像,经网友帮忙,昨天终于实现了录像功能(但有个问题是录像时无画面显示),程序主要使用了JMediaRecorder,MediaRecorder的使用方法可参 ...