牛客小白月赛22
水水水----放点稍微不水的
A.操作序列
模拟+stl
看着题意打就行,主要输入恶心,所以上榜了
#pragma GCC optimize(3,"Ofast","inline") //G++
#include<bits/stdc++.h>
#define TEST freopen("C:\\Users\\hp\\Desktop\\ACM\\in.txt","r",stdin);
#define mem(a,x) memset(a,x,sizeof(a))
#define debug(x) cout << #x << ": " << x << endl;
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define fcout cout<<setprecision(4)<<fixed
using namespace std;
typedef long long ll;
typedef pair<int,int> pi;
const int inf=0x3f3f3f3f;
const ll INF=0x7fffffffffffffff;
const int mod=1e9+7;
const int maxn = 1e6+5;
const double eps=1e-8;
template<typename T> void read(T &x) {
x = 0;
char ch = getchar();
ll f = 1;
while(!isdigit(ch)) {
if(ch == '-')f*=-1;
ch=getchar();
}
while(isdigit(ch)) {
x = x*10+ch-48;
ch=getchar();
}
x*=f;
}
template<typename T, typename... Args> void read(T &first, Args& ... args) {
read(first);
read(args...);
}
int sgn(double a) {
return a<-eps?-1:a<eps?0:1;
}
int num[105];
int get_cin(){
string str;
getline(cin,str);
if(str[0]=='-')
return -1;
int n=str.size();
int op=1,pos;
for(int i=0;i<n;i++){
if(str[i]==' ')
op=2,pos=i;
}
if(op==1){
num[1]=0;
for(int i=0;i<n;i++){
num[1]=num[1]*10+str[i]-'0';
}
}
else{
num[1]=num[2]=0;
for(int i=0;i<pos;i++){
num[1]=num[1]*10+str[i]-'0';
}
for(int i=pos+1;i<n;i++){
num[2]=num[2]*10+str[i]-'0';
}
}
return op;
}
set<int>s;
map<int,int>mp;
void solve(){
int op=get_cin();
if(op==2){
int t=num[1],c=num[2];
// auto it=s.lower_bound(t-30);
// if(it==s.end()||*it>t+30){
// s.insert(t);
// mp[t]=c;
// }
if(c&&s.lower_bound(t-30)==s.upper_bound(t+30)){
s.insert(t);
mp[t]=c;
}
}
else if(op==1){
int t=num[1];
cout<<mp[t]<<"\n";
}
else
{
if(s.size()==0){
cout<<"skipped\n";
return ;
}
cout<<mp[*s.begin()]<<"\n";
mp[*s.begin()]=0;
s.erase(s.begin());
}
}
int main(){
int T;
scanf("%d",&T);
getchar();
while(T--)
solve();
}
B
树的直径—树形DP
#pragma GCC optimize(3,"Ofast","inline") //G++
#include<bits/stdc++.h>
#define mem(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pi;
const ll inf=0x3f3f3f3f;
const ll maxn = 1e6+5;
template<typename T> void read(T &x){
x = 0;char ch = getchar();ll f = 1;
while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();}
while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f;
}
template<typename T, typename... Args> void read(T &first, Args& ... args) {
read(first);
read(args...);
}
ll n, m;
ll ans=-1e15;
vector<ll> edge[maxn];
void add(ll x,ll y){
edge[x].push_back(y);
edge[y].push_back(x);
}
ll dp[maxn][2];// 0最长 1次长
ll a[maxn];
void dfs(ll u,ll fa){
dp[u][0] =a[u];
dp[u][1] = -inf;
for(auto v:edge[u]){
if(v==fa) continue;
dfs(v,u);
if(dp[v][0]+a[u]>dp[u][0]) dp[u][1]=dp[u][0],dp[u][0]=dp[v][0]+a[u];
else if(dp[v][0]+a[u]>dp[u][1])
dp[u][1] = dp[v][0] + a[u];
}
ans = max(dp[u][0] + dp[u][1]-a[u], ans);
}
main()
{
read(n);
for (ll i = 1; i <= n;i++){
read(a[i]);
ans = max(a[i], ans);
// dp[i][0] = dp[i][1] = -inf;
}
for (ll i = 1; i <= n - 1; i++)
{
ll x, y;
read(x, y);
add(x, y);
}
dfs(1, 0);
cout << ans << "\n";
}
C
所有状态预处理一遍即可
//#pragma GCC optimize(3,"Ofast","inline") //G++
//#include<bits/stdc++.h>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<stack>
#include <cstdlib>
#include <iomanip>
#define TEST freopen("C:\\Users\\hp\\Desktop\\ACM\\in.txt","r",stdin);
#define mem(a,x) memset(a,x,sizeof(a))
#define debug(x) cout << #x << ": " << x << endl;
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define fcout cout << setprecision(4) << fixed;
using namespace std;
typedef long long ll;
typedef pair<int,int> pi;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
const int maxn = 1e6+5;
const double eps=1e-8;
template<typename T> void read(T &x){
x = 0;char ch = getchar();int f = 1;
while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();}
while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f;
}
template<typename T, typename... Args> void read(T &first, Args& ... args) {
read(first);
read(args...);
}
int sgn(double a){
return a<-eps?-1:a<eps?0:1;
}
int a[maxn],dp[maxn];
void dfs(int now,int pos){
if(now==11){
int sum = 0;
for (int i = 1;i<=12;i++)
sum = sum + (a[i]);
dp[pos] = min(dp[pos], sum);
return ;
}
dfs(now + 1,pos);
if(a[now]==1&&a[now+1]==1&&a[now+2]==0){
a[now] = 0, a[now + 1] = 0, a[now + 2] = 1;
dfs(max(now-2,1) ,pos);
a[now] = 1, a[now + 1] = 1, a[now + 2] = 0;
}
if(a[now]==0&&a[now+1]==1&&a[now+2]==1){
a[now] = 1, a[now + 1] = 0, a[now + 2] = 0;
dfs(max(now-2,1) ,pos);
a[now] = 0, a[now + 1] = 1, a[now + 2] = 1;
}
}
void init(){
for (int i = 0;i<(1<<12);i++){
for(int j=0,k=12;j<12;j++,k--){
a[k] =((i >> j) & 1);
}
dp[i] = inf;
dfs(1, i);
}
}
char s[maxn];
void solve(){
int sum = 0;
scanf("%s", s + 1);
for(int i=1;i<=12;i++){
sum = sum * 2 + (s[i]=='o');
}
cout << dp[sum] << "\n";
}
int main(){
init();
int T;
read(T);
while(T--)
solve();
}
D.dfs暴力 水题
F签到题 水题
G暴力 水题
H
区间合并+差分数组 好像还是水题
//#pragma GCC optimize(3,"Ofast","inline") //G++
//#include<bits/stdc++.h>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<stack>
#include <cstdlib>
#include <iomanip>
#define TEST freopen("C:\\Users\\hp\\Desktop\\ACM\\in.txt","r",stdin);
#define mem(a,x) memset(a,x,sizeof(a))
#define debug(x) cout << #x << ": " << x << endl;
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define fcout cout << setprecision(4) << fixed;
using namespace std;
typedef long long ll;
typedef pair<int,int> pi;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
const int maxn = 1e6+5;
const double eps=1e-8;
template<typename T> void read(T &x){
x = 0;char ch = getchar();int f = 1;
while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();}
while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f;
}
template<typename T, typename... Args> void read(T &first, Args& ... args) {
read(first);
read(args...);
}
int sgn(double a){
return a<-eps?-1:a<eps?0:1;
}
int n, m;
int d[maxn];
map<int,vector<pair<int, int> > > mp;
void add(int l,int r){
d[l]++, d[r + 1]--;
}
void work(vector<pair<int,int> >v){
sort(v.begin(), v.end());
int l=maxn,r=-maxn;
for(auto it:v){
int ll = it.first;
int rr = it.second;
if(ll>r){
if(l!=maxn){
add(l, r);
}
l = ll, r = rr;
}
else{
l=min(l,ll);
r = max(r, rr);
}
}
add(l, r);
}
void solve(){
read(n, m);
for (int i = 1; i <= n;i++){
int l, r, dd;
read(l, r, dd);
mp[dd].push_back({l, r});
}
for(auto it:mp){
work(mp[it.first]);
}
int ans, sum = 0;
for (int i = 1;i<=n;i++){
d[i] += d[i - 1];
if(d[i]>sum){
sum=d[i];
ans = i;
}
}
cout << ans << "\n";
}
int main(){
solve();
}
I不会
J模拟—水题