廣電總局要求精簡撤銷 14 個電視訊道和 7 個廣播頻率
阿新 • • 發佈:2021-10-03
傳送門:https://codeforces.com/contest/1405
A
將序列翻轉輸出即可。
#pragma GCC optimize("O3") #include<bits/stdc++.h> using namespace std; #define endl '\n' #define debug(x) cerr << #x << ": " << x << endl #define pb push_back #define eb emplace_back #define set0(a) memset(a,0,sizeof(a)) #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define dwn(i,a,b) for(int i=(a);i>=(b);i--) #define ceil(a,b) (a+(b-1))/(b) #define all(x) (x).begin(), (x).end() #define SUM(a) accumulate(all(a), 0LL) #define MIN(a) (*min_element(all(a))) #define MAX(a) (*max_element(all(a))) #define lb(a, x) distance(begin(a), lower_bound(all(a), (x))) #define ub(a, x) distance(begin(a), upper_bound(all(a), (x))) #define INF 0x3f3f3f3f #define ll_INF 0x7f7f7f7f7f7f7f7f using pii = pair<int, int>; using pdd = pair<double, double>; using vi = vector<int>; using vvi = vector<vi>; using vb = vector<bool>; using vpii = vector<pii>; using ll = long long; using ull = unsigned long long; inline void read(int &x) { int s=0;x=1; char ch=getchar(); while(ch<'0'||ch>'9') {if(ch=='-')x=-1;ch=getchar();} while(ch>='0'&&ch<='9') s=(s<<3)+(s<<1)+ch-'0',ch=getchar(); x*=s; } int main(){ int T; cin>>T; while(T--){ int n; cin>>n; vi res; rep(i,1,n){ int v; read(v); res.pb(v); } reverse(all(res)); for(auto i: res) cout<<i<<' '; cout<<endl; } return 0; }
B
維護當前的正值,看看最後的正值是多少。
#pragma GCC optimize("O3") #include<bits/stdc++.h> using namespace std; #define endl '\n' #define debug(x) cerr << #x << ": " << x << endl #define pb push_back #define eb emplace_back #define set0(a) memset(a,0,sizeof(a)) #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define dwn(i,a,b) for(int i=(a);i>=(b);i--) #define ceil(a,b) (a+(b-1))/(b) #define all(x) (x).begin(), (x).end() #define SUM(a) accumulate(all(a), 0LL) #define MIN(a) (*min_element(all(a))) #define MAX(a) (*max_element(all(a))) #define lb(a, x) distance(begin(a), lower_bound(all(a), (x))) #define ub(a, x) distance(begin(a), upper_bound(all(a), (x))) #define INF 0x3f3f3f3f #define ll_INF 0x7f7f7f7f7f7f7f7f using pii = pair<int, int>; using pdd = pair<double, double>; using vi = vector<int>; using vvi = vector<vi>; using vb = vector<bool>; using vpii = vector<pii>; using ll = long long; using ull = unsigned long long; inline void read(ll &x) { int s=0;x=1; char ch=getchar(); while(ch<'0'||ch>'9') {if(ch=='-')x=-1;ch=getchar();} while(ch>='0'&&ch<='9') s=(s<<3)+(s<<1)+ch-'0',ch=getchar(); x*=s; } int main(){ int T; cin>>T; while(T--){ int n; cin>>n; ll cur=0; rep(i,1,n){ ll v; read(v); cur=max(0LL, cur+v); } cout<<cur<<endl; } return 0; }
C
注意到必須有第 \(i\) 個元素等於 \(i+k\) 個元素,如果出現衝突輸出 NO
,否則看看 \([1, k]\) 的元素是否出現 \(1\) 或者 \(0\) 個數超過 \(\frac{k}{2}\) 的情況,沒有就是 YES
。
#pragma GCC optimize("O3") #include<bits/stdc++.h> using namespace std; #define endl '\n' #define debug(x) cerr << #x << ": " << x << endl #define pb push_back #define eb emplace_back #define set0(a) memset(a,0,sizeof(a)) #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define dwn(i,a,b) for(int i=(a);i>=(b);i--) #define ceil(a,b) (a+(b-1))/(b) #define all(x) (x).begin(), (x).end() #define SUM(a) accumulate(all(a), 0LL) #define MIN(a) (*min_element(all(a))) #define MAX(a) (*max_element(all(a))) #define lb(a, x) distance(begin(a), lower_bound(all(a), (x))) #define ub(a, x) distance(begin(a), upper_bound(all(a), (x))) #define INF 0x3f3f3f3f #define ll_INF 0x7f7f7f7f7f7f7f7f using pii = pair<int, int>; using pdd = pair<double, double>; using vi = vector<int>; using vvi = vector<vi>; using vb = vector<bool>; using vpii = vector<pii>; using ll = long long; using ull = unsigned long long; inline void read(int &x) { int s=0;x=1; char ch=getchar(); while(ch<'0'||ch>'9') {if(ch=='-')x=-1;ch=getchar();} while(ch>='0'&&ch<='9') s=(s<<3)+(s<<1)+ch-'0',ch=getchar(); x*=s; } string s; int main(){ ios::sync_with_stdio(false); int T; cin>>T; while(T--){ int n, k; cin>>n>>k; cin>>s; s=' '+s; for(auto &i: s) if(i=='?') i='2'; vi res(n+1, 2); bool ok=true; rep(i,1,k) for(int j=i; j<=n; j+=k){ int v=s[j]-'0'; if(v==2) continue; if((v^res[i])==1){ ok=false; break; } res[i]=v; } if(!ok){ puts("NO"); continue; } int cnt[2]={0}; rep(i,1,n) if(res[i]!=2) cnt[res[i]]++; if(cnt[0]>k/2 || cnt[1]>k/2) puts("NO"); else puts("YES"); } return 0; }
D
圖論 + 結論題
Alice
勝利當且僅當下面至少一條滿足:
- 樹的直徑 \(\geq 2da\)
- \(2da\geq db\)
- 初始距離 \(da\geq dis(a, b)\)
#pragma GCC optimize("O3")
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define debug(x) cerr << #x << ": " << x << endl
#define pb push_back
#define eb emplace_back
#define set0(a) memset(a,0,sizeof(a))
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define dwn(i,a,b) for(int i=(a);i>=(b);i--)
#define ceil(a,b) (a+(b-1))/(b)
#define all(x) (x).begin(), (x).end()
#define SUM(a) accumulate(all(a), 0LL)
#define MIN(a) (*min_element(all(a)))
#define MAX(a) (*max_element(all(a)))
#define lb(a, x) distance(begin(a), lower_bound(all(a), (x)))
#define ub(a, x) distance(begin(a), upper_bound(all(a), (x)))
#define INF 0x3f3f3f3f
#define ll_INF 0x7f7f7f7f7f7f7f7f
using pii = pair<int, int>;
using pdd = pair<double, double>;
using vi = vector<int>;
using vvi = vector<vi>;
using vb = vector<bool>;
using vpii = vector<pii>;
using ll = long long;
using ull = unsigned long long;
inline void read(int &x) {
int s=0;x=1;
char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-')x=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=(s<<3)+(s<<1)+ch-'0',ch=getchar();
x*=s;
}
const int N=1e5+5, M=N<<1;
struct Edge{
int to, next;
}e[M];
int n;
int h[N], tot;
void add(int u, int v){
e[tot].to=v, e[tot].next=h[u], h[u]=tot++;
}
int fa[N], son[N], sz[N], dep[N];
int cnt, id[N], top[N];
void dfs1(int u, int father, int depth){
fa[u]=father, sz[u]=1, dep[u]=depth;
for(int i=h[u]; ~i; i=e[i].next){
int go=e[i].to;
if(go==father) continue;
dfs1(go, u, depth+1);
sz[u]+=sz[go];
if(sz[go]>sz[son[u]]) son[u]=go;
}
}
void dfs2(int u, int t){
id[u]=++cnt, top[u]=t;
if(!son[u]) return;
dfs2(son[u], t);
for(int i=h[u]; ~i; i=e[i].next){
int go=e[i].to;
if(go==fa[u] || go==son[u]) continue;
dfs2(go, go);
}
}
int lca(int u, int v){
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) swap(u, v);
u=fa[top[u]];
}
return dep[u]<dep[v]? u: v;
}
int dis(int x, int y){
return dep[x]+dep[y]-2*dep[lca(x, y)];
}
bool vis[N];
int d[N];
int find(int u){
queue<int> q;
q.push(u);
rep(i,1,n) vis[i]=0, d[i]=INF;
d[u]=0; int res=0;
vis[u]=true;
while(q.size()){
int t=q.front(); q.pop();
for(int i=h[t]; ~i; i=e[i].next){
int go=e[i].to;
if(!vis[go]){
vis[go]=true;
d[go]=d[t]+1;
res=max(res, d[go]);
q.push(go);
}
}
}
return res;
}
int get_D(){
int u=1;
rep(i,1,n) if(dep[i]>dep[u]) u=i;
return find(u);
}
int main(){
int T; cin>>T;
while(T--){
int a, b, x, y; cin>>n>>a>>b>>x>>y;
rep(i,1,n) h[i]=-1, son[i]=fa[i]=top[i]=sz[i]=dep[i]=id[i]=0;
tot=cnt=0;
rep(i,1,n-1){
int u, v; read(u), read(v);
add(u, v), add(v, u);
}
dfs1(1, -1, 1), dfs2(1, 1);
int d=get_D();
if(dis(a, b)<=x || d<=2*x || 2*x>=y) puts("Alice");
else puts("Bob");
}
return 0;
}