Educational Codeforces Round 35 (Rated for Div. 2)

https://codeforces.com/contest/911

A

模拟

 #include<bits/stdc++.h>
using namespace std;
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define IT set<ll>::iterator
#define sqr(x) ((x)*(x))
#define pb push_back
#define eb emplace_back
#define maxn 5000005
#define eps 1e-8
#define pi acos(-1.0)
#define rep(k,i,j) for(int k=i;k<j;k++)
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll>pll;
typedef pair<ll,int> pli;
typedef pair<pair<int,string>,pii> ppp;
typedef unsigned long long ull;
const long long MOD=;
const double oula=0.57721566490153286060651209;
using namespace std; int a[]; int main(){
std::ios::sync_with_stdio(false);
int n;
cin>>n;
int x=0x3f3f3f3f;
for(int i=;i<=n;i++){
cin>>a[i];
x=min(x,a[i]);
}
int Min=0x3f3f3f3f;
int pre=-;
for(int i=;i<=n;i++){
if(a[i]==x){
if(pre==-) pre=i;
else Min=min(Min,i-pre),pre=i;
}
}
cout<<Min<<endl;
}

B

二分

 #include<bits/stdc++.h>
using namespace std;
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define IT set<ll>::iterator
#define sqr(x) ((x)*(x))
#define pb push_back
#define eb emplace_back
#define maxn 5000005
#define eps 1e-8
#define pi acos(-1.0)
#define rep(k,i,j) for(int k=i;k<j;k++)
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll>pll;
typedef pair<ll,int> pli;
typedef pair<pair<int,string>,pii> ppp;
typedef unsigned long long ull;
const long long MOD=;
const double oula=0.57721566490153286060651209;
using namespace std; int n,a,b; bool Check(int mid){
int sum=a/mid;
sum+=b/mid;
if(sum>=n) return true;
return false;
} int main(){
std::ios::sync_with_stdio(false);
cin>>n>>a>>b;
int L=,R=min(a,b),mid;
while(L<=R){
mid=L+R>>;
if(Check(mid)){
L=mid+;
}
else{
R=mid-;
}
}
cout<<R<<endl;
}

C

题意:有三个灯,A将开启这些灯。 这些灯一会亮一会不亮。如果第i个灯在第x秒开启,那么它仅在第x,x+ki,x+2*ki……秒时是亮的。 A想要打开灯,使每秒至少有一个灯是亮的。 A想要选择三个整数a,b,c,在第a秒接通第一个灯,在第b秒接通第二个灯,在第c秒接通第三灯, 并且在从max(a,b,c)开始的每秒中,至少有一个灯将是亮的。 问A是否可以做到。

思路:直接模拟就可以。。

 #include<bits/stdc++.h>
using namespace std;
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define IT set<ll>::iterator
#define sqr(x) ((x)*(x))
#define pb push_back
#define eb emplace_back
#define maxn 5000005
#define eps 1e-8
#define pi acos(-1.0)
#define rep(k,i,j) for(int k=i;k<j;k++)
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll>pll;
typedef pair<ll,int> pli;
typedef pair<pair<int,string>,pii> ppp;
typedef unsigned long long ull;
const long long MOD=;
const double oula=0.57721566490153286060651209;
using namespace std; int book[]; int main(){
std::ios::sync_with_stdio(false);
int a,b,c;
cin>>a>>b>>c;
book[a]++;
book[b]++;
book[c]++;
if(book[]) cout<<"YES"<<endl;
else if(book[]>=) cout<<"YES"<<endl;
else if(book[]>=) cout<<"YES"<<endl;
else if(book[]&&book[]>=) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}

D

题意:给你一个长度为n的序列,有m次操作。每次翻转[l,r]的区间,每次操作后询问序列逆序对个数的奇偶性。

思路:通过多次模拟可以发现一个规律:

1、区间翻转时,区间内的逆序对的个数不影响区间外的逆序对的个数

2、区间翻转,正序对和逆序对数量交换。所以可以判断区间序对数的奇偶性

