Educational Codeforces Round 35 (Rated for Div. 2)
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)的更多相关文章
- 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 ...
- Educational Codeforces Round 72 (Rated for Div. 2)-D. Coloring Edges-拓扑排序
Educational Codeforces Round 72 (Rated for Div. 2)-D. Coloring Edges-拓扑排序 [Problem Description] 给你 ...
- 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< ...
- 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 ...
- 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 ...
- Educational Codeforces Round 63 (Rated for Div. 2) 题解
Educational Codeforces Round 63 (Rated for Div. 2)题解 题目链接 A. Reverse a Substring 给出一个字符串,现在可以对这个字符串进 ...
- 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 < ...
随机推荐
- js-语法
js中slice方法(转) 1.String.slice(start,end)returns a string containing a slice, or substring, of string. ...
- 对话框--pop&dialog总结
pinguo-zhouwei/CustomPopwindow:(通用PopupWindow,几行代码搞定PopupWindow弹窗(续)): 1,通用PopupWindow,几行代码搞定PopupWi ...
- docker整理
Docker的简单介绍 docker是什么 Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,于 2013 年 3 月以 Apache ...
- linux杂记
find [path] -name fileName find /home/audio/mrcp-asr/audio -type f -newermt '2019-04-23 00:00' ! -ne ...
- linux下查看已安装的软件与卸载
转自:https://blog.csdn.net/qq_22075041/article/details/78855849 因为linux安装软件的方式比较多,所以没有一个通用的办法能查到某些软件是否 ...
- Jmeter发送邮件功能SMTP Sampler
介绍Jmeter的发送邮件功能,使用的Sampler是SMTP Sampler,详细说明每个配置项的功能 从上往下介绍需要用到的配置项: Server settings Server: 服务器地址 P ...
- 逆向工程vgenerator(一)
前言 想要自己实现一个mybatis-generator类似的轮子,目前只实现MySQL部分的方法.利用下班时间,写了一个小项目,实现了这个功能.我准备分成三篇博客来写这个东西. 基类 /** *基类 ...
- [python,2019-02-15] 最短回文串
给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串.找到并返回可以用这种方式转换的最短回文串. 示例 1: 输入: "aacecaaa" 输出: "aaa ...
- Centos7 系统下怎么更改apache默认网站目录
当我们在Centos7中配置好Apache时,发现apache默认解析目录是在 /var/www/html,也就是说当访问服务器 IP 或者本地 localhost 时,默认定位到这个目录里的 ind ...
- 如何用Fiddler手机抓包
截获智能手机发出的HTTP包有什么用? 用处一: 手机软件程序员利用Fiddler,可以截获手机发出的HTTP包, 从而调试程序: 用处二: 软件测试人员用于测试智能手机上的软件: 用处三: 可以用来 ...