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& ...
随机推荐
- EXCEL 导入 R 的几种方法 R—readr和readxl包
导入Excel数据至R语言的几种方法 如有如下Excel数据源,如何将数据导入R语言呢?今天主要来介绍几种常见的方法: 一.使用剪贴板,然后使用read.table函数: 首先选择Excel中的数据源 ...
- 查看ubuntu 14.04的网关和DNS
root@ubuntu:~# nm-tool NetworkManager Tool State: connected (global) - Device: eth0 [自动以太网] -------- ...
- QT学习之事件处理
Qt事件机制 Qt程序是事件驱动的, 程序的每个动作都是由幕后某个事件所触发.. Qt事件的发生和处理成为程序运行的主线,存在于程序整个生命周期. Qt事件的类型很多, 常见的qt的事件如下: 键盘事 ...
- C++中的深拷贝和浅拷贝 QT中的深拷贝,浅拷贝和隐式共享
下面是C++中定义的深,浅拷贝 当用一个已初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候,拷贝构造函数就会被自动调用.也就是说,当类的对象需要拷贝时,拷贝构造函数将会被调用.以下情况都会 ...
- 去除textarea默认样式
border: none; resize:none; outline: none;
- HDU 3363 Ice-sugar Gourd (贪心)
题意:给你一个串,串中有H跟T两种字符,然后切任意刀,使得能把H跟T各自分为原来的一半. 析:由于只有两个字母,那么只要可以分成两份,那么一定有一段是连续的. 代码如下: #include <c ...
- linux系统学习(一)
查看linux版本信息:http://distrowatch.com/ linux根目录下系统文件夹的含义 /boot 该目录下默认存放的是linux的启动文件和内核,一般200M swap交换分区, ...
- Hadoop压缩之CompressionCodecFactory
1.CompressionCodecFactory简介 当在读取一个压缩文件的时候,可能并不知道压缩文件用的是哪种压缩算法,那么无法完成解压任务.在Hadoop中,CompressionCodecFa ...
- Java NIO学习-详细内容(一)
一.三大类 1.Channels FileChannel DatagramChannel SocketChannel ServerSocketChannel 2.Selector与SelectionK ...
- 用 Inkscape 做 SVG 给 TPath
FireMonkey 里的 TPathData 支持 SVG 的基本绘图指令,因此可以运用 Inkscape 软件,提取 SVG 的绘图内容,请见图片说明: INKSCAPE https://inks ...