发现这规律做题就容易了,直接上树状数组搞搞就行

 #include<bits/stdc++.h>
using namespace std;
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define IT set<ll>::iterator
#define sqr(x) ((x)*(x))
#define pb push_back
#define eb emplace_back
#define maxn 5000005
#define eps 1e-8
#define pi acos(-1.0)
#define rep(k,i,j) for(int k=i;k<j;k++)
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll>pll;
typedef pair<ll,int> pli;
typedef pair<pair<int,string>,pii> ppp;
typedef unsigned long long ull;
const long long MOD=;
const double oula=0.57721566490153286060651209;
using namespace std; int tree[],a[];
int m,n;
int lowbit(int x){return x&(-x);}
void add(int x){while(x<=n){tree[x]+=;x+=lowbit(x);}}
int ask(int x){int sum=;while(x){sum+=tree[x];x-=lowbit(x);}return sum;} int main(){
std::ios::sync_with_stdio(false);
cin>>n;
for(int i=;i<=n;i++){
cin>>a[i];
}
int sum=;
for(int i=n;i;i--){
sum+=ask(a[i]);
add(a[i]);
}
cin>>m;
int x,y;
int ans=sum&;
for(int i=;i<=m;i++){
cin>>x>>y;
int len=y-x+;
len=len*(len-)/;
if(len&) ans^=;
if(ans) cout<<"odd"<<endl;
else cout<<"even"<<endl;
}
}

E

题意:给定 n,m(n>=m),先给出m个数,然后让你补全剩下的n-m个数,使的字典序最大且可以通过栈使它变成1-n的顺序序列

思路:先判断给定的数能不能通过模拟栈的方法顺序输出,可以的话就从大到小补全小于栈顶元素且未出现过的数。

 #include<bits/stdc++.h>
using namespace std;
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define IT set<ll>::iterator
#define sqr(x) ((x)*(x))
#define pb push_back
#define eb emplace_back
#define maxn 5000005
#define eps 1e-8
#define pi acos(-1.0)
#define rep(k,i,j) for(int k=i;k<j;k++)
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll>pll;
typedef pair<ll,int> pli;
typedef pair<pair<int,string>,pii> ppp;
typedef unsigned long long ull;
const long long MOD=;
const double oula=0.57721566490153286060651209;
using namespace std; int a[];
stack<int>st; int main(){
std::ios::sync_with_stdio(false);
int n,m;
cin>>n>>m;
for(int i=;i<=m;i++){
cin>>a[i];
}
int k=n-m;
int i=;
int co=;
int flag=;
while(i<=m){
if(co!=a[i]){
st.push(a[i]);
i++;
}
else{
co++;
i++;
while(!st.empty()&&st.top()==co){
co++;
st.pop();
}
}
}
if(!st.empty()){
int pre=st.top();
st.pop();
while(!st.empty()){
if(pre>st.top()){
flag=;
break;
}
pre=st.top();
st.pop();
}
}
if(flag==){
cout<<-<<endl;
}
else{
int i=;
int co=;
while(i<=m){
if(co!=a[i]){
st.push(a[i]);
i++;
}
else{
co++;
i++;
while(!st.empty()&&st.top()==co){
co++;
st.pop();
}
}
}
while(!st.empty()){
int tmp=st.top();
st.pop();
for(i=tmp-;i>=co;i--){
a[++m]=i;
}
co=tmp+;
}
for(int i=n;i>=co;i--) a[++m]=i;
for(int i=;i<=m;i++){
cout<<a[i]<<" ";
}
}
}

F

题意:给你一棵树,每次选这棵树的两个叶子,加上他们之间的距离,然后将其中一个点去掉,问你距离之和最大可以是多少。

思路:要求距离之和最大,肯定是需要把树的直径求出来,然后依次减去非直径上的点,最后减去直径上的点

 #include<bits/stdc++.h>
