牛客竞赛30
D-小红整数操作
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<math.h>
#include<map>
#include <queue>
#include <set>
#include <vector>
#define ll long long
#define endl '\n'
using namespace std;
void solve(){
ll ans = 0;
ll x,y,l,r;
cin>>x>>y>>l>>r;
ll d = __gcd(x,y);
ll a = min(x/d,y/d),b = max(x/d,y/d);
int v1 = l/a+(l%a!=0),v2 = r/b;
if(v2<v1)cout<<0<<endl;
else cout<<v2-v1+1<<endl;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int t = 1;
while(t--){
solve();
}
}
E-小红树上染色
#include<bits/stdc++.h>
#define i64 long long
#define endl '\n'
using namespace std;
//n个节点n-1条边,邻接表
vector<int> ve[100005];
i64 dp[100005][2];//0为白,1为红
void dfs(int now,int fa){
dp[now][0] = 1;
dp[now][1] = 1;
for(auto it: ve[now]){
if(it == fa)continue;
dp[it][1] *= (dp[now][0]*dp[it][1])+dp[now][1]*dp[it][1];
dp[it][0] *= dp[now][1];
dfs(it,now);
}
}
void solve(){
int n,u,v;;
cin>>n;
for(int i = 1;i<=n;i++){
cin>>u>>v;
ve[u].push_back(v);
ve[v].push_back(u);
}
// dp
dfs(1,-1);
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int t = 1;
while(t--){
solve();
}
}
牛客周赛31
D-小红数组操作_牛客周赛 Round 31 (nowcoder.com)
E-小红的子集取反_牛客周赛 Round 31 (nowcoder.com)(dp + 偏移量)
//1,-1,2
#include<bits/stdc++.h>
using i64 = long long;
//第二层循环的意义,
void solve(){
int dp[205][80005],a[205];//表示前i个使得选择若干元素乘以-1后和为j的数量
//根据实际意义判断i,j的初始化
int n;
memset(dp,0x3f,sizeof(dp));
std::cin>>n;
for(int i = 1;i<=n;i++){
std::cin>>a[i];
}
dp[0][40000] = 0;
for(int i = 1;i<=n;i++){
for(int j = )
}
for(int i =1;i<=n;i++){
for(int j = 0;j<=80000;j++){
if(a[i]+j>=0&&a[i]+j<=80000)dp[i][j] = std::min(dp[i-1][j],dp[i-1][j+a[j]]);
if(j-a[i]>=0&&j-a[i]<=80000)dp[i][j] = std::min(dp[i-1][j],dp[i-1][j-a[j]]+1);
}
}
std::cout<<dp[n][40000]<<'\n';
}
int main()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
int t = 1;
while(t--){
solve();
}
}
牛客情人节专场
E-时间银河_牛客2024年情人节比赛 (nowcoder.com)(每连续的400天就有97个闰年)
牛客周赛33
#C-小红的 01 串_牛客周赛 Round 33 (nowcoder.com)
#include <bits/stdc++.h>
using namespace std;
string s;
int main()
{
cin >> s;
int t = 0,ans = 0,temp = 0;
int len = s.size();
for(int i = 0;i < len;i++){
if(s[i] == '0'){
t++;
}else{
break;
}
}
for(int i = t; i < len; i++){
if(s[i] == '1'){
temp++;
}else{
temp--;
}
}
ans = temp;
for(int i = t+1; i < len; i++){
if(s[i] == '0')ans++;
else ans--;
temp = max(ans,temp);
}
cout << temp << '\n';
return 0;
}
D-小红的数组清空_牛客周赛 Round 33 (nowcoder.com)(multiset和vector的妙用)
#include<bits/stdc++.h>
using i64 = long long;
using namespace std;
void solve(){
int n,a[100005];
cin>>n;
multiset<int> s;
for(int i = 1;i<=n;i++){
int temp;
cin>>temp;
s.insert(temp);
}
int ans = 0;
while(!s.empty()){
vector<int>del;
for(int i = *s.begin();s.find(i) != s.end(); i++){
del.push_back(i);
}
for(auto i : del){
s.extract(i);
}
ans++;
}
cout<<ans<<'\n';
}
int main()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
int t = 1;
while(t--){
solve();
}
}
E-小红勇闯地下城_牛客周赛 Round 33 (nowcoder.com)(dijkstra——迪杰特斯拉模板)
#include<bits/stdc++.h>
using i64 = long long;
using namespace std;
int dx[4] = {0,0,-1,1};
int dy[4] = {1,-1,0,0};
struct node{
int w;
int x,y;
bool operator<(const node &u) const
{
return w > u.w;
}
};
int n, m, x;
int u, v, uu, vv;
void solve(){
cin >> n >> m >> x;
char mp[n+10][m+10];
int dis[n+10][m+10];
bool vis[n+10][m+10];
memset(dis, 0x3f, sizeof(dis));
memset(vis, 0, sizeof(vis));
for(int i = 1;i<=n;i++)
for(int j = 1;j<=m;j++)
cin>>mp[i][j];
for(int i = 1;i<=n;i++)
for(int j = 1;j<=m;j++){
if(mp[i][j] == 'T')
uu = i,vv = j;
if(mp[i][j] == 'S')
u = i, v = j;
}
priority_queue<node> q;
q.push({0, u, v});
dis[u][v] = 0;
while (!q.empty()){
node t = q.top();
int x = t.x, y = t.y;
int ddd = t.w;
q.pop();
if(vis[x][y])
continue;
vis[x][y] = 1;
for(int g = 0; g<4; g++){
int tx = x + dx[g], ty = y + dy[g];
if(tx > n || tx < 1 || ty > m || ty < 1)
continue;
if(tx == uu && ty == vv){
dis[uu][vv] = min(dis[uu][vv], dis[x][y]);
}
int D = ddd + mp[tx][ty] - '0';
if(D < dis[tx][ty]){
dis[tx][ty] = D;
q.push({D, tx, ty});
}
}
}
if (dis[uu][vv] < x)
cout<<"Yes"<<'\n';
else
cout<<"No"<<'\n';
}
int main()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
int t ;
cin>>t;
while(t--){
solve();
}
}
牛客竞赛34
E-小红的树形 dp
#include<bits/stdc++.h>
using i64 = long long;
using namespace std;
vector<int> ve[100005];
int n;
string p,s;
int flag1 = 0;//判断有没有d/p;
int vis[100005];
int temp = 0;
int flag2 = 0;//判断是否矛盾;
int flag3 = 0;
void dfs1(int now,int fa,int dis){
if(flag2==1){
return ;
}
if(dis%2==1){
if(s[now]=='d'){
s[now] = 'd';
}else if(s[now]=='p'){
flag2 = 1;
}else if(s[now]=='?'){
s[now] = 'd';
}
}else if(dis%2==0){
// cout<<d[0]<<'\n';
if(s[now]=='p'){
s[now] = 'p';
}else if(s[now]=='d'){
flag2 = 1;
}else if(s[now]=='?'){
s[now] = 'p';
}
}
for(auto i: ve[now]){
if(i == fa)continue;
if(!vis[i]){
dis++;
vis[i] = 1;
dfs1(i,now,dis);
dis--;
}
}
}
void dfs2(int now,int fa,int dis){
if(flag3==1){
return ;
}
if(dis%2==1){
if(p[now]=='p'){
p[now] = 'p';
}else if(p[now]=='d'){
flag3 = 1;
}else if(p[now]=='?'){
p[now] = 'p';
}
}else if(dis%2==0){
// cout<<d[0]<<'\n';
if(p[now]=='d'){
s[now] = 'd';
}else if(p[now]=='p'){
flag3 = 1;
}else if(p[now]=='?'){
p[now] = 'd';
}
}
for(auto i: ve[now]){
if(i == fa)continue;
if(!vis[i]){
dis++;
vis[i] = 1;
dfs2(i,now,dis);
dis--;
}
}
}
void solve(){
cin>>n;
cin>>s;
s = " " + s;
p = s;
for(int i = 0;i<n-1;i++){
int u,v;
cin>>u>>v;
ve[u].push_back(v);
ve[v].push_back(u);
}
if(s[1] == '?'){
memset(vis,0,sizeof(vis));
vis[1] = 1;
dfs1(1,-1,0);
if(flag2==0){
for(int i = 1;i<s.size();i++)cout<<s[i];
return ;
}
memset(vis,0,sizeof(vis));
vis[1] = 1;
dfs2(1,-1,0);
if(flag3==0){
for(int i = 1;i<p.size();i++)cout<<p[i];
return;
}
}else if(s[1]=='p'){
memset(vis,0,sizeof(vis));
vis[1] = 1;
dfs1(1,-1,0);
if(flag2==0){
for(int i = 1;i<s.size();i++)cout<<s[i];
return ;
}
}else if(s[1]=='d'){
memset(vis,0,sizeof(vis));
vis[1] = 1;
dfs2(1,-1,0);
if(flag3==0){
for(int i = 1;i<p.size();i++)cout<<p[i];
return ;
}
}
cout<<"-1"<<'\n';
}
int main()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
int t = 1;
while(t--){
solve();
}
}
F-思维构造题
#include<bits/stdc++.h>
using i64 = long long;
using namespace std;
void solve(){
int n,m,x;
cin>>n>>m>>x;
int a[n+5][m+5];
memset(a,0,sizeof(a));
if(x%4==0&&x>2){
a[0][0] = a[1][0] = a[1][1] = a[0][1] = x/4;
for(int i = 0;i<n;i++){
for(int j = 0;j<m;j++){
cout<<a[i][j]<<" ";
}
cout<<'\n';
}
}else if(x%4==2&&x>2){
// cout<<"t"<<'\n';
x-=6;
a[0][0] = a[1][0] = a[1][1] = a[0][1] = x/4;
a[1][2] = a[1][3] = a[2][2] = a[2][1] = a[3][1] = a[3][3] = 1;
for(int i = 0;i<n;i++){
for(int j = 0;j<m;j++){
cout<<a[i][j]<<" ";
}
cout<<'\n';
}
}else{
cout<<"-1"<<'\n';
}
}
int main()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
int t = 1;
while(t--){
solve();
}
}
牛客竞赛35
D-小红的排列构造
#include<bits/stdc++.h>
using i64 = long long;
using namespace std;
void solve(){
int n,a[100005];
cin>>n;
int flag[100005];
int j = 1;
memset(flag,0,sizeof(flag));
for(int i = 1;i<=n;i++){
cin>>a[i];
if(a[i]<=n)flag[a[i]] = 1;
}
vector<pair<int,int>>v;
for(int i = 1;i<=n;i++){
if(a[i]<=n&&flag[a[i]]==1){
flag[a[i]] = 2;
continue;
}else{
while(flag[j]!=0)j++;
v.push_back({i,j});
flag[j] = 1;
}
}
cout<<v.size()<<'\n';
for(auto j:v){
cout<<j.first<<" "<<j.second<<'\n';
}
}
int main()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
int t = 1;
while(t--){
solve();
}
}
E-无向图的构造
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 2e5+7;
void solve(){
int n,m;
cin>>n>>m;
vector<int>v[maxn];
int maxx = 0;
//点和边的性质,m<n-1不行
for(int i = 1;i<=n;i++){
int key;
cin>>key;
v[key].push_back(i);
maxx = max(maxx,key);
}
if(m<n-1){
cout<<"-1"<<'\n';
return ;
}
vector<pair<int,int>>ve;//存边的
for(int i = 1;i<=maxx;i++){
if(v[i].empty()){
cout<<"-1"<<'\n';
return ;
}else{
for(auto j:v[i]){
ve.push_back({v[i-1][0],j});
}
}
}
if(ve.size()<m){
for(int i = 1;i<=maxx;i++){
for(int j = 0;j<v[i].size();j++){
for(int k = j+1;k<v[i].size();k++){
ve.push_back({v[i][j],v[i][k]});
if(ve.size()>=m)break;
}
if(ve.size()>=m)break;
}
}
for(int i = 1;i<=maxx;i++){
for(int j = 1;j<v[i].size();j++){
for(auto k:v[i+1]){
ve.push_back({v[i][j],k});
if(ve.size()>=m)break;
}
if(ve.size()>=m)break;
}
if(ve.size()>=m)break;
}
}
if(ve.size()<m){
cout<<"-1"<<'\n';
}else{
for(auto j:ve){
cout<<j.first<<" "<<j.second<<'\n';
}
}
}
signed main()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
int t = 1;
while(t--){
solve();
}
return 0;
}
牛客竞赛36
C-小红的白色字符
思维题
#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve()
{
string s;
cin >> s;
int cnt = 0;
for (int i = 1; i < s.size(); i++)
{
if(isupper(s[i])){
cnt++;
i++;
}
}
cout << cnt;
}
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int t = 1;
//cin >> t;
while (t--)
{
solve();
}
return 0;
}
牛客竞赛38
E-小苯的等比数列
#include<bits/stdc++.h>
#define int long long
using namespace std;
void solve(){
int n;
cin>>n;
int maxn = 0;
int a[302020];
int mp[302020];
int ans = 0;
for(int i = 1;i<=n;i++){
cin>>a[i];
mp[a[i]]++;
ans = max(ans,mp[a[i]]);
}
for(int i = 2;pow(i,ans)<4e5;i++){
for(int j = 1;j<=n;j++){
int k = a[j];
int cnt = 0;
while(k<=2e5&&mp[k]>0){
cnt++;
k*=i;
}
ans = max(ans,cnt);
}
}
cout<<ans<<'\n';
}
signed main()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
int t = 1;
while(t--){
solve();
}
}
//找规律,数学,dfs,bfs
F-小苯的回文询问
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,q;
int a[100005],la[100005];
struct node{
int l,r;
int mx;
};
node tr[404040];
void pushup(int rt){
tr[rt].mx = max(tr[rt*2].mx,tr[rt*2+1].mx);
}
void build(int rt,int l,int r){
if(l==r){
tr[rt] = {l,r,la[l]};
}else{
tr[rt] = {l,r};
int mid = (l+r)>>1;
build(rt*2,l,mid);
build(rt*2+1,mid+1,r);
pushup(rt);
}
}
int ask(int rt,int l,int r){
if(tr[rt].l>=l&&tr[rt].r<=r){
return tr[rt].mx;
}
int mid = (tr[rt].l+tr[rt].r)>>1;
int ans = 0;
if(l<=mid){
ans = max(ans,ask(rt*2,l,r));
}
if(r>mid){
ans = max(ans,ask(rt*2+1,l,r));
}
return ans;
}
void solve(){
map<int,int>mp;
cin>>n>>q;
for(int i = 1;i<=n;i++){
cin>>a[i];
if(mp.count(a[i])){
la[i] = mp[a[i]];
}
mp[a[i]] = i;
}
for(int i = n;i;i--){
if(la[i]==i-1){
la[i] = la[la[i]];
}
}
build(1,1,n);
while(q--){
int l,r;
cin>>l>>r;
if(ask(1,l,r)>=l){
cout<<"YES"<<'\n';
}else{
cout<<"NO"<<'\n';
}
}
}
signed main()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
int t = 1;
while(t--){
solve();
}
}
//找规律,数学,dfs,bfs
牛客竞赛-39
在纸上模拟一遍过程。
#include<bits/stdc++.h>
#define int long long
using namespace std;
void solve(){
int n,k;
cin>>n>>k;
int a[1005005];
int sum = 0;
for(int i = 1;i<=n;i++){
cin>>a[i];
sum+=a[i];
}
sum%=k;
int ans = 0;
sort(a+1,a+1+n);
if(sum==0){
cout<<0<<'\n';
return ;
}
for(int i = n;i>=1;i--){
if(sum>a[i]){
sum-=a[i];
ans++;
}else{
cout<<ans+1<<'\n';
return ;
}
}
}
signed main()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
int t = 1;
while(t--){
solve();
}
}
牛客竞赛-39
D-小红升装备
完全背包
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define inf 0x3f3f3f3f3f3f3f3f
#define mod 998244353
#define N 310
int att[N];
int price[N];
int cost[N];
int up[N];
int lv[N];
int n, x;
int dp[N];
void solve()
{
cin >> n >> x;
for (int i = 1; i <= n; i++)
{
cin >> att[i] >> price[i] >> cost[i] >> up[i] >> lv[i];
}
memset(dp, 0, sizeof(dp)); // Initialize dp array with 0
for (int i = 1; i <= n; i++)
{
for (int j = x; j >= 1; j--)
{
for (int k = 0; k <= lv[i] && price[i] + k * cost[i] <= j; k++)
{
dp[j] = max(dp[j], dp[j - price[i] - k * cost[i]] + att[i] + k * up[i] );
}
}
}
cout << dp[x];
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int t = 1;
//cin >> t;
while (t--)
{
solve();
}
return 0;
}
E-小红的矩阵划分