1,校门外的树;2,Milk Visits G(待补);3,cf Prefix Sum Primes
1,校门外的树
提醒自己:由差分数组还原本数组时,一定不要忘了a[0]+=cf[0]!!!,
int cf[N];
int a[N];
int L,M;
signed main()
{
quick_cin();
cin>>L>>M;
while (M--)
{
int l,r;
cin>>l>>r;
cf[l]+=1;
cf[r+1]-=1;
}
LL ans=0;
if(!cf[0])
{
ans+=1;
}
a[0]+=cf[0];/!!!!很重要!
rep2(i,1,L)
{
a[i]=a[i-1]+cf[i];
if(a[i]==0)ans++;
}
cout<<ans;
return 0;
}
2,Milk Visits G;
思路:类似lca,每次去往最近公共祖先去靠,但是是逐个靠过去,所以能知道途径每个节点的信息;但是给tle一个数据;
#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define rep1(i,a,n) for(register int i=a;i<n;++i)
#define rep2(i,a,n) for(register int i=a;i<=n;++i)
#define per1(i,n,a) for( int i=n;i>a;i--)
#define per2(i,n,a) for( int i=n;i>=a;i--)
#define quick_cin() cin.tie(0),cout.tie(0),ios::sync_with_stdio(false)
#define memset(a,i,b) memset((a),(i),sizeof (b))
#define memcpy(a,i,b) memcpy((a),(i),sizeof (b))
#define pro_q priority_queue
#define pb push_back
#define pf push_front
#define endl "\n"
#define lowbit(m) ((-m)&(m))
#define YES cout<<"YES\n"
#define NO cout<<"NO\n"
#define Yes cout<<"Yes\n"
#define No cout<<"No\n"
#define yes cout<<"yes\n"
#define no cout<<"no\n"
#define yi first
#define er second
#define INF 0x3f3f3f3f
#define tulun() int e[N],ne[N],h[N],w[N],idx;
#define add2(a,b) e[idx]=b,ne[idx]=h[a],h[a]=idx++;
#define add3(a,b,c) w[idx]=c,e[idx]=b,ne[idx]=h[a],h[a]=idx++;
using namespace std;
typedef pair<int,int> PII;
typedef pair<long long,long long>PLL;
typedef pair<int,PII> PIII;
typedef long long LL;
typedef double dob;
const int N=1e6+10;
tulun();
int n,m;
int hs[N];
int cow[N];
int ans[N];
int q[N];
int st[N];
int fa[N];
int d[N];
void bfs()
{
int hh=0,tt=0;
q[tt]=1;
d[1]=1;
st[1]=1;
while(hh<=tt)
{
int t=q[hh++];
int ceng=d[t];
for(int i=h[t];~i;i=ne[i])
{
int j=e[i];
if(!st[j])
{
fa[j]=t;
d[j]=ceng+1;
q[++tt]=j;
st[j]=1;
}
}
}
}
bool find(int a,int b,int c)
{
if(d[a]>d[b])
{
int temp=a;
a=b;
b=temp;
}
while(d[a]!=d[b])
{
int fab=fa[b];
if(cow[fab]==c)
{
return 1;
}
b=fab;
}
if(a==b)return 0;
while(fa[a]!=fa[b])
{
int faa=fa[a];
if(cow[faa]==c)return 1;
int fab=fa[b];
if(cow[fab]==c)return 1;
a=fa[a];
b=fa[b];
}
if(cow[fa[a]]==c)return 1;
return 0;
}
signed main()
{
quick_cin();
cin>>n>>m;
memset(h,-1,h);
rep2(i,1,n)
{
int x;cin>>x;
hs[x]=1;
cow[i]=x;
}
rep2(i,1,n-1)
{
int a,b;
cin>>a>>b;
add2(a,b);
add2(b,a);
}
bfs();
rep2(i,1,m)
{
int a,b,c;
cin>>a>>b>>c;
if(!hs[c])continue;
if(a==b&&cow[a]==c)ans[i]=1;
else
{
if(cow[a]==c||cow[b]==c)ans[i]=1;
else
{
if(find(a,b,c))ans[i]=1;
}
}
}
rep2(i,1,m)cout<<ans[i];
return 0;
}
3,Prefix Sum Primes
题意:
给你长度为n的1 2序列,你需要重新排列1 2 序列,使得从1开始的前缀和得到的素数最多;
思路: 很容易想到的是,偶数肯定不是素数。所以一种构造方案是,先构造出3,在一直放2,再放1;特判构造3的情况就行;
#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define rep1(i,a,n) for(register int i=(a);i<(n);++i)
#define rep2(i,a,n) for(register int i=(a);i<=(n);++i)
#define per1(i,n,a) for(register int i=(n);i>(a);i--)
#define per2(i,n,a) for(register int i=(n);i>=(a);i--)
#define quick_cin() cin.tie(0),cout.tie(0),ios::sync_with_stdio(false)
#define memset(a,i,b) memset((a),(i),sizeof (b))
#define memcpy(a,i,b) memcpy((a),(i),sizeof (b))
#define pro_q priority_queue
#define pb push_back
#define pf push_front
#define endl "\n"
#define lowbit(m) ((-m)&(m))
#define YES cout<<"YES\n"
#define NO cout<<"NO\n"
#define Yes cout<<"Yes\n"
#define No cout<<"No\n"
#define yes cout<<"yes\n"
#define no cout<<"no\n"
#define yi first
#define er second
#define INF 0x3f3f3f3f
#define tulun() int e[N],ne[N],h[N],w[N],idx;
#define add2(a,b) e[idx]=b,ne[idx]=h[a],h[a]=idx++;
#define add3(a,b,c) w[idx]=c,e[idx]=b,ne[idx]=h[a],h[a]=idx++;
using namespace std;
typedef pair<int,int> PII;
typedef pair<long long,long long>PLL;
typedef pair<int,PII> PIII;
typedef long long LL;
typedef double dob;
const int N=1e6+10;
int n;
int num1,num2;
vector<int>ans;
void fangshu()
{
while(num2--)ans.pb(2);
while(num1--)ans.pb(1);
}
signed main()
{
quick_cin();
cin>>n;
rep2(i,1,n)
{
int x;
cin>>x;
if(x==1)num1++;
else num2++;
}
if(num1&&num2)
{
ans.pb(2);
ans.pb(1);
num2--;
num1--;
fangshu();
}
else
{
if(num1>=3)
{
rep2(i,1,3)ans.pb(1);
num1-=3;
fangshu();
}
else fangshu();
}
// cout<<num1<<" "<<num2<<" "<<ans.size();
rep1(i,0,n)cout<<ans[i]<<" ";
return 0;
}