using namespace std;
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define IT set<ll>::iterator
#define sqr(x) ((x)*(x))
#define pb push_back
#define eb emplace_back
#define maxn 200005
#define eps 1e-8
#define pi acos(-1.0)
#define rep(k,i,j) for(int k=i;k<j;k++)
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll>pll;
typedef pair<ll,int> pli;
typedef pair<pair<int,string>,pii> ppp;
typedef unsigned long long ull;
const long long MOD=;
const double oula=0.57721566490153286060651209;
using namespace std; int n;
vector<int>ve[];
vector<pair<int,pair<int,int> > >ans;
int deep[],fa[],book[];
ll sum;
int pos1,pos2; void dfs1(int now,int pre){
for(int i=;i<ve[now].size();i++){
if(ve[now][i]!=pre){
deep[ve[now][i]]=deep[now]+;
fa[ve[now][i]]=now;
dfs1(ve[now][i],now);
}
}
} void dfs2(int now,int pre,int d){
if(book[now]) d++;
for(int i=;i<ve[now].size();i++){
if(pre!=ve[now][i]){
dfs2(ve[now][i],now,d);
if(!book[ve[now][i]]){
int dep1=deep[ve[now][i]];
int dep2=deep[pos2]+deep[ve[now][i]]-*d;
if(dep1>=dep2){
sum+=dep1;
ans.pb({pos1,{ve[now][i],ve[now][i]}});
}
else{
sum+=dep2;
ans.pb({pos2,{ve[now][i],ve[now][i]}});
}
}
}
}
} int main(){
std::ios::sync_with_stdio(false);
cin>>n;
int u,v;
for(int i=;i<n;i++){
cin>>u>>v;
ve[u].pb(v);
ve[v].pb(u);
}
dfs1(,);
pos1=,pos2=;
for(int i=;i<=n;i++){
if(deep[i]>deep[pos1]){
pos1=i;
}
}
deep[pos1]=,fa[pos1]=;
dfs1(pos1,);
for(int i=;i<=n;i++){
if(deep[i]>deep[pos2]){
pos2=i;
}
}
for(int i=pos2;i!=pos1;i=fa[i]) book[i]=;
dfs2(pos1,,);
for(int i=pos2;i!=pos1;i=fa[i]){
ans.pb({pos1,{i,i}});
sum+=deep[i];
}
cout<<sum<<endl;
for(int i=;i<ans.size();i++){
cout<<ans[i].first<<" "<<ans[i].second.first<<" "<<ans[i].second.second<<endl;
}
}

G

题意:给出一个数列,有q个操作,每种操作是把区间[l,r]中等于x的数改成y.输出q步操作完的数列

思路:因为数列中的值为1-100,所以用线段树暴力修改

 #include<bits/stdc++.h>
using namespace std;
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define IT set<ll>::iterator
#define sqr(x) ((x)*(x))
#define pb push_back
#define eb emplace_back
#define maxn 200005
#define eps 1e-8
#define pi acos(-1.0)
#define rep(k,i,j) for(int k=i;k<j;k++)
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll>pll;
typedef pair<ll,int> pli;
typedef pair<pair<int,string>,pii> ppp;
typedef unsigned long long ull;
const long long MOD=;
const double oula=0.57721566490153286060651209;
using namespace std; int lazy[maxn<<][];
int a[maxn];
int n; void build(int l,int r,int rt){
for(int i=;i<=;i++){
lazy[rt][i]=i;
}
if(l==r) return;
int mid=l+r>>;
build(lson);
build(rson);
} void push_down(int rt){
for(int i=;i<=;i++){
lazy[rt<<][i]=lazy[rt][lazy[rt<<][i]];
lazy[rt<<|][i]=lazy[rt][lazy[rt<<|][i]];
}
for(int i=;i<=;i++){
lazy[rt][i]=i;
}
} void update(int L,int R,int x,int y,int l,int r,int rt){
if(L<=l&&R>=r){
for(int i=;i<=;i++){
if(lazy[rt][i]==x){
lazy[rt][i]=y;
}
}
return;
}
push_down(rt);
int mid=l+r>>;
if(L<=mid) update(L,R,x,y,lson);
if(R>mid) update(L,R,x,y,rson);
} void query(int l,int r,int rt){
if(l==r){
cout<<lazy[rt][a[l]]<<" ";
return;
}
push_down(rt);
int mid=l+r>>;
query(lson);
query(rson);
} int main(){
std::ios::sync_with_stdio(false);
cin>>n;
for(int i=;i<=n;i++) cin>>a[i];
build(,n,);
int q;
cin>>q;
int l,r,x,y;
while(q--){
cin>>l>>r>>x>>y;
update(l,r,x,y,,n,);
}
query(,n,);
}

