L - Median
看题解又是二分又是传递闭包Floyd啥的 ,但我感觉bfs就能做,最后也做出来了(但细节还是看的题解,,我这个fw),我把它看成了一个类似图的题,每次输入u和v就好比输入了一条从u到v的有向边,然后就可以建一个图;再回到题意,中位数是第(n+1)/2大的数,那么如果一个数x是中位数,那么比x大或比x小的数一定不能大于等于(n+1)/2;好了,条件有了,比x大或小的数也好统计,就是一个点的入度(有几个数大于x)和出度(有几个数小于x);然后在注意一下不符合题意的条件就可以了,比如 1 1或 1 2 2 1;
(1条消息) 2019ACM山东省赛L题 Median/ZOJ 4124(传递闭包)__wjunjie的博客-CSDN博客
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int inf=0x3f3f3f3f;
ll t,n,m,in[110],out[110];
bool vis[110],flag;
char c[110];
vector<ll>v[110];
void bfs(ll now){
queue<ll>q;
ll ans=0;
q.push(now);
for(int i=1;i<=n;i++) vis[i]=0;
vis[now]=1;
while(!q.empty()){
ll u=q.front();q.pop();
for(int i=0;i<v[u].size();i++){
ll j=v[u][i];
if(j==now){flag=0;break;}//注意可能有 a[1]>a[2],a[2]>a[1]的情况
if(!vis[j]){
q.push(j);
vis[j]=1;
in[j]++;
out[now]++;
}
}
if(!flag) break;
}
}
int main(){
// freopen("in.txt","r",stdin);
scanf("%lld",&t);
while(t--){
for(int i=1;i<=n;i++) v[i].clear();
for(int i=1;i<=n;i++) in[i]=out[i]=0;
flag=1;
scanf("%lld%lld",&n,&m);
for(int i=1;i<=m;i++){
ll u,w;
scanf("%lld%lld",&u,&w);
v[u].push_back(w);
if(u==w) flag=0;
}
for(int i=1;i<=n;i++) c[i]='0';
for(int i=1;i<=n;i++) bfs(i);
if(!flag){
for(int i=1;i<=n;i++) printf("0");
printf("\n");
continue;
}
for(int i=1;i<=n;i++)
if(out[i]<(n+1)/2&&in[i]<(n+1)/2) printf("1");else printf("0");
printf("\n");
}
return 0;
}
H - Tokens on the Segments 贪心 优先队列
这个题一开始还挺接近,但越想越歪,我这个fw,只要按照l为第一关键字,r为第二关键字升序排序(因为这样从前往后标记就行,从后往前好像也可以,比较好理解吧),然后放进优先队列里,我们先定义一个变量le为0,记录最小没被标记的点,如果队头的线段左端点大于le,说明可以标记,小于等于的话那我们就让这个左端点坐标加1,若l>r了就不要这个线段了(意思就是看看这条线段从左端点到右端点还有没有可以标记的点,没有就不要这个线段了),最后统计一下符合条件的个数就可以了
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int inf=0x3f3f3f3f;
ll t,n;
struct seg{
ll l,r;
bool operator<(const seg &a)const{
if(a.l==l) return a.r<r;
return a.l<l;
}
}a[100005];
int main(){
// freopen("in.txt","r",stdin);
scanf("%lld",&t);
while(t--){
scanf("%lld",&n);
priority_queue<seg>q;
for(int i=1;i<=n;i++){
scanf("%lld%lld",&a[i].l,&a[i].r);
q.push(a[i]);
}
ll ans=0,le=0;
while(!q.empty()){
//cout<<q.top().l<<" "<<q.top().r<<endl;
if(le<q.top().l){
ans++;le=q.top().l;
q.pop();
}
else if(q.top().l<q.top().r){
seg tmp=q.top();q.pop();
tmp.l++;
q.push(tmp);
}
else q.pop();
}
printf("%lld\n",ans);
}
return 0;
}