A.
题意:给一个有向图,n个点,m条边,每条边是又向有颜色的,问你如何涂色,可以使有向图中不会出现同颜色的整环
思路:首先我们先把从小点到大点的边涂成一种颜色,大点到小点再涂成另一种颜色,这样就不会导致我们涂色出问题了,然后再去找图中有没有存在环,不存在环就可以全涂一种颜色了。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<vector>
#include<algorithm>
#include<map>
using namespace std;
#define PB push_back
#define LL long long
#define FI first
#define SE second
#define POP pop_back()
#define PII pair<int,int>
#define endl '\n'
#define ls x<<1
#define rs x<<1|1
#define m(x) a[x].l+a[x].r>>1
#define ST cin>>n;for(int i=1;i<=n;i++)scanf("%d",&a[i]);
#define debug cout<<"FUCK"<<endl;
const int N=5007,mod=998244353;
int n,m;
PII a[N];
vector<int>v[N];
bool f[N];
int d[N];
int main()
{
cin>>n>>m;
int flag=0;
for(int i=1;i<=m;i++){
scanf("%d%d",&a[i].FI,&a[i].SE);
v[a[i].FI].PB(a[i].SE);
d[a[i].SE]++;
}
for(int i=1;i<=n;i++){
int mn=0;
for(int j=1;j<=n;j++){
if(d[j]==0&&f[j]==0) mn=j;
}
f[mn]=1;
if(mn==0){
flag=1;break;
}
for(int j=0;j<v[mn].size();j++){
d[v[mn][j]]--;
}
}
if(flag==0){
cout<<1<<endl;
for(int i=1;i<=m;i++){
printf("1 ");
}
}
else
{
cout<<2<<endl;
for(int i=1;i<=m;i++){
if(a[i].FI<a[i].SE)printf("1 ");
else printf("2 ");
}
}
return 0;
}
D
题意:给你一个字符串,问你有多少个好子字符串,好字符串(r-l+1)=十进制(sl——sr)
思路:其实把每一个1找到向后枚举,不满足之后也肯定不满足了,满足就ans++,
#include<bits/stdc++.h>
#define maxl 300010
using namespace std;
int n,m;
int a[maxl];
char s[maxl];
long long ans;
int main()
{
int t=1;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
scanf("%s",s+1);
n=strlen(s+1);
int last=0,x,l;ans=0;
for(int i=1;i<=n;i++)
if(s[i]=='1')
{
x=0;
for(int j=i;j<=n && j<=i+30;j++)
{
x=x*2+s[j]-'0';
l=j-x+1;
if(l<=last)
break;
ans++;
}
last=i;
}
printf("%lld\n",ans);
}
return 0;
}
H.
题意:给n个数,还有个整数k,每次操作可以把一个数除以2,问你多少次操作之后可以得到k个相同的数。
思路:把每个数单独拿出来,把他一直除,除过之后的数如果满足k个就取最小值,然后num x也加一,cnt也加上操作数,最后把所有的都找完了,最后的最小值就是答案了。
#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxx=2e5+100;
int cnt[maxx];
int num[maxx];
int a[maxx];
int n,k;
int main()
{
scanf("%d%d",&n,&k);
memset(cnt,0,sizeof(cnt));
memset(num,0,sizeof(num));
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
num[a[i]]++;
}
sort(a+1,a+1+n);
int ans=inf;
for(int i=1;i<=n;i++)
{
int x=a[i];
int cnt1=0;
while(x)
{
if(num[x]>=k) ans=min(ans,cnt[x]);
x>>=1;
cnt1++;
num[x]++;
cnt[x]+=cnt1;
}
}
cout<<ans<<endl;
}