Educational Codeforces Round 35 (Rated for Div. 2)的更多相关文章

  1. Educational Codeforces Round 35 (Rated for Div. 2)A,B,C,D

    A. Nearest Minimums time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  2. Educational Codeforces Round 72 (Rated for Div. 2)-D. Coloring Edges-拓扑排序

    Educational Codeforces Round 72 (Rated for Div. 2)-D. Coloring Edges-拓扑排序 [Problem Description] ​ 给你 ...

  3. 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 ...

  4. 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 ...

  5. Educational Codeforces Round 43 (Rated for Div. 2)

    Educational Codeforces Round 43 (Rated for Div. 2) https://codeforces.com/contest/976 A #include< ...

  6. Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings

    Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings 题目连接: http://cod ...

  7. Codeforces Educational Codeforces Round 44 (Rated for Div. 2) E. Pencils and Boxes

    Codeforces Educational Codeforces Round 44 (Rated for Div. 2) E. Pencils and Boxes 题目连接: http://code ...

  8. Educational Codeforces Round 63 (Rated for Div. 2) 题解

    Educational Codeforces Round 63 (Rated for Div. 2)题解 题目链接 A. Reverse a Substring 给出一个字符串,现在可以对这个字符串进 ...

  9. Educational Codeforces Round 39 (Rated for Div. 2) G

    Educational Codeforces Round 39 (Rated for Div. 2) G 题意: 给一个序列\(a_i(1 <= a_i <= 10^{9}),2 < ...

随机推荐

  1. var entsMapLocation = {……}函数

    var entsMapLocation = { global: { $popupCityBox: $(".ents-map-location-popup-box"), isPosi ...

  2. Creating and using a blendspace in c++

    转自:https://forums.unrealengine.com/development-discussion/c-gameplay-programming/104831-creating-and ...

  3. hive函数--编码解码

    以UTF-8为例: 测试字符串:☕️午后咖啡☕️ 一.编码 hive"); 输出: %E2%98%95%EF%B8%8F%E5%8D%88%E5%90%8E%E5%92%96%E5%95%A ...

  4. golang初识5 - interface

    1. interface-new (1) abstract format: type abstractName interface { method_name1 [return_type] } (2) ...

  5. 最全面的DialogFragment的使用,实现DialogFragment全屏、背景透明;

    Android推荐使用DialogFragment代替Dialog,好处就说一点吧,DialogFragment就是个盖在界面上的Fragment,它拥有Fragment一样的功能和生命周期,解决普通 ...

  6. Python 内置函数math,random

    内置函数的一些操作 - math(数学模块) - random(随机模块) - 使用内置函数时注意需要导入 math - (ceil)向上取整,返回取整数 # 向上取整,返回向上取整的数 import ...

  7. xpath 笔记

    from lxml import etree info = f.read()  # requests.get().text # print(info) selector=etree.HTML(info ...

  8. shell脚本实现telnet测试服务端口

    备注,使用方法:当前目录下要存在需要测试的地址端口的文件ip.txt,例子:cat ip.txt141.12.65.17 7500 #!/bin/bashcur_dir=$(pwd)ipfile=$c ...

  9. Nginx性能调优之buffer参数设置

    Nginx 的缓存功能有:proxy_cache / fastcgi_cache proxy_cache的作用是缓存后端服务器的内容,可能是任何内容,包括静态的和动态.fastcgi_cache的作用 ...

  10. NodeJs 使用 multer 实现文件上传

    Multer 是一个 node.js 中间件,用于处理 multipart/form-data 类型的表单数据,它主要用于上传文件 注意: Multer 不会处理任何非 multipart/form- ...