牛客小黑月赛48

C.可疑的区间

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
#define int long long
const int N = 10000010;
int s1[N],s2[N];
signed main()
{
	int n,len;cin>>n>>len;
    for(int i=1,l,r;i<=n;i++)
    {
        cin>>l>>r;
        s1[max(1ll,l-len+1)]++;
        s1[r+1]--;
        s2[max(1ll,l-len+1)]+=i;
        s2[r+1]-=i;
    }
    int maxv1=0,maxv2=0,res=1;
    for(int i=1;i<=5000000;i++)
    {
        s1[i]=s1[i]+s1[i-1];
        s2[i]=s2[i]+s2[i-1];
        if(s1[i]>maxv1||(s1[i]==maxv1&&s2[i]>maxv2))
        {
            maxv1=s1[i];
            maxv2=s2[i];
            res=1;
        }
        else if(s1[i]==maxv1&&s2[i]==maxv2)res++;
    }
    cout<<res<<'\n';
}

E.或与异或

#include <iostream>
#include <cstring>
#include <algorithm>
#include <set>
#include <functional>

using namespace std;
#define int long long
signed main()
{
	int T;cin>>T;
    while(T--)
    {
    	int a,b,q;cin>>a>>b>>q;
    	set<pair<int,int>>S;
    	function<bool(int,int)> dfs = [&](int a,int b)->bool
    	{
    		if(a==q||b==q)return true;
    		if(a>b)swap(a,b);
    		if(S.count({a,b}))return false;
    		S.insert({a,b});
    		if(dfs(a&b,a))return true;
    		if(dfs(a&b,b))return true;
    		if(dfs(a|b,a))return true;
    		if(dfs(a|b,b))return true;
    		if(dfs(a^b,a))return true;
    		if(dfs(a^b,b))return true;
    		return false;
		};
		if(dfs(a,b))cout<<"YES"<<'\n';
		else cout<<"NO"<<'\n';
	}
}

F.孤独的树

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <functional>
using namespace std;
#define int long long
const int N = 100010;
int w[N];
int f[N][2];
vector<int>g[N];
vector<int>rt[N];
bool vis[N];
int primes[N],idx=0,minp[N];

void prime()
{
    for(int i=2;i<N;i++)
    {
        if(!minp[i])primes[idx++]=i,minp[i]=i;
        for(int j=0;i*primes[j]<N;j++)
        {
            minp[primes[j]*i]=primes[j];
            if(i%primes[j]==0)break;
        }
    }
}

signed main()
{
	prime();
	int n;cin>>n;
    for(int i=1;i<=n;i++)
    {
    	cin>>w[i];
    	int x=w[i];
    	while(x>1)
    	{
    		rt[minp[x]].push_back(i);
    		x/=minp[x];
		}
	}
    for(int i=1,a,b;i<=n;i++)
    {
        cin>>a>>b;
        g[a].push_back(b);
        g[b].push_back(a);
    }
    
    function<void(int,int,int)> dfs = [&](int u,int fa,int p)
    {
    	int x=w[u],cnt=0;
        vis[u]=true;
    	while(x%p==0)cnt++,x/=p;
    	f[u][0]=cnt,f[u][1]=0;
    	for(auto v : g[u])
    	{
    		if(w[v]%p||v==fa||vis[v])continue;
    		dfs(v,u,p);
    		f[u][0]+=min(f[v][0],f[v][1]);
    		f[u][1]+=f[v][0];
		}
	};
    
    int res=0;
    for(int i=0;i<idx;i++)
    {
    	for(auto u : rt[primes[i]])vis[u]=0,f[u][0]=f[u][1]=0;
    	for(auto u : rt[primes[i]])if(!vis[u])dfs(u,0,primes[i]),res+=min(f[u][0],f[u][1]);
    	
	}
	cout<<res<<'\n';
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_WAWA鱼_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值